[MFC控件入门(2)] 响应按钮控件的下拉通知[TZZ]
1、启动VS2017软件,创建一个名为“MFCControlDemo2”的MFC对话框程序项目;
![[MFC控件入门(2)] 响应按钮控件的下拉通知[TZZ]](https://exp-picture.cdn.bcebos.com/a13bbe10bc33ec38204c5d5a295f0c14c37b3c4c.jpg)
2、打开主对话框资源文件,删除其中默认添加的所有控件;
![[MFC控件入门(2)] 响应按钮控件的下拉通知[TZZ]](https://exp-picture.cdn.bcebos.com/4d3d2ab33c4133baf0b647c86a37c97623bc2f4c.jpg)
3、从工具栏面板中拖动一个按钮到对话框中,然后将其Caption属性设置为“下拉按钮”;
![[MFC控件入门(2)] 响应按钮控件的下拉通知[TZZ]](https://exp-picture.cdn.bcebos.com/04d7a614f4d0b503f825024bcc4ec28332bf204c.jpg)
4、通过“类向导”为新添加的“IDC_BUTTON1”按钮添加“BCN_DROPDOWN”消息的处理程序;
![[MFC控件入门(2)] 响应按钮控件的下拉通知[TZZ]](https://exp-picture.cdn.bcebos.com/a99a494afa32939c11009b075719ce2c5a1b154c.jpg)
5、点击“类向导”窗口中的“确定”按钮后,VS会自动打开“MFCControlDemo2Dlg.cpp”源文件,并跳转到最后添加的消息处理函数中。在该函数实现代码的第1行设置一个断点,然后点击“本地Windows调试器”调试运行程序;
![[MFC控件入门(2)] 响应按钮控件的下拉通知[TZZ]](https://exp-picture.cdn.bcebos.com/edd84743040148fe50b519de8fd149299b88024c.jpg)
6、程序启动之后,点击弹出对话框中的“下拉按钮”,发现响应函数中的断点并未断下。这个按钮没有发送“BCN_DROPDOWN”消息;
![[MFC控件入门(2)] 响应按钮控件的下拉通知[TZZ]](https://exp-picture.cdn.bcebos.com/de9bfa3b3b86022111a0d7e3d8bbf82065fb724c.jpg)
7、关闭对话框程序,结束调试。然后打开Help Viewer,在索引中搜索BCN_DROPDOWN。BCN_DROPDOWN消息说明的Remarks中,指出了按钮控件必须具有下拉按钮风格;
![[MFC控件入门(2)] 响应按钮控件的下拉通知[TZZ]](https://exp-picture.cdn.bcebos.com/586bfdefe0781431b14176d9dc6699cf0353624c.jpg)
8、打开一个新的页面,然后在索引中搜索“BS_”,接着点击结果列表中的任意一个按钮风格打开“Button Style”说明页面。在该页面中,按下“CTRL + F”并输入“drop-down”搜索所有具有该关键字的按钮风格。最终找到“BS_DEFSPLITBUTTON”和“BS_SPLITBUTTON”风格的说明中含有“drop-down”关键字;
![[MFC控件入门(2)] 响应按钮控件的下拉通知[TZZ]](https://exp-picture.cdn.bcebos.com/baab208630486143a8230c848febf6a75e0f534c.jpg)
9、回到VS2017中,向“MFCControlDemo2Dlg.cpp”文件中的“OnInitDialog”函数中添加“为IDC_BUTTON1按钮添加BS_DEFSPLITBUTTON风格”的代码。然后调试运行程序;
![[MFC控件入门(2)] 响应按钮控件的下拉通知[TZZ]](https://exp-picture.cdn.bcebos.com/49c5d3e34b2c56eeeb88c2bbf775e5f4fdf5404c.jpg)
10、程序启动后,会发现对话框中的按钮多了个向下的小箭头,点击这个箭头。程序会自动在之前设置的断点出暂停(在BCN_DROPDOWN响应函数中)。点击VS2017工具栏上的“继续”按钮继续运行程序,然后点击对话框上“关闭”按钮结束程序运行;
![[MFC控件入门(2)] 响应按钮控件的下拉通知[TZZ]](https://exp-picture.cdn.bcebos.com/64a62a0f64781423204e328baac2bbd6e0d0b24c.jpg)
![[MFC控件入门(2)] 响应按钮控件的下拉通知[TZZ]](https://exp-picture.cdn.bcebos.com/40d2d0e8b004541b7bf8b693869a310e1699a64c.jpg)
![[MFC控件入门(2)] 响应按钮控件的下拉通知[TZZ]](https://exp-picture.cdn.bcebos.com/6bbfdd14f1c595eef736f39227530688902c9a4c.jpg)
11、打开主对话框资源编辑页面,双击“下拉按钮”,为其添加“BN_CLICKED”消息处理程序,然后在响应函数中添加弹出消息框的代码。代码添加完毕后,可以调试运行程序,检测消息响应是否正常;
![[MFC控件入门(2)] 响应按钮控件的下拉通知[TZZ]](https://exp-picture.cdn.bcebos.com/994f412043715fdbf2d7fd8f468920c5270f8c4c.jpg)
![[MFC控件入门(2)] 响应按钮控件的下拉通知[TZZ]](https://exp-picture.cdn.bcebos.com/589f5b07880138701ab67e392d08a50f95fc834c.jpg)
12、通常下拉按钮中的下三角按钮被点击时,会弹出一个下拉菜单。为了快速实现此功能,可以向资源目录中添加一个菜单资源,然后添加一个主菜单项和三个子菜单项;
![[MFC控件入门(2)] 响应按钮控件的下拉通知[TZZ]](https://exp-picture.cdn.bcebos.com/8b3643dd884ce54af4d0a35aa3066b0193ddf74c.jpg)
![[MFC控件入门(2)] 响应按钮控件的下拉通知[TZZ]](https://exp-picture.cdn.bcebos.com/b7b28f87031c99c04a0ba533af2fa872951fed4c.jpg)
![[MFC控件入门(2)] 响应按钮控件的下拉通知[TZZ]](https://exp-picture.cdn.bcebos.com/7830e01d96d8181993d7e378876efbf203b3de4c.jpg)
13、添加完菜单资源后,打开“MFCControlDemo2Dlg.h”文件,向CMFCControlDemo2Dlg类中添加一个CMenu指针“_popupMenu”。然后切换到“MFCControlDemo2Dlg.cpp”文件的“OnInitDialog”函数中,为_popupMenu创建一个CMenu对象,并调用其LoadMenuW方法加载之前创建的菜单资源;
![[MFC控件入门(2)] 响应按钮控件的下拉通知[TZZ]](https://exp-picture.cdn.bcebos.com/739bc049610f8b5652f36add9ce951e10ff8d34c.jpg)
![[MFC控件入门(2)] 响应按钮控件的下拉通知[TZZ]](https://exp-picture.cdn.bcebos.com/d9a8d2d2bb6651598eb8549f8fe23ea23b42c74c.jpg)
14、跳转到“OnDropdownButton1”函数中,添加为IDC_BUTTON1按钮弹出菜单的代码。由于所有具有下拉风格的按钮都可以将同一个“BCN_DROPDOWN”消息响应函数设置为处理函数,因此,这里需要区分发送该消息的控件ID,令代码只响应我们期望的控件发出的消息。在Windows中,所有的弹出菜单均采用屏幕坐标系指定显示位置,因此,这里需要用按钮对象的ClientToScreen方法将按钮区域转换为屏幕坐标的矩形区域。另外,由于弹出菜单实际上就是一个菜单的子菜单,因此需要从_popupMenu中通过GetSubMenu方法获得子菜单对象,然后调用其TrackPopupMenu方法将子菜单显示出来。该方法的第1个参数,可以指定菜单的横向和纵向对齐方式,以及菜单弹出动画的方式;
![[MFC控件入门(2)] 响应按钮控件的下拉通知[TZZ]](https://exp-picture.cdn.bcebos.com/35fa07efa25f0c14da8396370d89a146b6b1384d.jpg)
15、右键单击解决方案列表中的项目名称,在弹出菜单中选择“类向导”打开“类向导窗口”。在“类向导窗口”中,为MFCControlDemo2Dlg类添加一个WM_DESTROY消息处理程序。然后在该处理程序中,delete掉_popupMenu指针对象;
![[MFC控件入门(2)] 响应按钮控件的下拉通知[TZZ]](https://exp-picture.cdn.bcebos.com/35f2224133bad3412785a582427622bc7cc52c4d.jpg)
![[MFC控件入门(2)] 响应按钮控件的下拉通知[TZZ]](https://exp-picture.cdn.bcebos.com/04d7a614f4d0b503f82a024bcc4ec28332bf204d.jpg)
![[MFC控件入门(2)] 响应按钮控件的下拉通知[TZZ]](https://exp-picture.cdn.bcebos.com/340e4eb8b43ea8db6db2be87189c2cf7deb2164d.jpg)
16、调试运行程序,在弹出的对话框中,点击按钮中的下三角按钮,一切正常情况下,按钮下方会弹出一个下拉菜单。而点击“下拉按钮”,会弹出之前设置的消息提示框;
![[MFC控件入门(2)] 响应按钮控件的下拉通知[TZZ]](https://exp-picture.cdn.bcebos.com/f59dbe39131fceec94212dc079c4ec9958430b4d.jpg)
![[MFC控件入门(2)] 响应按钮控件的下拉通知[TZZ]](https://exp-picture.cdn.bcebos.com/059057299a883913bc1da85b26bcbe2f46707c4d.jpg)
17、至此,为BCN_DROPDOWN消息添加处理函数以及为下拉按钮添加弹出菜单的方法介绍完毕。Enjoy!