有两种方法:
第一种方法:
在resource.h中定义按钮的ID: #define IDC_MYBUTTON 1010
在对话框的.h文件中声明一个Button指针CButton *m_pButton;
在构造函数中: m_pButton=NULL;
在析构函数中:
if (m_pButton != NULL)
{
delete m_pButton;
m_pButton = NULL;
}
生成按钮:可以在OnInitDialog()中
m_pButton =new CButton;
m_pButton->Create(_T("Button Title"),
WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,
CRect (0,0,100,24),
this,IDC_MYBUTTON );
映射消息:
在.h文件中声明:
afx_msg void OnMyButton();
在对话框.cpp文件中:
BEGIN_MESSAGE_MAP(CDlgTestDlg, CDialog)
ON_BN_CLICKED(IDC_MYBUTTON,OnMyButton)
END_MESSAGE_MAP()
void CDlgTestDlg::OnMyButton()
{
MessageBox("This is a test!");
}
第二种方法:
1)在窗体初始化时动态创建按钮:
CButton * Mybutton = new CButton;
Mybutton->Create(_T("我的按钮"), BS_CENTER | WS_CHILD | WS_VISIBLE, CRect(0,0,200,30), AfxGetApp()->m_pMainWnd, 0);
2)在DefWindowProc消息中截获按钮的消息,这样做的目的是,不仅仅为此按钮创建了消息处理的时机,更重要的是将来所有其它动态控件等都可以这此进行细致的处理;
LRESULT CmmsgDlg::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
switch(message)
{
case WM_COMMAND:
{
DWORD nID = LOWORD(wParam);
DWORD nEv = HIWORD(wParam);
switch(nID)
{
case 0:
{
switch(nEv)
{
case BN_CLICKED://BN_CLICKED 二次消息
{
AfxMessageBox("Create Button is Cilcked.");
}
break;
//case BN_XXXX; 此控件的其它消息
}
}
}
//case other:
}
break;
}
return CDialog::DefWindowProc(message, wParam, lParam);
}
附:
WM_COMMAND
wNotifyCode = HIWORD(wParam); // notification code
wID = LOWORD(wParam); // item, control, or accelerator identifier
hwndCtl = (HWND) lParam; // handle of control