zoukankan      html  css  js  c++  java
  • 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++是个调试的好工具,对于消息的跟踪很有用;

  • 相关阅读:
    server.Execute 执行子请求时出错
    mybatis逆向工程
    上传及下载github项目
    基于tess4j的图片文字提取
    myeclipse中更改默认jdk版本出错( Target is not a JDK root. System library was not found)
    SSM整合环境搭建demo
    AMD CPU环境下使用android studio,eclipse的Genymotion插件
    Android Studio电脑不支持HAXM的解决办法
    完整使用JDBC访问数据库
    springMVC保存数据到mysql数据库中文乱码问题解决方法
  • 原文地址:https://www.cnblogs.com/coldforce/p/5407064.html
Copyright © 2011-2022 走看看