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 🙂


Anmelden zum Antworten