Problem mit WinAPI - brauche Beispiel
-
Hallo zusammen
ich habe ein Problem mit der WinAPI.
Wenn ich versuche ein Fenster zu erzeugen klappt das nicht.
Ich habe mir schon ein paar Tutorials angeschaut. Kann das an VS2012 oder an Windows 8 liegen? Ich glaube nicht dass ich bei der Erzeugung etwas falsch mache:#include <Windows.h> LRESULT CALLBACK WindowProc(HWND hWindow, UINT uiMessage, WPARAM wParam, LPARAM lParam); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszARgument, int iShowCmd) { HWND hwnd; MSG message; WNDCLASSEX wc; wc.hInstance = hInstance; wc.lpszClassName = (LPCWSTR)"Test"; wc.lpfnWndProc = WindowProc; wc.style = CS_DBLCLKS; if (!RegisterClassEx(&wc)) return 0; hwnd = CreateWindowEx(0, (LPCWSTR)"Test", (LPCWSTR)"Test", WS_VISIBLE | WS_OVERLAPPEDWINDOW, GetSystemMetrics(SM_CXSCREEN) / 2 - 1280 / 2, GetSystemMetrics(SM_CYSCREEN) / 2 - 720 / 2, 1280, 720, HWND_DESKTOP, NULL, hInstance, NULL); ShowWindow(hwnd, SW_SHOW); UpdateWindow(hwnd); while (message.message != WM_QUIT) { while (GetMessage(&message, NULL, 0, 0)) { TranslateMessage(&message); DispatchMessage(&message); } } return message.wParam; } LRESULT CALLBACK WindowProc(HWND hWindow, UINT uiMessage, WPARAM wParam, LPARAM lParam) { switch(uiMessage) { case WM_DESTROY: { PostQuitMessage(0); return 0; } } return DefWindowProc(hWindow, uiMessage, wParam, lParam); }
Ich bekomme keine Fehlermeldung, der Prozess läuft auch, jedoch habe ich kein Fenster. Würde mich über Hilfe freuen.
-
Ich habe mir schon ein paar Tutorials angeschaut. Kann das an VS2012 oder an Windows 8 liegen?
Nein, es liegt (fast immer) an dir und/oder deinen "Tutorials". Guck dir mal die Warnungen an (VS sollte dir diese auch anzeigen):
C:\muell>cl /nologo /W3 a.c /link /nologo user32.lib
a.c
a.c(13) : warning C4133: '=' : incompatible types - from 'LPCWSTR' to 'LPCSTR'
a.c(20) : warning C4133: 'function' : incompatible types - from 'LPCWSTR' to 'LP
CSTR'
a.c(21) : warning C4133: 'function' : incompatible types - from 'LPCWSTR' to 'LP
CSTR'
c:\muell\a.c(30) : warning C4700: uninitialized local variable 'message' usedStatt dieser sinnlosen Casts verwende das Makro TEXT oder gleich die Wide-Char-Versionen.
Ich bekomme keine Fehlermeldung
In der Debug-Version meldet die CRT einige Fehler, aber falsche Anwendung von WinAPI-Funktionen nicht Dafür bist du zuständig! Bei RegisterClassEx überprüfst du zwar den Rückgabewert, aber eine Fehlermeldung gibst du nicht aus (MessageBox, GetLastError, FormatMessage) und 0 steht üblicherweise für "kein Fehler". Bei CreateWindowEx machst du nichts.
Also message initialisieren (wobei deine Message-Loop irgendwie auch Käse ist) und WNDCLASSEX auch. Daran scheitert dein Programm als erstes. Diese Struktur hat mehr Member, die du nicht initialisierst (z.B. das wichtige cbSize)!Wenn du ein bisschen GUI-Programmierung unter Windows betreiben willst, wieso nimmst du nicht C#? Das ist um einiges geeigneter für Anfänger als C bzw. C++ und WinAPI.
-
schau dir diesen Beispiel an: http://dev-reference.de/forum/298-windows-fester-anzeigen.html?s=60517924ad919cc154844703dbb07e0638ca3c0b
-
EinGast schrieb:
Wenn du ein bisschen GUI-Programmierung unter Windows betreiben willst, wieso nimmst du nicht C#? Das ist um einiges geeigneter für Anfänger als C bzw. C++ und WinAPI.
Ich will keine GUI Programmierung, ausserdem bin ich kein Anfänger.
Ich will Spiele entwickeln. Habe das vorher mit Java gemacht.(lwjgl etc)
Aber noch nie mit C++
-
Statt dieser sinnlosen Casts verwende das Makro TEXT oder gleich die Wide-Char-Versionen.
Die Casts sind nicht sinnlos, sondern falsch!
-
TheSanix schrieb:
EinGast schrieb:
Wenn du ein bisschen GUI-Programmierung unter Windows betreiben willst, wieso nimmst du nicht C#? Das ist um einiges geeigneter für Anfänger als C bzw. C++ und WinAPI.
Ich will keine GUI Programmierung, ausserdem bin ich kein Anfänger.
Ich will Spiele entwickeln. Habe das vorher mit Java gemacht.(lwjgl etc)
Aber noch nie mit C++Warum lernste dann die WinAPI?
Schau dir SFML an.
-
TheSanix schrieb:
Hallo zusammen
ich habe ein Problem mit der WinAPI.
Wenn ich versuche ein Fenster zu erzeugen klappt das nicht.
Ich habe mir schon ein paar Tutorials angeschaut. Kann das an VS2012 oder an Windows 8 liegen? Ich glaube nicht dass ich bei der Erzeugung etwas falsch mache:Das ist natürlich keine Glaubensfrage
Hast Du keinen Debugger ?
Sowohl das Registrieren der Fensterklasse, als auch das Erzeugen des Fensters klappt so nicht. Und selbst wenn das Fenster aufgeht, fehlt WM_PAINT ...
Wenn man schon sparen will sollte man wenigstens alle Strukturvariablen auf 0 initialisieren
und die richtige Groesse zuweisen.memset(&wc, 0, sizeof(WNDCLASSEX)); wc.cbSize = sizeof(WNDCLASSEX); wc.style = CS_DBLCLKS; wc.hInstance = hInstance; wc.lpszClassName = TEXT("Test"); wc.lpfnWndProc = WindowProc; if (!RegisterClassEx(&wc)) return 0; hwnd = CreateWindowEx(0, TEXT("Test"), ...
Und das mit dem Text wurde ja auch bereits gesagt ...