限制WINAPI中的调整大小方向

时间:2013-11-11 16:17:27

标签: c++ c winapi resize

我需要通过WMSZ_BOTTOM禁用所有调整大小,包括禁用相应的鼠标图标。

处理WM_GETMINMAXINFO没有帮助,因为在调整窗口矩形(在WM_CREATE内)之前调用它,所以我没有任何内容可以设置。我尝试复制当前矩形并将其设置在WM_SIZINGlParam,但是没有完美的点可以为该副本调用GetWindowRect(),因为有时当我移动窗口然后调整大小时它通过拖动非预期的一侧,它跳到前一个位置(旧的矩形恢复)。这些看起来像黑客而不是一些聪明的方法。

当鼠标悬停在除底部以外的窗口边框上时,如何禁用调整鼠标图标的大小?

3 个答案:

答案 0 :(得分:4)

@ manuell的另一种方法,它不需要你自己检查鼠标位置:

case WM_NCHITTEST:
    {
        LRESULT lRes = DefWindowProc(hWnd, uMsg, wParam, lParam);
        if (lRes == HTBOTTOMLEFT || lRes == HTBOTTOMRIGHT
        ||  lRes == HTTOPLEFT || lRes == HTTOPRIGHT || lRes == HTTOP
        ||  lRes == HTLEFT || lRes == HTRIGHT || lRes == HTSIZE)
            lRes = HTBORDER; // block resizing for all but HTBOTTOM

        return lRes;
    }

答案 1 :(得分:0)

对于“当鼠标悬停在除底部以外的窗口边框上时如何禁用调整鼠标图标的大小?”问题:处理WM_NCHITTEST消息。

光标的鼠标坐标位于lParam中,与屏幕有关。

#include <windowsx.h>

case WM_NCHITTEST: {
    int iMouseX = GET_X_LPARAM( lParam );
    int iMouseY = GET_Y_LPARAM( lParam );
    RECT rect;
    GetWindowRect( hWnd, &rect );
    int xPos = iMouseX - rect.left; 
    int yPos = iMouseY - rect.top;
    // here, check where the mouse is
    // return DefWindowProc for default processing
    // return HTBORDER for "no sizing border" if mouse is over border

答案 2 :(得分:-1)

处理WM_SIZING消息。

这允许您将大小限制为您想要的任何内容。这包括启用最大或最小宽度,某些宽高比或其他任何内容。

在您的情况下,您的最大和最小宽度彼此相同(即,宽度是固定的)。