在QWidget构造函数中调用winId()的问题
今天遇到了下面这个帖子很类似的问题
http://www.qtcn.org/bbs/read-htm-tid-47284.html
“
自己创建了一个继承于QWidget的MyWidget类,在MyWidget的构造函数中给hWnd中赋值如下
hWnd = (HWND)this->winId();
单步调试时,hWnd的值为:
而如果在MyWidget中创建一个showWidget,再调用showWidget->winId()
showWidget = new QWidget(this);
hWnd = (HWND)showWidget->winId();
单步调试时,hWnd的值为:
而这时候,通过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进行图形图像的显示操作。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构