(一)、在頭文件中定義消息的值
例:#define WM_自定義名字 WM_USER+1.
(二)、在該頭文件中編寫該消息響應函數原型的聲明:
例:
//}}AFX_MSG
afx_msg void On自定義函數名(自定義形參);
DECLARE_MESSAGE_MAP()
注:定義消息函數可以不帶參數。
(三)、在該類源文件中添加消息映射
BEGIN_MESSAGE_MAP(CChatDlg, CDialog)
//{{AFX_MSG_MAP(CChatDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BTN_SEND, OnBtnSend)
//}}AFX_MSG_MAP
ON_MESSAGE(WM_名字,On函數名)
END_MESSAGE_MAP()
(四)、該消息響應函數
void C類名::On函數名(形參)
{
}
介紹函數:CButtonST類應用
void CButtonST::SetTooltipText(CString* spText, BOOL bActivate) //文字輸出
{
if (spText == NULL) return;
// Initialize ToolTip
InitToolTip();
// If there is no tooltip defined then add it
if (m_ToolTip.GetToolCount() == 0) // CToolTipCtrl m_ToolTip全局變量
{
CRect rectBtn;
GetClientRect(rectBtn);
m_ToolTip.AddTool(this, (LPCTSTR)*spText, rectBtn, 1);
}
// Set text for tooltip
m_ToolTip.UpdateTipText((LPCTSTR)*spText, this, 1);
m_ToolTip.Activate(bActivate);
} // End of SetTooltipText
void CButtonST::InitToolTip()
{
if (m_ToolTip.m_hWnd == NULL)
{
// Create ToolTip control
m_ToolTip.Create(this);
// Create inactive
m_ToolTip.Activate(FALSE);
}
} // End of InitToolTip
程序:
頭文件:
CButtonST m_btn; 定義一CButtonST 對象
CString strName;
源文件:
strName="輸入文字";
m_btn.SetTooltipText(&strName);
可以在OnInitDialog()函數中定義,也可以在其他函數中重新定義。
DDX_Control(pDX,IDC_BUTTON1,m_btn); //輸出,DoDataExchange(CDataExchange* pDX)函數中
介紹函數:
void AFXAPI DDX_Control( CDataExchange* pDX, int nIDC, CWnd& rControl );
參數一:指向CDataExchange的指針,用于建立資料交換設備上下文;
參數二:控件IDC;
參數三:控件變量。
重寫SetIcon()函數:
頭文件:
void SetIcon(int nIconInId, int nIconOutId = NULL); //帶參數的成員函數
源文件:
void CButtonST::SetIcon(int nIconInId, int nIconOutId)
{
HICON hIconIn; //定義HICON 變量,用于保存圖片
HICON hIconOut;
HINSTANCE hInstResource = AfxFindResourceHandle(MAKEINTRESOURCE(nIconInId), RT_GROUP_ICON);
//鼠標點擊時獲得應用資源句柄
hIconIn = (HICON)::LoadImage(hInstResource/*AfxGetApp()->m_hInstance*/, MAKEINTRESOURCE(nIconInId), IMAGE_ICON, 0, 0, 0);
// 鼠標移開時加載圖片
hIconOut = (nIconOutId == NULL) ? NULL : (HICON)::LoadImage(hInstResource/*AfxGetApp()->m_hInstance*/, MAKEINTRESOURCE(nIconOutId), IMAGE_ICON, 0, 0, 0);
SetIcon(hIconIn, hIconOut); //調用
}
void CButtonST::SetIcon(HICON hIconIn, HICON hIconOut)
{
// Note: the following two lines MUST be here! even if
// BoundChecker says they are unnecessary!
if (m_hIconIn != NULL) ::DestroyIcon(m_hIconIn); //判定是否與圖片相關聯
if (m_hIconOut != NULL) ::DestroyIcon(m_hIconOut);
// Set icon when the mouse is IN the button
m_hIconIn = hIconIn;
// Set icon when the mouse is OUT the button
m_hIconOut = (hIconOut == NULL) ? m_hIconIn : hIconOut;
ICONINFO ii; //ICONINFO 結構體
// Get icon dimension
ZeroMemory(&ii, sizeof(ICONINFO)); //ii內存設0
::GetIconInfo(m_hIconIn, &ii); //設置自定義圖標
m_cxIcon = (BYTE)(ii.xHotspot * 2);
m_cyIcon = (BYTE)(ii.yHotspot * 2);
::DeleteObject(ii.hbmMask);
::DeleteObject(ii.hbmColor);
RedrawWindow();
} // End of SetIcon
程序流程:
a)添加頭文件
CButton m_btn;定義一對象
b)在新建框架類中初始化
BOOL CMy5Dlg::OnInitDialog()
{
m_btn.SetIcon(IDI_ICON1,IDI_ICON2); //設置兩幅圖標
}
c)鼠標點擊交換圖片
void CMy5Dlg::DoDataExchange(CDataExchange* pDX)
{
DDX_Control(pDX,IDC_BUTTON1,m_btn);
}
#include <assert.h> //設定插入點
#include <ctype.h>//字符處理
#include <errno.h>//定義錯誤碼
#include <float.h>//浮點數處理
#include <fstream.h>//文件輸入/輸出
#include <iomanip.h>//參數化輸入/輸出
#include <iostream.h> //數據流輸入/輸出
#include <limits.h> //定義各種數據類型最值常量
#include <locale.h> //定義本地化函數
#include <math.h> //定義數學函數
#include <stdio.h> //定義輸入/輸出函數
#include <stdlib.h> //定義雜項函數及內存分配函數
#include <string.h> //字符串處理
#include <strstrea.h> //基于數組的輸入/輸出
#include <time.h> //定義關于時間的函數
#include <wchar.h> //寬字符處理及輸入/輸出
#include <wctype.h> //寬字符分類
標準 C++ (同上的不再注釋)
#include <algorithm> //STL 通用算法
#include <bitset> //STL 位集容器
#include <cctype>
#include <cerrno>
#include <clocale>
#include <cmath>
#include <complex> //復數類
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <deque> //STL 雙端隊列容器
#include <exception> //異常處理類
#include <fstream>
目的:為了使用戶定義的數據類型如同一般數據類型一樣使用。
功能:對對象進行初始化,有若干種方法。
特點:1、無返回值說明;2、不能繼承;3、可以有缺省參數;4、不能取地址,構造時自動給對象分配棧中內存,析構時回收;
5、自動調用構造函數。
構造函數是類的一個特殊成員函數,其函數名同類名一樣。C++通過構造函數可以正確地初始化對象。構造函數不能被顯式調用,不能使
虛函數。
例: class queue {
int q[100]; //默認為private
int sloc,rloc;
public:
queue();
void qput(int i);
};
queue ::queue () //隱式調用
{
sloc=rloc=0;
}
int queue ::qput (int i){}
main()
{
queue a,b;
a.qput (10);
b.qput (20);
}
參數化的構造函數:
queue ::queue (int vx,int vy){} };
main()
{
queue a(10,20);
}
缺省參數的構造函數:特殊情況下需要傳遞參數,一般都是用缺省參數。
單個參數:queue ::queue (int i=16) {} };
main()
{
queue a;
}
多個參數:queue ::queue (int vx=0,int vy=0) {}
缺省參數還可用于一般成員函數。使用時應注意避免二義性。
多構造函數:
public:
queue ( );
queue (int );
queue (int,char );
};
main()
{
queue a;
queue b(1);
queue c(1,'c'); //避免二義性
}
拷貝構造函數:
1、系統產生:
queue ::queue (int vx,int vy){} };
main() { queue a(b) ; }
2、自定義:
queue ::queue (const queue &p){} };
main() { queue }
總結:構造函數的作用是對對象本身做初始化工作,也就是給用戶提供初始化類中成員變量的一種方式。
如果一個類中沒有定義任何的構造函數,那C++編輯器將在某些情況下提供一個默認的構造函數(不帶參數),3種情況:
1)、類有虛擬成員函數或虛擬繼承父類(虛擬基類);
2)、類的基類有構造函數;
3)、類中的所有非靜態餓對象數據成員,它們所屬的類中有構造函數。
構造函數的目的是為了初始化對象,因此一個構造函數至少應該
使得對象處于明確定義的狀態。
例://class string
string () {s=new char[80];len=80;}
string (int n) {s=new char[n];len=n;}
}
string::stringprintf() { cout<< s <<endl;}
定義對象:
string x,y(80);
x.print();
y.print();
此時,x和y調用的print()函數結構未定義,因為在構造函數中只對字符數組分配了內存,卻未對分配的內存進行初始化。
我們可以通過修改帶默認參數值的構造函數來改進:
string (int n=80) {s=new char[n];s[0]='\0';len=n;}
用默認參數的形式來代替函數重載的形式。
注意點:
1)構造函數應該使對象處于明確定義的狀態;
2)保持物理狀態的一致性:對數據成員的定義保持一致,在所有函數中只能使用一種定義。
3)類不變性:可以將不變性作為程序代碼的注釋,//len=strlen(s);
4)動態內存的一致性:接口一致性
void assign (char* str) { strcpy(s,str);}
void concat (string& a) {s=new char[len+1];strcpy(s,a.s);}
兩函數的表現行為存在不一致性:前者內存不再分配,而后者一直在分配。我們應只使用一種以保持一致性。
5)內存泄露:concat函數中每拷貝一次,s就重新分配一次,s被新的指針值覆蓋,而前一指針值被拋棄,產生內存垃圾。
因此concat函數必須保證舊的數組一定要被刪除,對于每一個new,就必須有一個delete操作,且delete語句只能被增加在
新的字符串創建之后。
void concat (string& a) {new_s=new char[len+1];strcpy(s,a.s); delete[]s;s=new_s;}
const char*類型是指向常量的指針,不能修改其指向的內容,當可以修改其指向的地址。
例1:
char ch[5]="lisi"; //定義一字符串ch[],并賦值
const char* pStr=ch; //定義一常量指針pStr,將ch賦給pStr
注:ch[]定義時須對其進行賦值,字符長度為5,最后一位為"\0"表示結束。
在對pStr賦值時相當于將ch[]的首地址給pStr,因為const char*類型得指針變量只可以修改其本身的值,即變量保存的內存地址。
因此該變量的值可以改變,但其指向的地址的內容不能改變。
如:*pStr="jiliang"; //錯誤的,因為其直接改變了內容,所以無法將"jiliang"賦值給ch[];
pStr="jiliang"; //正確的,因為其改變的是地址值,即pStr保存的是="jiliang"的首地址。
我們無法通過pStr來修改其指向地址的內容,但可以通過ch[]來修改內容。
使用:利用指針類型來傳遞參數時,可以定義為const char*類型,保持內容的一致性。
char* const類型是一個指針常量,可以修改地址指向的內容,但不可以修改其地址值。
例2:
char ch[5]="lisi"; //定義一字符串ch[],并賦值
const char* pStr=ch; //定義一指針常量pStr,將ch賦給pStr
注:對于指針常量,必須在定義時對其賦值。指針常量表示指針本身是常量,即地址值為常量。
如:pStr="jiliang"; //錯誤的,因為該賦值將新的字符串地址賦值給指針常量,這是不允許的;
*pStr="jiliang";//正確的,可以對指針常量指向的地址修改其內容。
小結:
const char*類型的指針其指向的內容是常量,不能修改,但其地址值可以修改;
char* const類型的指針其地址值是常量,不能修改,但其指向的內容可以修改。
參考:<<VC++深入淺出>>孫鑫