【发布时间】:2013-10-07 00:20:48
【问题描述】:
我有一个窗口,我想将边框实现为调整边框大小,就像任何其他窗口一样。接受 cmets 和答案的建议,我重写了我的代码。对于 WM_GETMINMAXINFO 我有:
MINMAXINFO *min_max = reinterpret_cast<MINMAXINFO *>(lparam);
min_max->ptMinTrackSize.x = MINX;
min_max->ptMinTrackSize.y = MINY;
MINX 和 MINY 是我希望窗口的最小尺寸。对于 WM_NCHITTEST,我有:
RECT wnd_rect;
int x, y;
GetWindowRect (window, &wnd_rect);
x = GET_X_LPARAM (lparam) - wnd_rect.left;
y = GET_Y_LPARAM (lparam) - wnd_rect.top;
if (x >= BORDERWIDTH && x <= wnd_rect.right - wnd_rect.left - >BORDERWIDTH && y >= BORDERWIDTH && y <= TITLEBARWIDTH)
return HTCAPTION;
else if (x < BORDERWIDTH && y < BORDERWIDTH)
return HTTOPLEFT;
else if (x > wnd_rect.right - wnd_rect.left - BORDERWIDTH && y < BORDERWIDTH)
return HTTOPRIGHT;
else if (x > wnd_rect.right - wnd_rect.left - BORDERWIDTH && y > wnd_rect.bottom - wnd_rect.top - BORDERWIDTH)
return HTBOTTOMRIGHT;
else if (x < BORDERWIDTH && y > wnd_rect.bottom - wnd_rect.top - BORDERWIDTH)
return HTBOTTOMLEFT;
else if (x < BORDERWIDTH)
return HTLEFT;
else if (y < BORDERWIDTH)
return HTTOP;
else if (x > wnd_rect.right - wnd_rect.left - BORDERWIDTH)
return HTRIGHT;
else if (y > wnd_rect.bottom - wnd_rect.top - BORDERWIDTH)
return HTBOTTOM;
return HTCLIENT;
变量是不言自明的。这段代码给了我一个边框,我可以拖动它来调整窗口大小。当我拖动右下角、底部和右边框时效果很好。对于其他边框,当我尝试拖动它们时,窗口的右下角似乎仍然来回移动。它类似于在 Google Chrome 或 Visual Studio 2012 中看到的具有相同边框集,但我在 Windows 资源管理器中看不到。
当我调整顶部或左侧边框的大小时,有没有办法让右下角不来回“摆动”,就像在 Windows 资源管理器中一样?
【问题讨论】:
-
你有什么理由自己实现而不是让系统为你做这件事?
-
如果您处理
WM_NCHITTEST消息并在适当的时候返回HTTOPLEFT,您仍然可以利用操作系统提供的窗口大小调整。 -
您可能需要处理 WM_NCCALCSIZE 消息。调整顶部边框大小时,DefWindowProc 会为该消息返回什么?
-
当 wParam 为 TRUE 时,Yoy 可以尝试为 WM_NCCALCSIZE 返回 WVR_REDRAW。如果闪烁过多,您可以返回 WVR_VALIDRECTS(如果 wParam 为 TRUE),但您必须更新 NCCALCSIZE_PARAMS 结构,这可能很棘手,具体取决于窗口的内容。简而言之(如果您返回 WVR_VALIDRECTS):不要保留底部和/或右对齐的内容(边框)。
-
当“左上角”调整弹出窗口的大小时(通过 DefWindowProc),有两种类型的闪烁。首先,在窗口“内部”闪烁,这是由右下对齐像素(边框)的“bitblit”引起的。 WM_NCCALCSIZE 和 WVR_VALIDRECTS 应该解决这个问题。其次,由 DefWindowProc/Windows7 引起的闪烁首先将窗口向左上方移动,然后再调整窗口大小:右下角的边框似乎“蠕动”。在 Windows XP 上不会发生这种情况!我(也许)会尝试找到一个修复(通过不将 WM_NCLBUTTONDOWN 委托给 DefWindowProc,或者通过使用一些用于 Vista/7 (DWM) 的新 API)
标签: c++ windows winapi resize paint