Verwirrung bei einfachem Label



  • Hallo,
    Ich bin noch ein ziemlicher Anfänger was C++ angeht (vor allem bei der Windows Programmierung). In meinem Buch wurde zuerst ein Windows-Programm-Grundgerüst geschrieben, was soweit (mit ein bis zwei Änderungen) dann auch bei mir funktioniert hat. Weiter wurde als Beispiel dann untenstehendes Label erzeugt, was bei mir aber so nicht funktioniert hat, weshalb ich dann weiter getestet habe. Was mich verwirrt sind die Fehlermeldungen... aber lest selbst und versucht mir bitte mal zu erklären, was genau da passiert:

    hText = CreateWindow(
    "STATIC",
    "Beispieltext",
    WS_VISIBLE | WS_CHILD,
    0, 100,
    300, 20,
    hWnd,
    (HMENU) ID_TEXT,
    hInst,
    NULL);

    error C2664: 'CreateWindowExW' : cannot convert parameter 2 from 'const char [7]' to 'LPCWSTR'
    1> Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast

    -->> Wieso CreateWindowExW? (Der Fehler wurde in der Zeile von CreateWindow gefunden). Laut Buch sollte es funkionieren, tuts aber wie man sieht nicht, also mach ich das was der Compiler sagt...

    hText = CreateWindow(
    "STATIC",
    (LPCWSTR) "Beispieltext",
    WS_VISIBLE | WS_CHILD,
    0, 100,
    300, 20,
    hWnd,
    (HMENU) ID_TEXT,
    hInst,
    NULL);

    error C2664: 'CreateWindowExW' : cannot convert parameter 2 from 'const char [7]' to 'LPCWSTR'
    1> Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast

    -->> Nichts hat sich geändert... Aber Der 2. Parameter hat auch keine 7 Buchstaben, also ändere ich "STATIC"...

    hText = CreateWindow(
    (LPCWSTR) "STATIC",
    "Beispieltext",
    WS_VISIBLE | WS_CHILD,
    0, 100,
    300, 20,
    hWnd,
    (HMENU) ID_TEXT,
    hInst,
    NULL);

    error C2664: 'CreateWindowExW' : cannot convert parameter 3 from 'const char [13]' to 'LPCWSTR'
    1> Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast

    -->> Jetzt hat er ein Problem mit dem dritten Parameter. In weister Voraussicht 😉 ändere ich den zweiten...

    hText = CreateWindow(
    (LPCWSTR) "STATIC",
    (LPCWSTR) "Beispieltext",
    WS_VISIBLE | WS_CHILD,
    0, 100,
    300, 20,
    hWnd,
    (HMENU) ID_TEXT,
    hInst,
    NULL);

    -->> Fenster schließt sich sofort nach öffnen wieder. (Hat es ohne das Label nicht)
    Oft hat mir bei Strings schon dieses L geholfen, dass ich irgendwo mal gelesen habe, also teste ich es mal. (Was genau bewirkt dieses vorangestellte L?)

    hText = CreateWindow(
    (LPCWSTR) "STATIC",
    L"Beispieltext",
    WS_VISIBLE | WS_CHILD,
    0, 100,
    300, 20,
    hWnd,
    (HMENU) ID_TEXT,
    hInst,
    NULL);

    -->> Fenster schließt sich sofort nach öffnen wieder. Weitertesten!...

    hText = CreateWindow(
    L"STATIC",
    (LPCWSTR) "Beispieltext",
    WS_VISIBLE | WS_CHILD,
    0, 100,
    300, 20,
    hWnd,
    (HMENU) ID_TEXT,
    hInst,
    NULL);

    -->> Fenster öffnet sich, bleibt offen, Text ist da ABER: nicht Beispieltext, sondern 6 chinesische Zeichen 😕

    hText = CreateWindow(
    L"STATIC",
    L"Beispieltext",
    WS_VISIBLE | WS_CHILD,
    0, 100,
    300, 20,
    hWnd,
    (HMENU) ID_TEXT,
    hInst,
    NULL);

    -->> Alles funktioniert jetzt so wie es soll.
    Allerdings bin ich jetzt sehr verwirrt ^^ Bitte um Hilfe, ich denke für nen "Experten" sollte das alles halbwegs verständlich erscheinen 🙂



  • Hallo,

    um es sehr anfänger-gerecht und einfach auszudrücken:

    Es gibt Projekteinstellungen, die bestimmen, ob ein Programm mit UNICODE- oder ANSI-Zeichen-Unterstützung kompiliert werden soll. An den Fehlern erkennt man, dass du mit der UNICODE-Einstellung arbeitest.

    Warum CreateWindowExW, obwohl nicht benutzt?

    Zunächst wird der Aufruf von CreateWindow noch vor dem Kompilieren in einen Aufruf von CreateWindowExW "umgewandelt", das "W" am Ende zeigt an, dass es eine Funktion ist, die UNICODE-Zeichen erwartet (wird in diese Funktion überführt, weil eben deine Einstellungen so sind).

    Deswegen sind deine verschiedenen Versuche alle fehlerhaft, nur der letzte Versuch erzeugt wirklich UNICODE-Zeichen, durch Voranstellen von L. Um unabhängig von Einstellungen zu bleiben, kann man das TEXT-Makro verwenden (das funktioniert dann auch, wenn nicht UNICODE eingestellt ist, weil es ein L voranstellt, wenn nötig, und sonst nicht):

    hText = CreateWindow( 
    TEXT("STATIC"), 
    TEXT("Beispieltext"), 
    WS_VISIBLE | WS_CHILD, 
    0, 100, 
    300, 20, 
    hWnd, 
    (HMENU) ID_TEXT, 
    hInst, 
    NULL);
    

    MfG,

    Probe-Nutzer



  • Danke für die schnelle Hilfe, das TEXT() Makro gleich mal getestet und für gut befunden 😃 Warum von Unicode etc in dem Buch noch nicht einmal was erwähnt wurde, was bei mir auch schon des öfteren Fehler verursacht hat, verstehe ich nicht. Aber durch die tolle Erklärung ist alles klar! DANKE 🙂



  • n0_0ne schrieb:

    Warum von Unicode etc in dem Buch noch nicht einmal was erwähnt wurde, was bei mir auch schon des öfteren Fehler verursacht hat, verstehe ich nicht.

    Naja, der Buchautor will Dich damit vermutlich nicht belasten. Es funktioniert ja auch ohne Unicode! Nur mußt Du dann - wie mein Vorposter schon erwähnt hat - Dein Projekt so compilieren, daß es kein Unicode benutzt.
    TEXT u. TCHAR (statt char) machen Dich bzw. Deine Datentypen allerdings unabhängig davon, ob Du mit oder ohne Unicode compilierst.


Anmelden zum Antworten