Отключить Изменение Размера Окна Win32


Как отключить изменение размера, перетащив край окна?

Вот мой код создания окна

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
}
7 16

7 ответов:

Стиль WS_OVERLAPPEDWINDOW включает в себя стиль WS_THICKFRAME, который, я думаю, отвечает за изменение размера вашего окна.

Рассмотрим что-то вроде

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

Вы можете использовать WS_OVERLAPPEDWINDOW ^ WS_THICKFRAME

XOR сохранит все в WS_OVERLAPPEDWINDOW, кроме WS_THICKFRAME

Вы можете попробовать что-то вроде этого:

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

Он только отключает изменение размера, перетаскивая край окна. Кстати, WS_SIZEBOX - это то же самое, что WS_THICKFRAME из-за

#define WS_SIZEBOX WS_THICKFRAME

Измените стиль окна с WS_OVERLAPPEDWINDOW на, скажем, WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX. Другими словами, это наложенное окно минус thickframe (изменяемая граница) и maxbox.

Если вы используете WS_OVERLAPPED | WS_MINIMIZEBOX | WS_SYSMENU, он отключает как максимизацию, так и изменение размера.

Обработайте сообщение WM_SIZING и отмените все попытки изменить прямоугольник окна.

Это работает для меня, но вместо использования

WS_OVERLAPPEDWINDOW & ~WS_THICKFRAME

Использовать только

WS_OVERLAPPEDWINDOW