none
Code zur Erstellung eines Fensters taugt nix - WARUM? RRS feed

  • Frage

  • Hallo Leute,

    wenngleich mir meine IDE bereits eine funktionierende Vorlage zur Anzeige eines Fensters erstellt, möchte ich doch verstehen ,wie dass ganze funktioniert. Deshalb habe ich eine leere Applikation gestartet und folgenden Code implementiert. Leider passiert nix: Der Quellcode wird compiliert ohne irgendetwas anzuzeigen. Was mache ich falsch?

    #define WIN32_LEAN_AND_MEAN
    #define MAX_LOADSTRING 20
    #include "windows.h"									
    LRESULT CALLBACK WindowProc (HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam)
    {
    	HDC hdc;
    	RECT rect;
    	TCHAR szText[MAX_LOADSTRING]="Windows Programmierung";	
    	switch(message)
    	{
    	case WM_MOVE:
    		{
    			hdc=GetDC(hwnd);
    			GetClientRect(hwnd,&rect);
    			TextOut(hdc,rect.right/2-85,rect.bottom/2-10,szText,ARRAYSIZE(szText));
    			ReleaseDC(hwnd,hdc);
    			return(0);
    		}break;
    	case WM_DESTROY:
    		{
    			PostQuitMessage(0);
    			return(0);
    		}break;
    	default:break;
    	}
    	return(DefWindowProc(hwnd,message,wparam,lparam));
    }
    int WINAPI WinMain(HINSTANCE hinst,HINSTANCE hprevinst, LPSTR lpcmdline,int ncmdshow)
    {
    	WNDCLASSEX winclass;
    	HWND hwnd;
    	MSG message;
    	TCHAR szTitle[MAX_LOADSTRING]="Hallo Welt";					
    	TCHAR szWindowClass[MAX_LOADSTRING]="Klassename";	
    	winclass.cbSize= sizeof(WNDCLASSEX);
    	winclass.style=CS_HREDRAW | CS_VREDRAW;
    	winclass.lpfnWndProc=WindowProc;
    	winclass.cbClsExtra=0;
    	winclass.cbWndExtra=0;
    	winclass.hInstance=hinst;
    	winclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
    	winclass.hCursor=LoadCursor(NULL,IDC_ARROW);
    	winclass.lpszMenuName=NULL;
    	winclass.lpszClassName=szWindowClass;
    	winclass.hIconSm=LoadIcon(NULL,IDI_APPLICATION);
    	hwnd=CreateWindowEx(NULL,szWindowClass,"3D Spieleprogrammierung - Titelliste",WS_OVERLAPPEDWINDOW|WS_VISIBLE,0,0,400,300,NULL,NULL,hinst,NULL);
    	while(GetMessage(&message,NULL,0,0)){
    		TranslateMessage(&message);
    		DispatchMessage(&message);
    	}
    	return message.wParam;
    }
    

    Sonntag, 18. Februar 2018 15:29

Antworten

  • Hi,

    ein ShowWindow fehlt definitiv nicht, da Du WS_VISIBLE mit angegeben hast. Allerdings hast Du die Fensterklasse nicht registriert, es fehlt der Aufruf von RegisterClassEx. Das kannst Du auch einfach selbst herausfinden: Das HWND, das von CreateWindowEx zurückgegeben wird, ist im Fehlerfall NULL. Ist ein Fehler passiert, bekommst Du dessen Code von GetLastError geliefert. Ich rate mal, dass das bei Dir 1407 ist. Öffne Deine winerror.h, wenn Du die Bedeutung wissen willst.

    Übrigens: Wenn CreateWindowEx nichts verwertbares liefert, solltest Du GetMessage lieber gar nicht erst aufrufen. Du hängst dann nämlich dort fest und kannst Dein Programm nicht kontrolliert beenden, Du musst es abschießen.

    Montag, 19. Februar 2018 09:08

Alle Antworten

  • Hallo,

    ich programmiere nicht mit Win32. Aber ich glaube, es fehlt ein ShowWindow? Siehe hier: http://www.cplusplus.com/forum/windows/141990/

    Gruß Guido

    Montag, 19. Februar 2018 06:57
  • Hi,

    ein ShowWindow fehlt definitiv nicht, da Du WS_VISIBLE mit angegeben hast. Allerdings hast Du die Fensterklasse nicht registriert, es fehlt der Aufruf von RegisterClassEx. Das kannst Du auch einfach selbst herausfinden: Das HWND, das von CreateWindowEx zurückgegeben wird, ist im Fehlerfall NULL. Ist ein Fehler passiert, bekommst Du dessen Code von GetLastError geliefert. Ich rate mal, dass das bei Dir 1407 ist. Öffne Deine winerror.h, wenn Du die Bedeutung wissen willst.

    Übrigens: Wenn CreateWindowEx nichts verwertbares liefert, solltest Du GetMessage lieber gar nicht erst aufrufen. Du hängst dann nämlich dort fest und kannst Dein Programm nicht kontrolliert beenden, Du musst es abschießen.

    Montag, 19. Februar 2018 09:08