我们有一个对话框,对话上有一个编辑框和一个按钮,我们想实现这样一个功能:当用户把鼠标移到按钮上时,在编辑框中给用户提示,鼠标移开后恢复原来显示内容。有很多方法可以实现这个功能,我们现在使用按钮控件的 BCN_HOTITEMCHANGE 事件响应函数来实现它。
第一步:在对话框编辑器中编辑对话框,添加编辑框(IDC_EDIT)和按钮(IDOK)控件:
第二步:添加该对话框的类,右键点击对话框选择添加类即可。我这里是用基于对话框的工程,所以默认就有该类。最后在类视图中显示出该类,类名是随便取的:
第三步:打开该类的属性对话框,点击雷电状按钮添加 BCN_HOTITEMCHANGE 事件响应函数
选择 BCN_HOTITEMCHANGE 右边的下拉框,点击<Add> OnBnHotItemChangeOk
添加的响应函数应该如下:
- void C按钮控件的BCN_HOTITEMCHANGE消息响应函数Dlg::OnBnHotItemChangeOk(NMHDR *pNMHDR, LRESULT *pResult)
- {
- // This feature requires Internet Explorer 6 or greater.
- // The symbol _WIN32_IE must be >= 0x0600.
- LPNMBCHOTITEM pHotItem = reinterpret_cast<LPNMBCHOTITEM>(pNMHDR);
- // TODO: Add your control notification handler code here
- *pResult = 0;
- }
第四步:添加编辑框所对应的CString变量,右键单击该类选择添加成员变量
在打开的对话框中,如下填写:
可以在OnInitDialog函数中初始化它:
- BOOL C按钮控件的BCN_HOTITEMCHANGE消息响应函数Dlg::OnInitDialog()
- {
- CDialog::OnInitDialog();
- ……省略了其他自动生成的代码
- // TODO: 在此添加额外的初始化代码
- m_Edit = L"初始化";
- UpdateData(FALSE);
- return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
- }
第五步:在刚才的事件响应函数中添加代码,这里的pHotItem指向一个NMBCHOTITEM结构体,利用该结构体的成员dwFlags 可以判断鼠标是否在按钮上,MSDN是这样说明的:
dwFlags
-
HICF_ENTERING
- The mouse is entering the button. HICF_LEAVING
- The mouse is leaving the button.
- void C按钮控件的BCN_HOTITEMCHANGE消息响应函数Dlg::OnBnHotItemChangeOk(NMHDR *pNMHDR, LRESULT *pResult)
- {
- // This feature requires Internet Explorer 6 or greater.
- // The symbol _WIN32_IE must be >= 0x0600.
- LPNMBCHOTITEM pHotItem = reinterpret_cast<LPNMBCHOTITEM>(pNMHDR);
- // TODO: Add your control notification handler code here
- if( pHotItem->dwFlags & HICF_ENTERING )
- {
- CString temp = m_Edit;
- m_Edit = L"芝麻关门";
- UpdateData(FALSE);
- m_Edit = temp;
- }
- else
- {
- UpdateData(FALSE);
- }
- *pResult = 0;
- }
最后运行一下,看效果
鼠标移动到按钮上(注意此时按钮边框是黄色的):
离开按钮:
全文完