在SetWindowPos()之后没有重新绘制WinAPI客户端区域

时间:2016-02-22 15:43:08

标签: winapi resize redraw

我正在尝试使用以下代码调整另一个应用程序(ipoker客户端窗口)的窗口大小:

SetWindowPos(hwnd, HWND_NOTOPMOST, x, y, width, height, SWP_ASYNCWINDOWPOS | SWP_NOACTIVATE | SWP_NOOWNERZORDER | SWP_NOZORDER);

现在这会正确调整窗口的大小,但客户区域没有重新绘制(意味着它只是剪裁以适应新的窗口区域)。它应该是这样的: how the window looks properly 但这就是它的实际外观:client area is just being clipped

所以我已经检查了窗口在用Spy ++调整鼠标(工作正常)时收到的消息,并尝试使用SendMessage(..)将所有这些消息发送到窗口,但也没有任何运气。

WINDOWPOS wpos;
wpos.hwnd = hWnd;
wpos.x = x;
wpos.y = y;
wpos.cx = nWidth;
wpos.cy = nHeight;
wpos.flags = SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOMOVE | 1000;

NCCALCSIZE_PARAMS params;
params.lppos = &wpos;
params.rgrc[0] = { x, y, width, height};
params.rgrc[1] = rcWindow; // rect of the window before resize
params.rgrc[2] = rcClient; // rect of the client before resize

SendMessage(hWnd, WM_WINDOWPOSCHANGED, 0, LPARAM(&wpos));

wpos.flags = SWP_NOZORDER | SWP_NOACTIVATE;
SendMessage(hwnd, WM_SIZE, SIZE_RESTORED, MAKELPARAM(nWidth, nHeight));
SendMessage(hwnd, WM_WINDOWPOSCHANGING, 0, LPARAM(&wpos));

wpos.flags = SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOMOVE | 1800;
SendMessage(hwnd, WM_NCCALCSIZE, WPARAM(TRUE), LPARAM(&params));

你知道为什么所有这些都不起作用吗?是否没有办法对窗口进行子类化(我没有任何经验...)?我也尝试使用placemint(一个窗口定位工具)调整窗口大小,但事实证明它有同样的问题。强制它重绘的唯一方法是手动调整大小。

0 个答案:

没有答案