VC窗口限制最小高度的问题解决总结

  前几天在修改公司的软件界面的时候,发现通过调整窗口矩形大小:

CRect rect;
rect.left   = 0;
rect.right = 400;
rect.top   = 0;
rect.bottom = 100;
childWnd.MoveWindow(&rect); 

  通过这种方式去将窗口的大小进行设置的时候,发现在对应的childWnd的OnSize方法里面,通过GetClientRect得到的高度是120,比100还要大;这个时候,首先想到的,是不是高度被限定最小只能是120;所以试了几个办法:

  1. 开始网络上查找是不是大小被限定了,查看当前类及父类有没有重写 WM_GETMINMAXINFO 这个消息函数 OnGetMinMaxInfo;发现并没有;
  2. 由于窗口的父类实现是在一个dll里,只有头文件,看不到源码,所以将父类换成另一个窗口类,结果发现还是固定高度;
  3. 开始搜索工程里面有没有设置高度为120的代码,代码中搜索120;结果没有找到;
  4. 继续查网络上的限制方式,看是不是被SetWindowPos方式将窗口大小改变了;

  在尝试了以上几种方式之后,发现仍然还是没有头绪,迟迟找不出问题,问了另外一个老同事是不是父类有限制,他也没能给个解答,只能继续自己摸索,但是当天这种查找方式已经进入了死胡同,当即决定先改别的问题,不能陷入里面去。

  经过了一两天处理和修改其他内容之后,在昨天下午忙完一个功能的修改之后,到4点半,开始对这个问题再进行研究,还是按照前面四个步骤,进行了一两次的再尝试,花了一个小时的时间,还是没什么头绪;这个时候忽然转念一想,既然WM_SIZE消息被触发了,那我再看一下在WM_SIZE前面有什么消息,可能前面的消息就是导致窗口大小被修改的原因。这么灵光一闪,马上使用Spy++软件,输入窗口句柄,查找到对应窗口,然后测试了一把,结果发现在WM_SIZE之前,还收到了一个 ON_WM_WINDOWPOSCHANGING 的消息,查看结构内容,发现发送消息的时候,高度是100,而消息完成的时候,高度变成了120! 兴奋,终于找到问题原因,查看顶层父类,果然发现这个消息函数被重载(之前换的父类跟当前父类是从同一个顶层父类继承而来,所以之前父类的替换并没有看出来)。

  于是乎,将当前窗口的类添加ON_WM_WINDOWPOSCHANGING的消息截获,并且重载消息函数 OnWindowPosChanging ,将该消息传给更上层的窗口进行处理,避开顶层父类的处理,修改编译运行,问题解决!

  总结一下:

  1. 开始时候问题的查找方向其实没有问题,步步排除;

  2. 对于VC界面的不熟悉造成没法及早发现问题;

  3. Spy++是个调试的好工具,对于消息的跟踪很有用;

原文地址:https://www.cnblogs.com/coldforce/p/5407064.html