Anfänger: Was ist falsch?
-
Hallo ich lerne gerade durch ein Tutorial WinAPI nur ich habe hier einen Fehler:
E:\dokumente\C++\projekte\WinAPI\Fenster1\main.cpp In function `int WinMain(HINSTANCE__*, HINSTANCE__*, CHAR*, int)': 62 E:\dokumente\C++\projekte\WinAPI\Fenster1\main.cpp a function-definition is not allowed here before '{' token 62 E:\dokumente\C++\projekte\WinAPI\Fenster1\main.cpp expected `,' or `;' before '{' token E:\dokumente\C++\projekte\WinAPI\Fenster1\Makefile.win [Build Error] [main.o] Error 1Code:
#define STRICT #include <windows.h> //LRESULT ist ein typedef auf einen long Typ. //CALLBACK ist genau das gleiche wie WINAPI, CALLBACK sagt aus, dass diese Funktion von Windows aufgerufen wird. //HWND = Handle zu dem Fenster, für das die Nachricht bestimmt ist. //UINT = enthält die Kennziffer der Nachricht, für alle Nachrichten sind in winuser.h Konstanten deklariert LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); //Programmnamen const char szAppName[] = "Ein eigenes Fenster"; //In jedem Windows API Programm brauchen wir die WinMain Funktion int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow){ HWND hWnd; //Handle für das Fenster. MSG msg; //Windows Nachrichten abholen und bearbeiten. WNDCLASS wc; //Typ der Fensterklasse. wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; //Handle zu unserer Programminstanz, damit nur unser Programm diese Fensterklasse benutzen kann. wc.hCursor = LoadCursor(NULL,IDC_ARROW); //Typ des Cursors. wc.hIcon = LoadIcon(NULL,IDI_APPLICATION); wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); //Hintergrundfarbe wc.lpszClassName = szAppName; //Fenstername wc.lpszMenuName = NULL; //Menü RegisterClass(&wc); //registriert bzw. meldet unsere Fensterklasse beim Fenstermanager von Windows an. hWnd = CreateWindow(szAppName, //Fenstername "Titelleiste", //Text der Titelleiste WS_OVERLAPPEDWINDOW, //Stil des Fensters CW_USEDEFAULT, //X-Position auf dem Monitor CW_USEDEFAULT, //Y-Position auf dem Monitor CW_USEDEFAULT, //Fensterbreite CW_USEDEFAULT, //Fensterhoehe NULL, NULL, hInstance, //Handle auf unsere Programm Instanz NULL); //Zeigt das Fenster an. //hWnd = Handle auf unser Fenster. //iCmdShow = Wie das Fenster angezeigt werden soll(z.b. SW_SHOW) ShowWindow(hWnd, iCmdShow); //Lässt den Anwendungsbereich, also den freien Fensterbereich, sofort nach dem Start neu zeichnen. //hWnd = Handle auf unser Fenster. UpdateWindow(hWnd); //GetMessage(&msg, NULL, 0, 0): //Nachrichten aus der Warteschleife holen. //&msg = Gespeicherte Nachricht. while(GetMessage(&msg, NULL, 0, 0)){ TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){ //ZEILE 62!!!! switch(message){ case WM_DESTROY:{ PostQuitMessage(0); return 0; } } return DefWindowProc(hWnd, message, wParam, lParam); } }
-
Ich hab denn Fehler gefunden
also kann gelöscht oder gesperrt werden, danke
-
Also ich weis nicht was hier falsch sein soll:
#define STRICT #include <windows.h> //LRESULT ist ein typedef auf einen long Typ. //CALLBACK sagt aus, dass diese Funktion von Windows aufgerufen wird. //Der erste Parameter ist der Handle zu dem Fenster. //Der zweite Parameter message enthält die Kennziffer der Nachricht. //Die nächsten beiden Parameter enthalten je nach Nachricht verschiedene Daten. LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); const char szAppName[] = "Ein eigenes Fenster"; //Programmname. //Der erste Parameter HINSTANCE ist ein Handle auf diese Programminstanz. //Der zweite Parameter ist vom gleichen Typ, jedoch wird dieser Wert in Win 32 immer Null sein. //Der dritte Parameter enthält die Kommandozeilen Parameter. //Mit dem vierten Parameter wird übergeben, wie das eventuelle Fenster angezeigt werden soll (maximiert, minimiert usw.). int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow){ HWND hWnd; //Handle für unser Fenster. MSG msg; //Windows Nachrichten abholen und bearbeiten. WNDCLASS wc; //Typ der Fensterklasse. wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hCursor = LoadCursor(NULL,IDC_ARROW); wc.hIcon = LoadIcon(NULL,IDI_APPLICATION); wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wc.lpszClassName = szAppName; wc.lpszMenuName = NULL; RegisterClass(&wc); hWnd = CreateWindow(szAppName, "Titelleiste", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, /* X-Position auf dem Monitor */ CW_USEDEFAULT, /* Y-Position auf dem Monitor */ CW_USEDEFAULT, /* Fensterbreite */ CW_USEDEFAULT, /* Fensterhoehe */ NULL, NULL, hInstance, NULL); ShowWindow(hWnd, iCmdShow); 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){ switch(message){ case WM_DESTROY:{ PostQuitMessage(0); return 0; } } return DefWindowProc(hWnd, message, wParam, lParam); }Fehler von Dev-C++:
C:\DOKUME~1\Tobias\LOKALE~1\Temp\cc6ddaaa.o(.text+0x71) In function `WinMain': [Linker error] undefined reference to `GetStockObject@4' C:\DOKUME~1\Tobias\LOKALE~1\Temp\cc6ddaaa.o(.text+0x71) ld returned 1 exit status
-
lord_fritte schrieb:
Also ich weis nicht was hier falsch sein soll:
Dann solltest du lernen, die Fehlermeldungen zu interpretieren.
Der Linker beschwert sich, dass er GetStockObject nicht findet. Die MSDN Library sagt zu GetStockObject:
Library: Use Gdi32.lib.
-
#pragma comment(lib, "gdi32.lib")
-
Ich hab das selbe Problem, das hat sich bei mir noch nicht geklärt.
Wenn ich#pragma comment(lib, "gdi32.lib")als header in die Datei schreib kommt die selbe fehlermeldung.
Benutze auch Dev-C++
-
wahrscheinlich weil der Compiler (g++) kein pragma kennt.
Du musst in den Projekteinstellungen bei Linker mit angeben, dass gdi32.lib mitgelinkt werden soll.
-
Hat sich bei mir geklärt. Man muss bei Dev-C++ einfach ein neues Win 32 Projekt anlegen. Dann funktionierts.
Trotzdem danke, Airdamn