2010-07-18 4 views
16

Wie deaktiviere ich die Größenanpassung durch Ziehen der Fensterkante?Fenstergröße deaktivieren Win32

Hier ist mein Fenster Erstellungscode

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 
} 

Antwort

46

Der WS_OVERLAPPEDWINDOW Stil beinhaltet die WS_THICKFRAME Stil, der, wie ich glaube, responslible ist Ihr Fenster resizeable zu machen.

Betrachten wir so etwas wie

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

jedoch 'AdjustWindowRectEx' korrekt zu arbeiten scheint nicht, wenn' WS_THICKFRAME' nicht Teil des Stils. –

+1

Ich bin mir nicht sicher, warum dieser hier als Antwort markiert ist, da er bei mir nicht funktioniert hat (Windows 10). Die andere Antwort funktionierte mit der folgenden Codezeile wie ein Zauber: ':: SetWindowLong (hWnd, GWL_STYLE, GetWindowLong (hWnd, GWL_STYLE) & ~ WS_SIZEBOX);' – YePhIcK

+1

@YePhIcK Nun, ich gab diese Antwort vor fast 7 Jahren, habe es auf NT 5.1 - 6.1 versucht, wo es gut überlegt hat, wie die Frage von OP gestellt wurde. Ich habe es nie in neueren Versionen versucht und ich arbeite seither nicht mehr an Windows, daher besteht eine gute Chance, dass sich einige Bits inzwischen verändert haben. – thatsdisgusting

4

Ändern Sie Ihre Fenster Stil von WS_OVERLAPPEDWINDOW zu, sagen wir, WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX. Mit anderen Worten, es überlappt das Fenster minus dem dicken Rahmen (größenveränderbarer Rahmen) und der maxbox.

0

Verarbeiten Sie die Meldung WM_SIZING und überschreiben Sie alle Versuche, das Rechteck des Fensters zu ändern.

-2

Das funktioniert für mich, aber statt

WS_OVERLAPPEDWINDOW & ~WS_THICKFRAME 

Verwendung nur

WS_OVERLAPPEDWINDOW 
+0

Das ändert die Größenänderung nicht. Folgen Sie der Antwort von @thatsdisgusting, um die Größenänderung zu deaktivieren. Verwende 'WS_OPERLAPPEDWINDOW^WS_THICKFRAME'. –

17

verwenden, können Sie WS_OVERLAPPEDWINDOW^WS_THICKFRAME verwenden

Die XOR alles in WS_OVERLAPPEDWINDOW Ausnahme WS_THICKFRAME halten

+0

Dies verhindert nicht die Maximierung. –

3

Wenn Sie WS_OVERLAPPED | WS_MINIMIZEBOX | WS_SYSMENU verwenden, di es Sable sowohl Maximierung und Größenanpassung.

11

Sie können so etwas wie dies versuchen:

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

Es deaktivieren nur durch Ziehen der Kante des Fensters Größe ändern. By the way, ist WS_SIZEBOX die gleiche wie WS_THICKFRAME wegen

#define WS_SIZEBOX WS_THICKFRAME