【发布时间】:2011-08-03 03:09:03
【问题描述】:
我有一个DGRect::draw(HWND hwnd),它只是在hwnd 窗口句柄上绘制一个空白HBITMAP。
如果我从 main() 调用它,我工作得很好。如果从 QTcpServer Derived 的 DGRDPServer::DGRDPServer() 构造函数调用,它甚至可以正常工作。它也适用于DGRDPServer::listen(qint64 port)。 hwnd 在DGRDPServer 构造函数中传递。当我从DGRDPServer::incomingConnection(int socketDescriptor) 调用它时出现问题,我有hwnd 的qDebug()ed 值,它可以。是什么导致平局失败。 ??
这是我的DGRect::draw(HWND hwnd)代码
QByteArray ba;
HDC hdc = GetWindowDC(hwnd);
HBITMAP scrn = CreateCompatibleBitmap(hdc,/*width*/200,/*height*/200);
SetBitmapBits(scrn, /*size()*/200*200*4, ba.data());
BITMAP bm;
PAINTSTRUCT ps;
HDC whdc = BeginPaint(hwnd, &ps);
HDC hdcMem = CreateCompatibleDC(whdc);
HBITMAP hbmOld = (HBITMAP)SelectObject(hdcMem, scrn);
GetObject(scrn, sizeof(bm), &bm);
BitBlt(whdc, 0, 0, bm.bmWidth, bm.bmHeight, hdcMem, 0, 0, SRCCOPY);
SelectObject(hdcMem, hbmOld);
DeleteDC(hdcMem);
EndPaint(hwnd, &ps);
ShowWindow(hwnd, SW_SHOW);
UpdateWindow(hwnd);
更新
似乎hwnd 只能从主线程绘制。但是 UpdateWindow 调用来自不同的线程。看起来像DGRDPServer::incomingConnection(int socketDescriptor) 这样的函数是从不同的线程调用的。那么如何从不同的线程绘制hwnd 呢?
【问题讨论】:
-
所有接收 HWND 的函数都必须由创建窗口的线程创建。这些是规则。
标签: multithreading winapi qt sockets gdi