C++ 禁用调整窗口大小 Win32

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/3275989/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-28 12:30:13  来源:igfitidea点击:

Disable Window Resizing Win32

c++winapiresize

提问by Chris

how do I disable resizing by dragging the edge of windows?

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

Here is my window creation code

这是我的窗口创建代码

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
}

回答by hermos

The WS_OVERLAPPEDWINDOWstyle includes the WS_THICKFRAMEstyle which, i think, is responslible for making your window resizeable.

WS_OVERLAPPEDWINDOW款式包括WS_THICKFRAME风格,我想,是responslible为使您的窗口调整大小。

Consider something like

考虑类似

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

回答by user3006930

You can use WS_OVERLAPPEDWINDOW ^ WS_THICKFRAME

您可以使用 WS_OVERLAPPEDWINDOW ^ WS_THICKFRAME

The XOR will keep everything in WS_OVERLAPPEDWINDOW except for WS_THICKFRAME

XOR 会将所有内容保留在 WS_OVERLAPPEDWINDOW 中,除了 WS_THICKFRAME

回答by Jingjing Zhong

You can try something like this:

你可以尝试这样的事情:

::SetWindowLong(hWnd, GWL_STYLE, GetWindowLong(hWnd, GWL_STYLE)&~WS_SIZEBOX);

It only disable resizing by dragging the edge of windows. By the way, WS_SIZEBOX is the same as WS_THICKFRAME because of

它只能通过拖动窗口边缘来禁用调整大小。顺便说一下,WS_SIZEBOX 和 WS_THICKFRAME 是一样的,因为

#define WS_SIZEBOX WS_THICKFRAME

回答by ciyo

If you use WS_OVERLAPPED | WS_MINIMIZEBOX | WS_SYSMENU, it disable both maximizing and resizing.

如果您使用WS_OVERLAPPED | WS_MINIMIZEBOX | WS_SYSMENU,它将禁用最大化和调整大小。

回答by Ben Dove

Change your window style from WS_OVERLAPPEDWINDOW to, say, WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX. In other words, it's overlappedwindow minus the thickframe (resizable border) and the maxbox.

将窗口样式从 WS_OVERLAPPEDWINDOW 更改为 WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX。换句话说,它是重叠窗口减去厚框(可调整大小的边框)和最大框。

回答by rlduffy

Process the WM_SIZING message and override all attempts to change the window's rectangle.

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

回答by SaulHP91

That works for me, but instead of using

这对我有用,但不是使用

WS_OVERLAPPEDWINDOW & ~WS_THICKFRAME

use only

只使用

WS_OVERLAPPEDWINDOW