对话框的OnSize()和OnWindowPosChanged()的理解

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/ximi19881011/article/details/24937505

最近的项目是一个对话框的项目,之前没有做过这种项目,对OnSize和OnWindowPosChanged是没有深入地去学习过。自己对这一个知识还是一知半解。下面是一些实验的结果:

实验是一个对话框的工程,下面是一些执行的过程。

 

创建窗口时

OnSize()-OnInitDialog()  OnWindowPosChanged() * 2;

 

第一次的onsize的大小是资源的大小(有边框的情况,这个大小是客户区的大小,没有边框的时候,是整个大小),一般不是我们想要的大小,一般是movewindow后的位置和大小才是我们想要的大小,后面执行的两次onwindowposchanged的位置和大小才是对话框正确的大小。

 

点击窗口获取焦点时

OnWindowPosChanged(),位置就算是原位也会触发一次。

 

拖动窗口时,

OnWindowPosChanged() 执行多次,无法统计。OnSize()不执行。

 

最小化时,最大化时,恢复正常时。

OnSize()*1->OnWindowPosChanged()*1

 

这里分两种情况,如果在OnWindowPosChanged不执行父类的的函数,就不会执行一次onsize()。

因为MSDN解析:OnWindowPosChanged缺省实现给窗口发送WM_SIZEWM_MOVE。如果应用程序在处理OnWindowPosChanged调用时没有调用它的基类,则不发送这些消息。在OnWindowPosChanged调用中不调用它的基类版来完成一定或修改尺寸的处理将是更加有效的。

如果执行父类的函数,就会执行一次Onsize()。

 

Movewindow

OnSize()*1->OnWindowPosChanged()*1

 

如果在初始化里面movewindow(),在OnWindowPosChanged()里获得的大小是移动后的大小,位置还是系统默认的位置大小可以改变,可是位置坐标还是系统决定的位置,初始化完毕再执行movewindow(),才能真正移动位置和大小。

 

关闭时,

OnWindowPosChanged() * 1

看起来好像是执行了两次,可是第一次是获得焦点执行的,实际上只执行了一次

ShowWindow(SW_SHOW)ShowWindow(SW_HIDE)同理

 

ShowWindow(SW_SHOW)

触发onwindowposchange()1

 

ShowWindow(SW_HIDE);

触发onwindowposchange()1

 

 

 

展开阅读全文

没有更多推荐了,返回首页