如何让动态创建的按钮响应鼠标双击?
利用按钮的BS_PUSHBUTTON风格,具有该风格的按钮被单击时会发出WM_COMMAND消息,他的响应原理和用类向导定义的函数一样。只不过它的响应函数原形,消息映射以及函数实现需要你自己手动写进去
例如:
首先建一个AppWizard的工程Button,然后给CButtonDlg添加一个成员变量m_btn
如:CButton m_btn;
因为按钮是显示在对话框上的,所以我们可以在OnInitDialog()中动态创建按钮。因为创建按钮需要ID,所以在需要在Resource.h中定义一个ID
如:#define IDC_BUTTON_CREATE 1002
在OnInitDialog()中创建按钮的代码如下:
m_btn.Create("PushButton",BS_PUSHBUTTON |WS_CHILD|WS_VISIBLE|WS_TABSTOP,
CRect(0,0,100,50),this,IDC_BUTTON_CREATE);
按钮创建后,运行后按钮即会显示在对话框上。
下面为动态创建的按钮添加消息映射:
如:在ButtonDlg.h中,添加函数原形:
afx_msg void OnButtonCreate();
然后在ButtonDlg.cpp中添加消息映射:
ON_BN_CLICKED(IDC_BUTTON_CREATE,OnButtonCreate)
最后添加上函数的函数体即可
如:
void CButtonDlg::OnButtonCreate()
{
// TODO: Add your control notification handler code here
MessageBox("OnCreateButton!");
}
但是如何让动态创建的按钮响应鼠标双击呢?如果按照上面的方法,添加响应鼠标双击的函数会发现按钮不会响应鼠标双击!
我们利用对话框模版,在其上放一个按钮控件。然后利用类向导添加响应鼠标双击的函数,运行后双击按钮结果也没反应!但是如果我们把它的属性中STYLE项的Notify这项选上,运行后双击按钮就会响应。
因此我们断定,动态创建的按钮加上Notify风格BS_NOTIFY。我们可以在创建按钮时加上此风格也可以利用CWnd函数ModifyStyle()进行修改
如方法1 :
m_btn.Create("PushButton",BS_PUSHBUTTON |WS_CHILD|WS_VISIBLE|WS_TABSTOP|BS_NOTIFY,
CRect(0,0,100,50),this,IDC_BUTTON_CREATE);
方法2:
m_btn.ModifyStyle(0,BS_NOTIFY);
修改后,按照上述方法添加消息处理函数即可!
如果是其它控件比如Edit,要让Edit响应一般的通告消息只要在子类中添加响应得消息映射即可
虽然自空件将通告消息首先发送给父窗口,但父窗口并不会先处理而是将其反射回子控件,让子控件处理,如果子控件处理了则消息路由结束否则交给父窗口处理