zoukankan      html  css  js  c++  java
  • 在QWidget构造函数中调用winId()的问题

    今天遇到了下面这个帖子很类似的问题

    http://www.qtcn.org/bbs/read-htm-tid-47284.html

    自己创建了一个继承于QWidget的MyWidget类,在MyWidget的构造函数中给hWnd中赋值如下

    hWnd = (HWND)this->winId();

    在使用DirectDraw在上面绘图时,出现如下错误:clip_image001

    clip_image002

    单步调试时,hWnd的值为:

    clip_image003

    而如果在MyWidget中创建一个showWidget,再调用showWidget->winId()

    showWidget = new QWidget(this);

    hWnd = (HWND)showWidget->winId();

    单步调试时,hWnd的值为:

    clip_image004

    而这时候,通过DirectDraw在hWnd上绘图是正常的。

    进一步跟踪调试:在m_pWnd->GetClientRect(&rc);这句出了问题
    再看GetClientRect函数的定义

    _AFXWIN_INLINE void CWnd::GetClientRect(LPRECT lpRect) const

          { ASSERT(::IsWindow(m_hWnd)); ::GetClientRect(m_hWnd, lpRect); }

    显然是IsWindow(m_hWnd)函数出了问题。那I是IsWindow(m_hWnd)什么时候会失败呢?

    msdn上说

    http://msdn.microsoft.com/en-us/library/windows/desktop/ms633528(v=vs.85).aspx
    If the window handle does not identify an existing window, the return value is zero.
    进一步测试:在winId()后,立马调用IsWindow(hWnd),以确定当前widget是否有效

    hWnd = this->winId();

    int res;

    res = IsWindow(hWnd);

    而这个时候res的值为1,也就是说刚调用winId()后,hWnd的值是有效的。
    为什么在之后调用m_pWnd->GetClientRect(&rc);就不行了呢?
    不知道有没有哪位大虾也遇到了类似的问题?是不是继承的QWidget需要做些额外的设置?

    今天也遇到了这种问题,感觉是因为Widget在执行构造函数时,Widget本身还没有完全被创建出来,估计其ClientRect是0,但是窗口句柄已经有了。不过,在我调试当中,竟然发现一个很诡异的现象:在构造函数中Widget的winId是一个有效值,然后当我在MainWindow中调用setCentralWidget后,这个Widget的winId竟然变了!!!这是什么原因???

    建议:对于在Widget中显示图形图像时,最好先将Widget初始化完毕,布好局,一切都妥妥的了后,再根据其winId进行图形图像的显示操作。

  • 相关阅读:
    cookie 保存信息 例子
    win7 远程桌面 不用域账户登录
    jfreechart demo 源代码 下载
    PostgreSQL学习手册(数据表)
    apache tomcat 伪静态 struts2 伪静态
    List methods
    DX 骨骼动画
    如何成为一名优秀的程序员?
    程序员改编游戏向女友求婚
    引用 病毒是怎么命名的?教你认识病毒命名规则
  • 原文地址:https://www.cnblogs.com/pulas/p/2586723.html
Copyright © 2011-2022 走看看