[Win窗口编程(3)] 寻找窗口过程函数的写法[TZZ]
1、打开VS2017帮助文档工具(Help 外狒芙梨Viewer),通过目录找到“Desktop app technologies > Desktop App User Inter熠硒勘唏face > Windows and Messages (Windows) > Window Procedures”下的“Using Window Procedures”主题。该主题中包含3个方面的内容:设计一个窗口过程(正是我们需要的)、关联窗口过程到窗口类中和子类化一个窗口。在“设计一个窗口过程”中,给出了一个窗口过程的典型结构。也就是说,我们写自己的窗口过程函数时,可以从这个典型结构进行修改。这个典型结构中,采用switch语句,每个case语句处理一种消息类型并返回该消息特定的返回值(Windows定义了很多窗口消息类别),至于未处理的消息,则调用DefWindowProc函数处理(如果不调用这个函数,直接return TRUE或者FALSE,会发生什么?);
![[Win窗口编程(3)] 寻找窗口过程函数的写法[TZZ]](https://exp-picture.cdn.bcebos.com/22c4fe36e29147e80520bfc6b603bbea3f865814.jpg)
3、在文章示例代码下的第3段中,指出“窗口过程中至少必须处理WM_PAINT消息以绘制窗口自身的外观,也可能根据需要处理鼠标和键盘消息。”,似乎上一章中写的那个程序就没处理WM_PAINT,但是看上去仍旧正常;
4、在文章示例代码下的第4段中,指出“程序中可以调用DefWindowProc函数处理其他不关心的消息,也可以将消息修改后再传给该函数”。这句话解释了为什么上述示例代码中的default后面调用的是DefWindowProc函数;
5、在文章示例代码下的第5段中指出了对话框的窗口过程与普通窗口的窗口过程的不同之处:对话框会收到替代WM_CREATE消息的WM_INITDIALOG消息,即对话框的窗口过程中不会收到WM_CREATE消息,只会收到WM_INITDIALOG消息,不过消息的作用是相同的。另外,在对话框窗口过程中,一定不要用DefDlgProc函数处理未处理的消息(这个区别请务必记住!);
6、接着向下看“关联窗口过程到窗口类中”的内容。其实就是将自定义的窗口过程函数的函数指针赋给窗口类WNDCLASS的lpfnWndProc成员。当这个窗口类被RegisterClass函数注册后,所有采用这个窗口类创建的窗口都将调用之前传入的同一个窗口过程,即这个窗口的处理是一样的。也许你会有一个疑问,用同一个窗口类创建的窗口,是否能够有各自的窗口过程函数呢?;
![[Win窗口编程(3)] 寻找窗口过程函数的写法[TZZ]](https://exp-picture.cdn.bcebos.com/d9e638334884cde307ecd05af07f860e7d754214.jpg)
![[Win窗口编程(3)] 寻找窗口过程函数的写法[TZZ]](https://exp-picture.cdn.bcebos.com/64a62a0f64781423e279f08aaac2bbd6e0d0b214.jpg)
8、文章第2段中给了一个提示,告诉我们,如果要写兼容32位和64位的程序,子类化窗口时应该用SetWindowLongPtr函数;
9、文章第3段给出了一个“如何子类化对话框中编辑框控竭惮蚕斗件的示例,其中实现了让编辑框能够接收到所有键盘消息(包括ENT呶蓟鹭毵ER和TAB键)的功能”。这个示例代码向我们演示了上述函数的具体用法,其中EditBoxProc对话框窗口过程中,对于未处理的消息,直接返回了FALSE,并没有调用DefDlgProc,与之前说的一致。至于GetDlgItem函数,那个就是根据控件ID获得控件的窗口句柄的,为的是得到编辑框的句柄(这段代码研究对话框时再用,现在先凭想象吧!);
10、至此,我想你已经大致明白了窗口过程的具体用法,下一章我们再返回去看看帮助文档中“Using Windows”的全部内容。Enjoy!