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 parameterhWnd = 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.
-
123 schrieb:
unschön und auch wenn ich jetzt hier geschlagen werd
caste den 2 parameterhWnd = 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
-
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.