[Gelöst] Problem mit HWND



  • Hallo liebe Community 😃

    Ich folge gerade einige WinAPI tutorials im web, aber ich habe immer das selbe problem... HWND

    #include <windows.h>
    
    // Prototyp
    LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
    
    int WINAPI WinMain(HINSTANCE hInstance,
    				   HINSTANCE hPrevInstance,
    				   LPSTR lpCmdLine,
    				   int nShowCmd)
    {
    	WNDCLASS wc;
    
    	wc.style = CS_HREDRAW | CS_VREDRAW; // CS = Class Style
    	wc.lpfnWndProc = WndProc;
    	wc.cbClsExtra = 0;
    	wc.cbWndExtra = 0;
    	wc.hInstance = hInstance;
    	wc.hIcon = LoadIcon(NULL, IDI_WINLOGO);
    	wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    	wc.hbrBackground = (HBRUSH) GetStockObject(BLACK_BRUSH);
    	wc.lpszMenuName = NULL;
    	wc.lpszClassName = TEXT("My first Window");
    
    	RegisterClass(&wc);
    
    	HWND hwnd = CreateWindow(TEXT("My first Window"), TEXT(""), WS_SYSMENU | WS_THICKFRAME,
    							 0, 0, 200, 100, NULL, NULL, hInstance, NULL);
    	ShowWindow(hwnd, iCmdShow);
    	UpdateWindow(hwnd);
    
    	// Nachrichten-Schleife
    	MSG msg;
    
    	while (GetMessage(&msg, NULL, 0, 0)) {
    
    		TranslateMessage(&msg);
    		DispatchMessage(&msg);
    	}
    	return msg.wParam;
    }
    
    // Windows-Nachrichten-Prozedur
    LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    	HDC hdc;
    	PAINTSTRUCT ps;
    
    	switch (message) {
    		case WM_PAINT:
    			hdc = BeginPaint(hwnd, &ps);
    			TextOut(hdc, 20, 20, TEXT("Ich bin ein Fenster"), 20);
    			EndPaint(hwnd, &ps);
    			return 0;
    
    		case WM_DESTROY:
    			PostQuitMessage(0);
    			return 0;
    	}
    	return DefWindowProc(hwnd, message, wParam, lParam);
    }
    

    Visual Studio 2008:

    1>------ Erstellen gestartet: Projekt: 6_firstwindow, Konfiguration: Debug Win32 ------
    1>Kompilieren...
    1>main.c
    1>c:\users\giowck\documents\my dropbox\windows_api\6_firstwindow\main.c(28) : error C2275: 'HWND': Ungültige Verwendung dieses Typs als Ausdruck
    1> c:\program files\microsoft sdks\windows\v6.0a\include\windef.h(208): Siehe Deklaration von 'HWND'
    1>c:\users\giowck\documents\my dropbox\windows_api\6_firstwindow\main.c(28) : error C2146: Syntaxfehler: Fehlendes ';' vor Bezeichner 'hwnd'
    1>c:\users\giowck\documents\my dropbox\windows_api\6_firstwindow\main.c(28) : error C2065: 'hwnd': nichtdeklarierter Bezeichner
    1>c:\users\giowck\documents\my dropbox\windows_api\6_firstwindow\main.c(29) : warning C4047: '=': Anzahl der Dereferenzierungen bei 'int' und 'HWND' unterschiedlich
    1>c:\users\giowck\documents\my dropbox\windows_api\6_firstwindow\main.c(30) : error C2065: 'hwnd': nichtdeklarierter Bezeichner
    1>c:\users\giowck\documents\my dropbox\windows_api\6_firstwindow\main.c(30) : warning C4047: 'Funktion': Anzahl der Dereferenzierungen bei 'HWND' und 'int' unterschiedlich
    1>c:\users\giowck\documents\my dropbox\windows_api\6_firstwindow\main.c(30) : warning C4024: 'ShowWindow': Unterschiedliche Typen für formalen und übergebenen Parameter 1
    1>c:\users\giowck\documents\my dropbox\windows_api\6_firstwindow\main.c(30) : error C2065: 'iCmdShow': nichtdeklarierter Bezeichner
    1>c:\users\giowck\documents\my dropbox\windows_api\6_firstwindow\main.c(31) : error C2065: 'hwnd': nichtdeklarierter Bezeichner
    1>c:\users\giowck\documents\my dropbox\windows_api\6_firstwindow\main.c(31) : warning C4047: 'Funktion': Anzahl der Dereferenzierungen bei 'HWND' und 'int' unterschiedlich
    1>c:\users\giowck\documents\my dropbox\windows_api\6_firstwindow\main.c(31) : warning C4024: 'UpdateWindow': Unterschiedliche Typen für formalen und übergebenen Parameter 1
    1>c:\users\giowck\documents\my dropbox\windows_api\6_firstwindow\main.c(34) : error C2275: 'MSG': Ungültige Verwendung dieses Typs als Ausdruck
    1> c:\program files\microsoft sdks\windows\v6.0a\include\winuser.h(1633): Siehe Deklaration von 'MSG'
    1>c:\users\giowck\documents\my dropbox\windows_api\6_firstwindow\main.c(34) : error C2146: Syntaxfehler: Fehlendes ';' vor Bezeichner 'msg'
    1>c:\users\giowck\documents\my dropbox\windows_api\6_firstwindow\main.c(34) : error C2065: 'msg': nichtdeklarierter Bezeichner
    1>c:\users\giowck\documents\my dropbox\windows_api\6_firstwindow\main.c(36) : error C2065: 'msg': nichtdeklarierter Bezeichner
    1>c:\users\giowck\documents\my dropbox\windows_api\6_firstwindow\main.c(36) : warning C4133: 'Funktion': Inkompatible Typen - von 'int *' zu 'LPMSG'
    1>c:\users\giowck\documents\my dropbox\windows_api\6_firstwindow\main.c(38) : error C2065: 'msg': nichtdeklarierter Bezeichner
    1>c:\users\giowck\documents\my dropbox\windows_api\6_firstwindow\main.c(38) : warning C4133: 'Funktion': Inkompatible Typen - von 'int *' zu 'const MSG *'
    1>c:\users\giowck\documents\my dropbox\windows_api\6_firstwindow\main.c(39) : error C2065: 'msg': nichtdeklarierter Bezeichner
    1>c:\users\giowck\documents\my dropbox\windows_api\6_firstwindow\main.c(39) : warning C4133: 'Funktion': Inkompatible Typen - von 'int *' zu 'const MSG *'
    1>c:\users\giowck\documents\my dropbox\windows_api\6_firstwindow\main.c(41) : error C2065: 'msg': nichtdeklarierter Bezeichner
    1>c:\users\giowck\documents\my dropbox\windows_api\6_firstwindow\main.c(41) : error C2224: Der linke Teil von '.wParam' muss eine Struktur/Union sein
    1>c:\users\giowck\documents\my dropbox\windows_api\6_firstwindow\main.c(41) : warning C4033: 'WinMain' muss einen Wert zurückgeben
    1>Das Buildprotokoll wurde unter "file://c:\Users\giowck\Documents\My Dropbox\Windows_API\6_firstwindow\Debug\BuildLog.htm" gespeichert.
    1>6_firstwindow - 14 Fehler, 9 Warnung(en)
    ========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========

    Wie gehts weiter?

    Danke!



  • Bis auf den Fehler in Zeile 28:

    [code]ShowWindow(hwnd, iCmdShow);[/code]
    

    ist alles in Ordnung.
    Die Variable muß bei dir nShowCmd heißen.

    Kompilierst du das Programm auch als Win32-Anwendung?



  • Moin,

    kompilierst du reines C nach dem alten Standard C89 dann musst du die Datentypen am Anfang von Anweisungsblöcken deklarieren. Das könnte bei dir auch noch ein Fehler sein, ich habe das jetzt aber nicht getestet.

    Gruß Chris



  • Danke für die antworten!

    HWND hwnd;
    	hwnd = CreateWindow(TEXT("My first Window"), TEXT(""), WS_SYSMENU | WS_THICKFRAME,
    							 0, 0, 200, 100, NULL, NULL, hInstance, NULL);
    

    Meldung:

    'HWND': Ungültige Verwendung dieses Typs als Ausdruck

    Stimmt was nicht mit VS 2008?

    ps. das project ist als win32-Application eingestellt!



  • giowck schrieb:

    ps. das project ist als win32-Application eingestellt!

    Davon unabhängig kann dein Code als C- oder C++-Code kompiliert werden, wobei standardmäßig eigentlich C++ eingestellt sein sollte. Schau zur Sicherheit nochmal nach (Projekteigenschaften => C/C++ => Erweitert => Kompilierungsart).

    EDIT: Ich sehe gerade, dass deine Datei die Endung .c hat (main.c). Damit wird automatisch der C-Compiler benutzt. Der kann beim Visual Studio aber nur C89. Das heißt, dass du (wie schon vermutet wurde) deine Variablen immer am Scope-Anfang deklarieren musst. Also deklariere dein Handle einfach am Anfang der Funktion, dann klappts.



  • AH, SUPER, jetzt geht es!

    Danke an ALLE 🙂


Anmelden zum Antworten