Programm startet, aber zeigt keinen Anwendungsbereich an
-
Habe folgendes Listing aus dem Petzold abgeschrieben, aber irgendwo hab ich nen
kleinen Fehler eingebaut, das Programm startet, aber es zeigt kein Fenster an/* sysmets2.c - Ermittlung der Maße des System Version 2 */ #include <windows.h> #include "sysmets.h" #define UNICODE LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain ( HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow ) { static TCHAR AppName[] = TEXT ("SystemMetrics2"); 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 = AppName; if (!RegisterClass (&wndclass)) { MessageBox ( NULL, TEXT ("Programm arbeitet mit UNICODE"), AppName, MB_ICONERROR ); return 0; } hwnd = CreateWindow ( AppName, TEXT ("Metrics des System V2"), WS_OVERLAPPEDWINDOW | WS_VSCROLL, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL ); 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 ) { static int cxChar, cxCaps, cyChar, cyClient, iVScrollPos; HDC hdc; int i,y; PAINTSTRUCT ps; TCHAR Buffer[10]; TEXTMETRIC tm; switch (message) { case WM_CREATE: hdc = GetDC (hwnd); GetTextMetrics (hdc, &tm); cxChar = tm.tmAveCharWidth; cxCaps = (tm.tmPitchAndFamily & 1 ? 3 : 2) * cxChar/2; cyChar = tm.tmHeight + tm.tmExternalLeading; ReleaseDC (hwnd, hdc); SetScrollRange (hwnd, SB_VERT, 0, NUMLINES-1, FALSE); SetScrollPos (hwnd, SB_VERT, iVScrollPos, TRUE); return 0; case WM_SIZE: cyClient = HIWORD (lParam); return 0; case WM_VSCROLL: switch (LOWORD (wParam)) { case SB_LINEUP: iVScrollPos -= 1; break; case SB_LINEDOWN: iVScrollPos += 1; break; case SB_PAGEUP: iVScrollPos -= cyClient / cyChar; break; case SB_PAGEDOWN: iVScrollPos += cyClient / cyChar; break; case SB_THUMBPOSITION: iVScrollPos = HIWORD (wParam); break; default: break; } iVScrollPos = max (0, min (iVScrollPos, NUMLINES -1)); if (iVScrollPos != GetScrollPos (hwnd, SB_VERT)) { SetScrollPos (hwnd, SB_VERT, iVScrollPos, TRUE); InvalidateRect (hwnd, NULL, TRUE); } return 0; case WM_PAINT: hdc = BeginPaint (hwnd, &ps); for (i = 0; i < NUMLINES; i++) { y = cyChar * (i - iVScrollPos); TextOut ( hdc, 0, y, sysmetrics[i].szLabel, lstrlen (sysmetrics[i].szLabel) ); TextOut ( hdc, 22 * cxCaps, y, sysmetrics[i].szDesc, lstrlen (sysmetrics[i].szDesc) ); SetTextAlign (hdc, TA_RIGHT | TA_TOP); TextOut ( hdc, 22 * cxCaps + 55 * cxChar, y, Buffer, wsprintf ( Buffer, TEXT ("%5d"), GetSystemMetrics (sysmetrics[i].iIndex) ) ); SetTextAlign (hdc, TA_LEFT | TA_TOP); } EndPaint (hwnd, &ps); return 0; case WM_DESTROY: MessageBox (hwnd,TEXT ("Quit"), TEXT ("Quit"), 0); PostQuitMessage (0); return 0; } return DefWindowProc (hwnd, message, wParam, lParam); }
-
Du hast folgende Zeile vergessen, mit abzutippen:
ShowWindow(hwnd, iCmdShow); // <-- die hier! UpdateWindow (hwnd); while (GetMessage (&msg, NULL, 0, 0)) {
-
Die stand da mal, muss beim Fehler finden wo irgendwie gelöscht worden sein.
Danke