1. 程式人生 > >MFC 動態建立按鈕及響應按鈕訊息

MFC 動態建立按鈕及響應按鈕訊息

1.動態建立按鈕

2.響應按鈕訊息

1.動態建立按鈕即是自已手動新增,由程式碼完成。這裡的動態更深一層次的理解是通過New來動態開闢一塊記憶體空間。

首先是宣告變數,再為該變數申請一塊記憶體空間這裡即是New;

CButton* myButton;

myButton = new CButton();

然後通過呼叫CButton類中的Create成員函式建立按鈕。

myButton->Create(_T("My button"), WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,CRect(100,300,220,350), this, 11119);

BOOL Create(LPCTSTR lpszCaption, DWORD dwStyle,
    const RECT& rect, CWnd* pParentWnd, UINT nID);

詳細解析Create函式:

lpszCaption:該按鈕控制元件顯示的文字。

dwStyle:按鈕控制元件的風格樣式。

rect:指定了該控制元件的大小及位置。它可以是一個CRect物件或者Rect的結構體。

pParentWnd:指定了該控制元件的父視窗,一般情況下是一個CDialog,該引數不能為空。

nID:該控制元件的標識,即ID。

返回值:如果成功則返回真,否則為0。

需要注意的是:

構造一個CButton物件需要兩步,首先是分配記憶體空間即成生一個物件,然後再呼叫Create函式生成一個視窗的按鈕控制元件。關於該控制元件的風格,一般WS_VISIBLE 是必要的。

對於一個Button控制元件的視窗樣式有:WS_CHILD,WS_VISIBLE ,WS_DISABLED ,WS_GROUP,WS_TABSTOP 

按鈕樣式有:BS_BITMAP, BS_ICON ,BS_LEFTTEXT ,BS_PUSHBOX ,BS_TEXT ,BS_USERBUTTON ,BS_RIGHTBUTTON 等

如:myButton[0].Create("button1",WS_CHILD|WS_VISIBLE|BS_LEFTTEXT  , CRect(50,50,130,75),this, 21111);
myButton[1].Create("button2",WS_CHILD|WS_VISIBLE|WS_GROUP| BS_AUTORADIOBUTTON, CRect(50,80,130,105), this, 21112);
myButton[2].Create("button3",WS_CHILD|WS_VISIBLE|BS_BITMAP, CRect(50,110,130,145),this, 21113);
myButton[3].Create("button4",WS_CHILD|WS_VISIBLE|BS_AUTOCHECKBOX, CRect(50,150,130,185),this, 21114);

2.響應按鈕訊息

這裡建立好的按鈕要想它起作用需要繫結訊息函式,響應按鈕訊息要幾個步驟:

步驟一:在當前類的BEGIN_MESSAGE_MAPEND_MESSAGE_MAP之間完成訊息的繫結,如:

BEGIN_MESSAGE_MAP(CMy20121102buttonDlg, CDialog)
//{{AFX_MSG_MAP(CMy20121102buttonDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
ON_BN_CLICKED(IDC_CHECK1, OnCheck1)
//}}AFX_MSG_MAP

ON_BN_CLICKED(21111, Onbutton1)
END_MESSAGE_MAP
()

一般放在AFX_MSG_MAP的外面,第一個引數是控制代碼,第二個引數是訊息函式的函式名。

步驟二:在該應用程式的自定義類中宣告訊息函式,如:

afx_msg voidOnbutton1();
afx_msg void OnButton12();
//}}AFX_MSG

DECLARE_MESSAGE_MAP()

步驟三:完成了整個訊息的對映,那麼剩下的就是寫這些訊息函數了,如:

void CMy20121102buttonDlg::Onbutton1()
{
AfxMessageBox("button1fka;sjd");
}

最後需要考慮的是資源的釋放問題,即:

if(myButton != NULL)

{delete[] myButton;

myButton = NULL;

}


疑問:建立了好多個動態按鈕,可能是1000個,那麼這些按鈕的訊息該如何響應?

以後要記得文件書寫的過程中及時儲存,不然造成的後果只有自已返工。