[MFC控件入门(1)] 响应Button控件的BN通知[TZZ]
1、启动VS2017软件,创建一个名为“MFCControlDemo1”的MFC对话框程序项目;
![[MFC控件入门(1)] 响应Button控件的BN通知[TZZ]](https://exp-picture.cdn.bcebos.com/1570c1b6326c5766eb2541e6a4632385e1366143.jpg)
2、打开主对话框资源文件,将对话框中的所有控件删除;
![[MFC控件入门(1)] 响应Button控件的BN通知[TZZ]](https://exp-picture.cdn.bcebos.com/2e223d85e036e2913f027055b2723d03baea5b43.jpg)
![[MFC控件入门(1)] 响应Button控件的BN通知[TZZ]](https://exp-picture.cdn.bcebos.com/baab208630486143573e0b848febf6a75e0f5343.jpg)
3、从工具箱中拖一个“Button控件”到对话框中,并修改其大小和位置。然后将其“Caption属性”修改为“响应鼠标左键单击”,并保持其ID不变(默认为IDC_BUTTON1);
![[MFC控件入门(1)] 响应Button控件的BN通知[TZZ]](https://exp-picture.cdn.bcebos.com/75af02324b18512c061b9b12ad334884cce34943.jpg)
4、打开“类向导窗口”,选择“命令选项卡”,在对象ID列表中选中“IDC_BUTTON1”,然后在消息列表中选择“BN_CLICKED”。选定消息类型后,点击“添加处理程序按钮”为“蚱澄堆别BN_CLICKED消息”在“CMFCControlDemo1Dlg类”中添加消息处理程序代码(选中哪个类,处理程序代码就会添加到哪个类中)。在弹出的“添加成员函数提示框”中,可以设置响应函数的名称,然后点击“确定按钮”确认添加代码。添加完处理代码后,点击“类向导窗口”中的“确定按钮”关闭向导窗口;
![[MFC控件入门(1)] 响应Button控件的BN通知[TZZ]](https://exp-picture.cdn.bcebos.com/57af657f860e7c75711ebf40650d3aceabd7bf43.jpg)
![[MFC控件入门(1)] 响应Button控件的BN通知[TZZ]](https://exp-picture.cdn.bcebos.com/354e7a781423beb9d6d4627730d6e1d06ce8b343.jpg)
![[MFC控件入门(1)] 响应Button控件的BN通知[TZZ]](https://exp-picture.cdn.bcebos.com/cfa9ae04541bd10f5ecc4e2fba0e1799e82aa743.jpg)
5、在新添加的响应函数中添加通过MessageBox方法弹出提示消息的代码。然后调试运行程序;
![[MFC控件入门(1)] 响应Button控件的BN通知[TZZ]](https://exp-picture.cdn.bcebos.com/430174fec314f1c5230402743c27ac5307889d43.jpg)
6、程序启动后,在弹出的对话框窗口中,点击“响应鼠标左键单击”按钮。正常情况下,程序会弹出一个“响应鼠标左键单击事件”的提示框。点击提示框上的“确定”按钮,然后关闭主对话框结束程序运行(注:点击按钮后,按钮会处于聚焦状态);
![[MFC控件入门(1)] 响应Button控件的BN通知[TZZ]](https://exp-picture.cdn.bcebos.com/dda98e4800fc77f759e41c95c8715fdb37209043.jpg)
![[MFC控件入门(1)] 响应Button控件的BN通知[TZZ]](https://exp-picture.cdn.bcebos.com/2184380f8835dd8a953406b203013870d4418743.jpg)
7、切换到对话框资源编辑界面,继续从工具栏中拖动一个“Button”控件到对话框中,然后调整其大小和位置并将其“Caption”属性修改为“响应鼠标左键双击”;
![[MFC控件入门(1)] 响应Button控件的BN通知[TZZ]](https://exp-picture.cdn.bcebos.com/95bd4e8c9bcec7f8529d1e68034ce54a2e27fb43.jpg)
8、通过类向导,为“响应鼠标左键双击”按钮的“BN_DOUBLECLICKED”消息添加处理程序;
![[MFC控件入门(1)] 响应Button控件的BN通知[TZZ]](https://exp-picture.cdn.bcebos.com/939c2d40b6f39187e7f6da7524fce186252fef43.jpg)
![[MFC控件入门(1)] 响应Button控件的BN通知[TZZ]](https://exp-picture.cdn.bcebos.com/955ea0e434daf05ea4c93ac4751d96d81919e543.jpg)
![[MFC控件入门(1)] 响应Button控件的BN通知[TZZ]](https://exp-picture.cdn.bcebos.com/6061b9cd0c6efbf2f5593662127bbbf4db58da43.jpg)
9、向“响应鼠标左键双击”按钮的双击事件处理函数中添加弹出提示框的代码,然后调试运行程序;
![[MFC控件入门(1)] 响应Button控件的BN通知[TZZ]](https://exp-picture.cdn.bcebos.com/604e9556ad042e681502125485f85856d43dd143.jpg)
10、程序运行后,在弹出的对话框中,双击“响应鼠标左键双击”按钮。结果,无论怎么点都没有反应。只好关闭对话框退出调试;
![[MFC控件入门(1)] 响应Button控件的BN通知[TZZ]](https://exp-picture.cdn.bcebos.com/d9a8d2d2bb66515989ab539f8fe23ea23b42c743.jpg)
11、通过MSDN查看“BN_DOUBLECLICKED”消蝌怦吩曰息的说明文档。文档中说,只有BS_USERBUTTON(用户按钮风格)、BS_RADIOBUTTON(单选按钮风格)、BS_OWNERDRAW(自绘按钮风格)和BS_NOTIFY(通知风格)的按钮在被双击时才会收到BN_DOUBLECLICKED通知;
![[MFC控件入门(1)] 响应Button控件的BN通知[TZZ]](https://exp-picture.cdn.bcebos.com/a151a233ec3834bb0f04e1ea8714c27bd3823d40.jpg)
12、继续在文档中查看“BS_NOTIFY”的说明。文档中说,只有具有“BS_NOTIFY”风格的按钮才会发送“BN_KILLFOCUS”和“BN_SETFOCUS”通知给它的父窗口;
![[MFC控件入门(1)] 响应Button控件的BN通知[TZZ]](https://exp-picture.cdn.bcebos.com/a007a9b1eef97fbd6c977706b74133bad2413340.jpg)
13、回到VS2017的对话框资源编辑界面中,选中“响应鼠标左键双击”按钮,将其“Owner Draw”属性修改为“True”,启用按钮的自绘风格。然后调试运行程序;
![[MFC控件入门(1)] 响应Button控件的BN通知[TZZ]](https://exp-picture.cdn.bcebos.com/c8373cbc7dc5cf6700b496f38e96b814f5d02640.jpg)
14、程序运行后,双击对话框中“响应鼠标左键单击”按钮的下方。正常情况下,会弹出“鼠标左键双击事件”的提示框。由于“响应鼠标左键双击”按钮具有自绘风格,因此系统就不再绘制其外观了,同时代码中也没有绘制此按钮的外观,这里就显示为空了;
![[MFC控件入门(1)] 响应Button控件的BN通知[TZZ]](https://exp-picture.cdn.bcebos.com/c3c22dbf3bef354f6853f78b23db574afb321b40.jpg)
15、结束程序调试返回到对话框资源编辑界面中,从工具栏中拖动两个按钮到对话框中,然后分别将它们的Caption属性设置为“按钮获得焦点”和“按钮失去焦点”;
![[MFC控件入门(1)] 响应Button控件的BN通知[TZZ]](https://exp-picture.cdn.bcebos.com/5a5a00def4dca03955f48d5958d96975f3c40d40.jpg)
16、通过“类向导”分别为新添加的两个按钮添加“BN_SETFOCUS”消息和“BN_KILLFOCUS”消息的处理程序;
![[MFC控件入门(1)] 响应Button控件的BN通知[TZZ]](https://exp-picture.cdn.bcebos.com/059057299a883913bd0eaf5b26bcbe2f46707c40.jpg)
![[MFC控件入门(1)] 响应Button控件的BN通知[TZZ]](https://exp-picture.cdn.bcebos.com/3ac71c214f5793563250bb95effb960b30217040.jpg)
![[MFC控件入门(1)] 响应Button控件的BN通知[TZZ]](https://exp-picture.cdn.bcebos.com/e2aefe781431dfb6428714d312cf02532e636340.jpg)
17、切换到“MFCControlDemo1Dlg.cpp”源文件中,分别为新添加的两个处理函数添加弹出提示框的代码,然后调试运行程序;
![[MFC控件入门(1)] 响应Button控件的BN通知[TZZ]](https://exp-picture.cdn.bcebos.com/3fc72e486143d7d4c9da475e7da75f0f832b5040.jpg)
18、程序运行后,来回点击对话框中的“按钮获得焦点”按钮和“按钮失去焦点”按钮或者点击TAB键在按钮之间切换焦点。结果,始终没有弹出获取/失去焦点的消息框;
![[MFC控件入门(1)] 响应Button控件的BN通知[TZZ]](https://exp-picture.cdn.bcebos.com/506d92f1d8a72633c56f8e56c02c56ee7a7f4440.jpg)
19、结束程序调试,回到源代码页面中。在OnInitDialog函数中,通过GetDlgItem方法获得“按钮获得焦点”按钮的对象指蛤靴狡珂针,然后在该指针上调用ModifyStyle方法为该按钮添加“BS_NOTIFY”风格。写完代码后,编译解决方案,确认代码编写正确(注:IDC_BUTTON3是正确的,需要修改并保存一次resource.h文件才会被正确识别);
![[MFC控件入门(1)] 响应Button控件的BN通知[TZZ]](https://exp-picture.cdn.bcebos.com/fdb4f00d3aceaad7eb804f57eee7340f6578b840.jpg)
20、再次调试运行程序。在弹出的对话框中,点击“按钮获得焦点”按钮,由于它被点击后会获得焦点,因此,会弹出“按钮获得焦点”的提示框。每次点击提示框中的“确定”按钮或者“关闭”按钮时,“按钮获得焦点”会失去焦点。而当提示框关闭后,该按钮又会获得焦点,因此,这个对话框又会弹出。解决这个问题,可以直接通过VS2017停止调试,或者玩命点击提示框中的“关闭”按钮,利用消息响应间隔,点中提示框后面的对话框,让对话框获得焦点,然后关闭对话框结束调试;
![[MFC控件入门(1)] 响应Button控件的BN通知[TZZ]](https://exp-picture.cdn.bcebos.com/2083a5d6e1d06de83f8ac590ca93cee8b104ac40.jpg)
![[MFC控件入门(1)] 响应Button控件的BN通知[TZZ]](https://exp-picture.cdn.bcebos.com/d04eec260d9a310eb872aa9f31b842406bfea240.jpg)
21、回到OnInitDialog函数中,继续添加代码为“IDC_BUTTON4”按钮添加“BS_NOTIFY”风格。然后调试运行程序;
![[MFC控件入门(1)] 响应Button控件的BN通知[TZZ]](https://exp-picture.cdn.bcebos.com/b666b2530688912c19219f5d1b4800fc76f79740.jpg)
22、在弹出的对话框中,点击“按钮失去焦点”按钮,然后点击一下主对话框。紧接着会弹出“按钮失去焦点”的提示框;
![[MFC控件入门(1)] 响应Button控件的BN通知[TZZ]](https://exp-picture.cdn.bcebos.com/3761a73acd8920c5efe4cb80568a59de44078840.jpg)
![[MFC控件入门(1)] 响应Button控件的BN通知[TZZ]](https://exp-picture.cdn.bcebos.com/3bcdb808a50f94fc8567d87b4cf88a775cddfc40.jpg)
23、再次打开“类向导”,选中任意一个按钮ID,在消息列表中还有5个消息。在之后的章节中我再逐个介绍。Enjoy!
![[MFC控件入门(1)] 响应Button控件的BN通知[TZZ]](https://exp-picture.cdn.bcebos.com/2947750192dd33405418d232881c99c0aefcf140.jpg)