[Win窗口编程(3)] 寻找窗口过程函数的写法[TZZ]

 时间:2024-10-22 08:43:48

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]

2、继续向下看文档。它指出WM_NCCREATE是在窗口创建之后发送,如果程序响应了拉悟有仍该消息(即窗口过程中用cas髫潋啜缅e语句处理了该消息)并返回FALSE,那么CreateWindowEx函数会调用失败。WM_CREATE消息则是在窗口已经创建完毕后发送(慢慢熟悉消息的发送时机)。WM_DESTROY消息是窗口即将销毁时发送,因此在响应该消息的代码中仍旧可以访问被销毁的窗口。DestroyWindow函数会负责销毁目标窗口的所有子窗口。WM_NCDESTROY消息会在窗口被销毁之前发送。注意,文档中并没有说明白WM_CREATE和WM_NCCREATE,WM_DESTROY和WM_NCDESTROY消息的先后次序,需要自己动手测试确认;

[Win窗口编程(3)] 寻找窗口过程函数的写法[TZZ]

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]

7、接着向下看“子类化窗口”的内容。第1段中,指出“可以调用SetWindowLong函数子类化一个窗口(文档中的“window”应该指的是“窗口类”)的实例。调用该函数时需要传入目标窗口的句柄,GWL_WNDPROC标记和一个子类化的窗口过程函数的指针。同时,该函数会返回输入窗口中原始的窗口过程函数的指针且只能用CallWindowProc函数调用这个原始的窗口过程函数”。通过这一段,可以确定窗口子类化就是微软提供的为任一窗口设置处理函数的方法;

[Win窗口编程(3)] 寻找窗口过程函数的写法[TZZ]
[Win窗口编程(3)] 寻找窗口过程函数的写法[TZZ]

8、文章第2段中给了一个提示,告诉我们,如果要写兼容32位和64位的程序,子类化窗口时应该用SetWindowLongPtr函数;

9、文章第3段给出了一个“如何子类化对话框中编辑框控竭惮蚕斗件的示例,其中实现了让编辑框能够接收到所有键盘消息(包括ENT呶蓟鹭毵ER和TAB键)的功能”。这个示例代码向我们演示了上述函数的具体用法,其中EditBoxProc对话框窗口过程中,对于未处理的消息,直接返回了FALSE,并没有调用DefDlgProc,与之前说的一致。至于GetDlgItem函数,那个就是根据控件ID获得控件的窗口句柄的,为的是得到编辑框的句柄(这段代码研究对话框时再用,现在先凭想象吧!);

10、至此,我想你已经大致明白了窗口过程的具体用法,下一章我们再返回去看看帮助文档中“Using Windows”的全部内容。Enjoy!

  • 格式工厂如何将视频转换为MP4格式
  • Premiere如何配置素材箱
  • PR如何新建一个简单序列
  • pr怎么降低某一段音量
  • 如何用Adobe Premiere Pro CC2015进行影片预览
  • 热门搜索
    关于珍爱生命的手抄报 讲究卫生手抄报 讲普通话手抄报内容 创建文明城手抄报 小学英语手抄报大全 法制教育的手抄报 安全手抄报的内容 关于英语手抄报 关于三爱三节的手抄报 校园文化手抄报