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.