Windows Fenster



  • Also hab mir ja jetzt ein tolles C++ Buch gekauft, und hab auch fleißig gelernt, und bisher auch keine Probleme gehabt, so jetzt kommt die Windowsprogrammierung dran. Nach einer kurzen einweißung sollte ich den Code abtippen, damit ich die Sytax etwas lerne, und dann kommt die erklärung, hab dann auch alles abgetippt und wollte dann einmal Testen was den aus meinem Fenster ist, da erhalte ich zwei errors:

    1>c:\users\administrator\desktop\win32\win32\main.cpp(67) : error C2664: 'CreateWindowExW': Konvertierung des Parameters 2 von 'const char [23]' in 'LPCWSTR' nicht möglich
    1> Die Typen, auf die verwiesen wird, sind nicht verknüpft; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat.
    1>main_neu.cpp
    1>c:\users\administrator\desktop\win32\win32\main_neu.cpp(67) : error C2664: 'CreateWindowExW': Konvertierung des Parameters 2 von 'const char [23]' in 'LPCWSTR' nicht möglich
    1> Die Typen, auf die verwiesen wird, sind nicht verknüpft; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat.

    So hab mir gedacht okay, warste so doof und noch beim tippen Fehler zu machen, Orginal von CD kopiert, und beim Testen auch genau dieselben Errors wie ich, hier mal mein Code:

    #include <windows.h>
    
    //Prototyp der Callback Funktion
    //
    LRESULT CALLBACK WindowProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
    
    //Hauptprogramm
    //
    int WINAPI WinMain (HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpcmdline, int ncmdshow)
    {
    	WNDCLASSEX	windowclass;	//Struktur für Fenstereigenschaften
    	HWND		hWnd;			//Fenster Handle
    	MSG			message;		//Nachricht
    
    	//Der Klassenname des Fensters ist frei wählbar
    	const char szClassName[] = "Erstes Windoof Fenster";
    
    	//Struktur mit gewünschten Eigenschaften füllen!
    	//
    	//
    	//Größe der Struktur zwischenspeichern
    	windowclass.cbSize = sizeof (WNDCLASSEX);
    
    	//Fenster soll beim verschieben neu gezeichnet werden
    	windowclass.style = CS_HREDRAW | CS_VREDRAW;
    
    	//Zeiger auf Callback-Funktion
    	windowclass.lpfnWndProc = WindowProc;
    
    	//Keine erweiterten Einstellungen
    	windowclass.cbClsExtra = 0;
    	windowclass.cbWndExtra = 0;
    
    	//Instanz speichern
    	windowclass.hInstance = hInst;
    
    	//Icons und Cursor festlegen
    	windowclass.hIcon =		LoadIcon(NULL, IDI_APPLICATION);
    	windowclass.hIconSm =	LoadIcon (NULL, IDI_APPLICATION);
    	windowclass.hCursor =	LoadCursor (NULL, IDC_ARROW);
    
    	//Hintergrundfarbe festlegen
    	windowclass.hbrBackground = (HBRUSH)COLOR_BACKGROUND+1;
    
    	//Ein Menü wird nicht benötigt
    	windowclass.lpszMenuName = NULL;
    
    	//Klassenname angeben
    	//windowclass.lpszClassName = szClassName;
    
    	//Fensterklasse registrieren
    	if (!RegisterClassEx (&windowclass))
    		return 0;
    
    	//Das Fenster erzeugen
    	hWnd = CreateWindowEx
    		(
    		NULL,
    		szClassName,
    		"Erstes Windoof Fenster",
    		WS_OVERLAPPEDWINDOW | WS_VISIBLE,
    		100, 100,
    		300, 250,
    		NULL,
    		NULL,
    		hInst,
    		NULL);
    
    	//Prüfen ob alles glatt ging
    	if (hWnd == NULL)
    		return 0;
    
    	//Der Herzschlag des Programms
    	//Hier werden alle Nachrichten abgeholt,
    	//übersetzt und weitergeleitet
    	//
    	while (GetMessage (&message, NULL, 0, 0))
    	{
    		TranslateMessage (&message);
    		DispatchMessage (&message);
    	}
    
    	//Programm beenden
    	return (int)(message.wParam);
    }
    
    //Callback-Funktion zur Nachrichtenverarbeitung
    //
    LRESULT CALLBACK WindowProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    	//Messages auswerten
    	switch (message)
    	{
    		//Fenster schließen?
    	case WM_DESTROY:
    		{
    			//Nachricht zum beenden schicken
    			PostQuitMessage (0);
    			return 0;
    		}
    
    	//Wurde eine Taste gedrückt?
    	case WM_KEYDOWN:
    		{
    			//Ja, also je nach Taste verzweigen
    			switch (wParam)
    			{
    				//Wurde Escape gedrückt?
    			case VK_ESCAPE:
    				{
    					PostQuitMessage(0);
    					return 0;
    				}
    			}
    		}	break;
    	}
    
    	//Die Nachricht wurde nicht von uns verarbeitet, also
    	//von Windoof verarbeiten lassen.
    	return (DefWindowProc (hWnd, message, wParam, lParam));
    }
    

    Ich hoffe wenn ich morgen aufsteh und wieder mit voller Elan weiterarbeiten will, dass sich jemand die Mühe gemacht hat nem Anfänger zu helfen währe echt dankbar!

    Gute Nacht PSPfreak



  • Entweder Projekt auf Multibyte umstellen, oder wchar_t benutzen:

    const char szClassName[] = "Erstes Windoof Fenster";
    

    zu:

    const wchar_t szClassName[] = "Erstes Windoof Fenster";
    


  • also nur mit wchar_T geht es noch nicht, aber von dem Wort Multibyte hab ich auch noch nix gehört, ich finde es halt schade, dass grad bei so nem schweren Thema der cade falsch ist 😞



  • PSPfreak20072 schrieb:

    ...ich finde es halt schade, dass grad bei so nem schweren Thema der cade falsch ist 😞

    Und auch das Unterforum... Würde ein Mod das ganze bitte in das WinAPI-Forum verschieben?

    cu André
    P.S: Und schau bitte in die Projekteigenschaften, da wird garantiert etwas von Multibyte erwähnt (vermutlich ist der Code dadurch auch an sich auch nicht falsch).



  • unschön und auch wenn ich jetzt hier geschlagen werd
    caste den 2 parameter

    hWnd = CreateWindowEx
            (
            NULL,
            (LPCWSTR)szClassName,
            "Erstes Windoof Fenster",
            WS_OVERLAPPEDWINDOW | WS_VISIBLE,
            ...
    


  • Dieser Thread wurde von Moderator/in evilissimo aus dem Forum C++ in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


  • Mod

    123 schrieb:

    unschön und auch wenn ich jetzt hier geschlagen werd
    caste den 2 parameter

    hWnd = CreateWindowEx
            (
            NULL,
            (LPCWSTR)szClassName,
            "Erstes Windoof Fenster",
            WS_OVERLAPPEDWINDOW | WS_VISIBLE,
            ...
    

    Du wirst geschlagen! Korrekt. Weil ein cast aus einem MBCS String keinen Unicode String macht.
    Man sollte sich beim Umgang mit der WinAPI mit der TCHAR Notation auseinander setzen.

    Korrekt wäre:

    const TCHAR szClassName[] = _T("Erstes Windoof Fenster"); 
    ...
      hWnd = CreateWindowEx
            (
            NULL,
            szClassName,
            _T("Erstes Windoof Fenster"),
            WS_OVERLAPPEDWINDOW | WS_VISIBLE,
            ...
    


  • Ja und wie soll ich jetzt meinen Code verändern, weil der ist ja 1:1 aus dem Buch, und funktioniert nicht, es ist schade, dass gleich bei nem etwas schwereren Thema der Code nich funzt.

    Grüße


  • Mod

    Stell Dein Projekt von Unicode auf MBCS um, dann geht es auch ohne Code Änderngen...



  • const wchar_t szClassName[] = "Erstes Windoof Fenster";
    

    Ich hätte jetzt angenommen, dass dort ein L" stehen müsste?



  • okay habs jetzt umgestell, aber was ist daran der unterschied? in meinem buch wurde mir da nichts gesagt, dass ich da etwas verändern soll, jedenfalls wurde mein quellcode kompiliert, und gelinkt, ich wollte ihn dann ja gleich ausprobieren, dann bekomm ich ne zugriffsrechtsverletzung an zeile 52 vom obrigen code beim debugging werden auch die zeilen von windowclass und &windowclass rot, und ich hab kein plan an was es liegen könnte 😞

    edit: okay vergesst es tipfehler von mir aber die erklärung für unicode würde ich trozdem wissen wollen! 😉

    bis dann PSPfreak



  • Die Funktion CreateWindowEx, die Du aufrufen möchtest, gibt es nicht. Das ist in Wirklichkeit ein Macro (in winuser.h), über das entweder die Funktion CreateWindowExA oder die Funktion CreateWindowExW aufgerufen wird.
    Erstere ist die Ansi - Version, letztere die Unicode - Version.

    So verhält sich das mit den meisten WINAPI-Funktionen.

    Wenn Du Dein Projekt also als Unicode-Projekt kompilierst, wird die Funktion CreateWindowExW aufgerufen, die mit einem char-Zeiger aber nix anfangen kann.


Anmelden zum Antworten