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