我一直使用以下代码,在Windows中实现比率调整大小:
case WM_SIZING:
{
//
// Implements ratio resize.
//
if (window->is_internal_flag_set(Window::kWindowHasAspectRatio))
{
RECT * rect = (RECT *)lparam;
double ratio = window->get_window_aspect_ratio();
int adjusted_h;
switch (wparam)
{
case WMSZ_BOTTOMRIGHT:
case WMSZ_BOTTOMLEFT:
case WMSZ_RIGHT:
case WMSZ_LEFT:
{
adjusted_h = (int)((double)window->m_frame_rect.width() / ratio);
rect->bottom = rect->top + adjusted_h + window->m_diff_y;
return 0;
}
case WMSZ_TOPLEFT:
case WMSZ_TOPRIGHT:
{
adjusted_h = (int)((double)window->m_frame_rect.width() / ratio);
rect->top = rect->bottom - adjusted_h - window->m_diff_y;
return 0;
}
case WMSZ_TOP:
case WMSZ_BOTTOM:
{
int adjusted_w = (int)((double)window->m_frame_rect.height() * ratio);
rect->right = rect->left + adjusted_w + window->m_diff_x;
return 0;
}
}
}
return 0;
}
此代码在Windows XP和Windows 7中也能很好地运行。
我无法在Windows 8.x上尝试这个,但现在我在Windows Server 2012上,这根本不起作用。
Windows Server 2012使用正确的WM_SIZING
消息调用窗口的调度程序函数,但它只是忽略了我通过lparam
“给出”的矩形。
然而,一些奇怪的宽高比确实会发生,例如当我仅从底部调整窗口大小时,当我释放鼠标时Windows将设置一种宽高比,但是完全错误。
这段代码有什么问题?为什么我只在Windows Server 2012上遇到问题?
注意:为了简洁起见,我省略了你在那里看到的Window
类的代码。无论如何,理解代码非常简单。