Fenstergröße bereits aus WM_CREATE lesen ?



  • Laut MSDN beeinhaltet lParam von WM_CREATE einen Zeiger auf eine CREATESTRUCT-Struktur, die wiederum ihrerseits einige Informationen über das Fenster enthält. Nun wollte ich an Hand dieses Parameters die Fensterbreite bzw. die Breite des Anwendungsbereiches in eine Variable einlesen:

    #include <windows.h>
    #define WINAPP "WinApp"
    
    LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);
    
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
    {
    	HWND hwnd;
    	MSG msg;
    	WNDCLASS wndclass;
    
    	wndclass.style         = CS_HREDRAW | CS_VREDRAW;
    	wndclass.lpfnWndProc   = WndProc;
    	wndclass.cbClsExtra    = 0;
    	wndclass.cbWndExtra    = 0;
    	wndclass.hInstance     = hInstance;
    	wndclass.hIcon         = LoadIcon(NULL, IDI_APPLICATION);
    	wndclass.hCursor       = LoadCursor(NULL, IDC_ARROW);
    	wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    	wndclass.lpszMenuName  = NULL;
    	wndclass.lpszClassName = WINAPP;
    
    	if(!RegisterClass(&wndclass))
    	    return 0;
    
    	hwnd = CreateWindow(WINAPP,                       // wndclass
    		        WINAPP,                               // title
                    WS_OVERLAPPEDWINDOW,                  // style
    				CW_USEDEFAULT,                        // x-pos
                    CW_USEDEFAULT,                        // y-pos
    				CW_USEDEFAULT,                        // width
    				CW_USEDEFAULT,                        // height
    				NULL,                                 
    				NULL,                                 // menu
    				hInstance,                            // ID
    				NULL);                                // additional parameters
    
    	ShowWindow(hwnd, iCmdShow);
    	UpdateWindow(hwnd);
    
    	while(GetMessage(&msg, NULL, 0, 0))
    	{
    		TranslateMessage(&msg);
    		DispatchMessage(&msg);
    	}
    
    	return msg.wParam;
    }
    
    LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    	HDC hdc;
    	PAINTSTRUCT ps;
    	static int cxClient;
    	char szBuffer[32];
    
    	switch(message)
    	{
    	case WM_CREATE:
    		cxClient = ((LPCREATESTRUCT)lParam)->cx;    // Zuweisung
    		return 0;
    
    	case WM_PAINT:
    		hdc = BeginPaint(hwnd, &ps);
    
    		TextOut(hdc, 100, 100, itoa(cxClient, szBuffer, 10), 31);
    
    		EndPaint(hwnd, &ps);
         	return 0;
    
    	case WM_DESTROY:
    		PostQuitMessage(0);
    		return 0;
    	}
    	return DefWindowProc(hwnd, message, wParam, lParam);
    }
    

    Nur leider entspricht die Ausgabe überhaupt nicht dem erwarteten Wert, denn da steht dann irgendeine Zahl -2147483648 oder so.

    Hat jemand eine Idee woran das liegen könnte? Also eine Zuweisung müsste auf jeden Fall stattfinden, denn ich hab auch schon probiert cxClient einfach mal mit 0 zu initialisieren, aber es wird trotzdem wieder o.g. Zahl ausgegeben.



  • Das rührt daher, weil du das CW_USEDEFAULT Makro bei der CreateWindow-Funktion benutzt. Das ist wie folgt definiert: #define CW_USEDEFAULT ((int)0x80000000)

    Ich würde an deiner Stelle in der WM_SIZE Nachricht "cxClient" die Breite des Fensters zuweisen. Außerdem wäre der Variablen-Name wndCX viel sinnvoler als cxClient, weil das kleine 'c' ohnehin für Client steht. (Ist aber nur eine persönliche Annahme...).



  • Wird die WM_SIZE-Nachricht auch direkt beim Programmstart zumindest einmal gesendet ?



  • Ich denke sie wird mindestens einmal gesendet, bevor überhaupt WM_CREATE gesendet wird.



  • Das kannst du mit einem Debugger natürlich besser überprüfen.



  • Nachprüfen



  • wie kann ich genau prüfen? (ich verwende MSVC++)



  • Überhaupt keine Erfahrung mit dem Debugger?

    Ich habs jetzt aber selber nachgeprüft: WM_SIZE kommt doch erst nach WM_CREATE. Entschuldige!



  • also ich brauchte den debugger bisher überhaupt nicht, deshalb hab ich auch keine erfahrung. aber wenn WM_SIZE erst nacht WM_CREATE kommt, dann gibts bei default-werten für die fenstergröße doch eigentlich keine möglichkeit, die fenstergröße bereits in WM_CREATE irgendwo einzulesen oder ?



  • Wenn du Default-Werte verwenden willst, kannst du in WM_CREATE mit GetClientRect die richtige Fensterbreite und Fensterhöhe ermitteln.


Anmelden zum Antworten