禁用Win32窗口大小调整

28

如何禁用通过拖动窗口边缘进行调整大小?

这是我的窗口创建代码:

bool CreateGLWindow(char* title, int width, int height)
{
GLuint      PixelFormat;            // Holds The Results After Searching For A Match
WNDCLASS    wc;                     // Windows Class Structure
DWORD       dwExStyle;              // Window Extended Style
DWORD       dwStyle;                // Window Style
RECT        WindowRect;             // Grabs Rectangle Upper Left / Lower Right Values
WindowRect.left=(long)0;            // Set Left Value To 0
WindowRect.right=(long)width;       // Set Right Value To Requested Width
WindowRect.top=(long)0;             // Set Top Value To 0
WindowRect.bottom=(long)height;     // Set Bottom Value To Requested Height

hInstance           = GetModuleHandle(NULL);                // Grab An Instance For Our Window
wc.style            = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;   // Redraw On Size, And Own DC For Window.
wc.lpfnWndProc      = (WNDPROC) WndProc;                    // WndProc Handles Messages
wc.cbClsExtra       = 0;                                    // No Extra Window Data
wc.cbWndExtra       = 0;                                    // No Extra Window Data
wc.hInstance        = hInstance;                            // Set The Instance
wc.hIcon            = LoadIcon(NULL, IDI_WINLOGO);          // Load The Default Icon
wc.hCursor          = LoadCursor(NULL, IDC_ARROW);          // Load The Arrow Pointer
wc.hbrBackground    = NULL;                                 // No Background Required For GL
wc.lpszMenuName     = NULL;                                 // We Don't Want A Menu
wc.lpszClassName    = "OpenGL";                             // Set The Class Name

if (!RegisterClass(&wc))                                    // Attempt To Register The Window Class
{
    MessageBox(NULL,"Failed To Register The Window Class.","ERROR",MB_OK|MB_ICONEXCLAMATION);
    return false;                                           // Return FALSE
}

dwExStyle=WS_EX_APPWINDOW | WS_EX_WINDOWEDGE;           // Window Extended Style
dwStyle=WS_OVERLAPPEDWINDOW;                            // Windows Style

AdjustWindowRectEx(&WindowRect, dwStyle, FALSE, dwExStyle);     // Adjust Window To True Requested Size

// Create The Window
if (!(hWnd=CreateWindowEx(  dwExStyle,                          // Extended Style For The Window
                            "OpenGL",                           // Class Name
                            title,                              // Window Title
                            dwStyle |                           // Defined Window Style
                            WS_CLIPSIBLINGS |                   // Required Window Style
                            WS_CLIPCHILDREN,                    // Required Window Style
                            0, 0,                               // Window Position
                            WindowRect.right-WindowRect.left,   // Calculate Window Width
                            WindowRect.bottom-WindowRect.top,   // Calculate Window Height
                            NULL,                               // No Parent Window
                            NULL,                               // No Menu
                            hInstance,                          // Instance
                            NULL)))                             // Dont Pass Anything To WM_CREATE
{
    KillGLWindow();                             // Reset The Display
    MessageBox(NULL,"Window Creation Error.","ERROR",MB_OK|MB_ICONEXCLAMATION);
    return false;                               // Return FALSE
}

static  PIXELFORMATDESCRIPTOR pfd=              // pfd Tells Windows How We Want Things To Be
{
    sizeof(PIXELFORMATDESCRIPTOR),              // Size Of This Pixel Format Descriptor
    1,                                          // Version Number
    PFD_DRAW_TO_WINDOW |                        // Format Must Support Window
    PFD_SUPPORT_OPENGL |                        // Format Must Support OpenGL
    PFD_DOUBLEBUFFER,                           // Must Support Double Buffering
    PFD_TYPE_RGBA,                              // Request An RGBA Format
    24,                                     // Select Our Color Depth
    0, 0, 0, 0, 0, 0,                           // Color Bits Ignored
    0,                                          // No Alpha Buffer
    0,                                          // Shift Bit Ignored
    0,                                          // No Accumulation Buffer
    0, 0, 0, 0,                                 // Accumulation Bits Ignored
    24,                                         // 24Bit Z-Buffer (Depth Buffer)  
    0,                                          // No Stencil Buffer
    0,                                          // No Auxiliary Buffer
    PFD_MAIN_PLANE,                             // Main Drawing Layer
    0,                                          // Reserved
    0, 0, 0                                     // Layer Masks Ignored
};

if (!(hDC=GetDC(hWnd)))                         // Did We Get A Device Context?
{
    KillGLWindow();                             // Reset The Display
    MessageBox(NULL,"Can't Create A GL Device Context.","ERROR",MB_OK|MB_ICONEXCLAMATION);
    return false;                               // Return FALSE
}

if (!(PixelFormat=ChoosePixelFormat(hDC,&pfd))) // Did Windows Find A Matching Pixel Format?
{
    KillGLWindow();                             // Reset The Display
    MessageBox(NULL,"Can't Find A Suitable PixelFormat.","ERROR",MB_OK|MB_ICONEXCLAMATION);
    return false;                               // Return FALSE
}

if(!SetPixelFormat(hDC,PixelFormat,&pfd))       // Are We Able To Set The Pixel Format?
{
    KillGLWindow();                             // Reset The Display
    MessageBox(NULL,"Can't Set The PixelFormat.","ERROR",MB_OK|MB_ICONEXCLAMATION);
    return false;                               // Return FALSE
}

if (!(hRC=wglCreateContext(hDC)))               // Are We Able To Get A Rendering Context?
{
    KillGLWindow();                             // Reset The Display
    MessageBox(NULL,"Can't Create A GL Rendering Context.","ERROR",MB_OK|MB_ICONEXCLAMATION);
    return false;                               // Return FALSE
}

if(!wglMakeCurrent(hDC,hRC))                    // Try To Activate The Rendering Context
{
    KillGLWindow();                             // Reset The Display
    MessageBox(NULL,"Can't Activate The GL Rendering Context.","ERROR",MB_OK|MB_ICONEXCLAMATION);
    return false;                               // Return FALSE
}

ShowWindow(hWnd,SW_SHOW);                       // Show The Window
SetForegroundWindow(hWnd);                      // Slightly Higher Priority
SetFocus(hWnd);                                 // Sets Keyboard Focus To The Window
reshape(width, height);                 // Set Up Our Perspective GL Screen

init();

return true;                                    // Success
}
9个回答

66

WS_OVERLAPPEDWINDOW风格包含WS_THICKFRAME风格,我认为它使窗口可调整大小。

考虑类似于:

dwStyle=(WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | WS_MAXIMIZEBOX);

然而,如果WS_THICKFRAME不是样式的一部分,AdjustWindowRectEx似乎无法正常工作。 - Emilian Cioca
2
不确定为什么这个被标记为答案,因为它在我的Windows 10上没有起作用。另一个答案却非常好用,使用以下代码行:::SetWindowLong(hWnd, GWL_STYLE, GetWindowLong(hWnd, GWL_STYLE)&~WS_SIZEBOX); - YePhIcK
1
@YePhIcK 嗯,我在将近7年前给出了这个答案,在NT 5.1 - 6.1上尝试过,并且在考虑到OP的问题提出方式时运行良好。从那以后我从未在更新的版本上尝试过,并且我也不再使用Windows,因此有很大的可能性某些部分已经发生了变化。 - hermos
@YePhlck 我不确定这个答案和你建议的有什么区别。你似乎只是在创建窗口后删除了大小调整能力,而不是一开始就没有创建带有那种样式的窗口。 - user13947194
1
当省略WS_MAXIMIZEBOX(win11)时,它可以正常工作。 - Wolfgang Schulz

29
您可以使用WS_OVERLAPPEDWINDOW ^ WS_THICKFRAME。
按位异或运算符将保留WS_OVERLAPPEDWINDOW中的所有内容,但不包括WS_THICKFRAME。

3
这并不妨碍最大化。 - 3Dave
2
@3Dave为了防止最大化和窗口调整大小,我在WS_OVERLAPPEDWINDOW风格中使用了以下代码:WS_OVERLAPPEDWINDOW&〜WS_MAXIMIZEBOX&〜WS_THICKFRAME(并非此答案中的解决方案)。 - HackerDaGreat57

17
您可以尝试类似以下的方法:
::SetWindowLong(hWnd, GWL_STYLE, GetWindowLong(hWnd, GWL_STYLE)&~WS_SIZEBOX);

它只能禁用通过拖动窗口边缘进行调整大小的功能。 顺便说一下,WS_SIZEBOX与WS_THICKFRAME是相同的,因为

#define WS_SIZEBOX WS_THICKFRAME

17
如果您使用WS_OVERLAPPED | WS_MINIMIZEBOX | WS_SYSMENU,那么它会禁用最大化和调整大小功能。

9

将窗口风格从WS_OVERLAPPEDWINDOW更改为WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX。换句话说,它是overlappedwindow减去thickframe(可调整大小的边框)和maxbox。


0

处理WM_SIZING消息并覆盖所有尝试更改窗口矩形的操作。


但是Windows会尝试调整大小,这样看起来就很奇怪,带有调整大小的光标。 - micheal007

0
对于MFC, 进入属性 > 边框,设置为“对话框框架” 这对我有用,因为之前的边框设置为“调整大小”。

看起来这篇文章是关于纯Win32 API的。 - HackerDaGreat57

0

您也可以尝试删除 WS_OVERLAPPEDWINDOW 并替换为 WS_MINIMIZEBOX|WS_SYSMENUL


这就是我想表达的意思。 - Ammishaddai Boakye

-2

这对我来说可行,但是不要使用

WS_OVERLAPPEDWINDOW & ~WS_THICKFRAME

仅使用

WS_OVERLAPPEDWINDOW

那并没有禁用调整大小。要禁用调整大小,请按照@thatsdisgusting的答案使用WS_OPERLAPPEDWINDOW ^ WS_THICKFRAME - Daniel Kvist
@DanielKvist 那是谁? - sergiol

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接