Mein erstes Fenster



  • Also EINE dieser Änderungen musst du vornehmen:

    char szClassName[] = "Erstes Fenster";
    
    hWnd = CreateWindowEx    (NULL,
                                (char*)szClassName,
                                "Das erste Fenster!",
                                WS_OVERLAPPEDWINDOW | WS_VISIBLE,
                                100, 100,
                                300, 250,
                                NULL,
                                NULL,
                                hInst,
                                NULL);
    

    Zur Erklärung:
    Er erwartet einen LPSCTR (LP = pointer - CSTR = Char-String, also ein char Array (char[]), also einen Pointer auf ein Char-array, du gibt ihm aber einen const char-array, welches (für) ihn ein Unterschied ist.
    Für dich heiß es nur, dass du etweder keinen const String verwenden darfst (Bsp. 1) oder ihm sagen musst, dass er es wie einen "normalen" String behandeln soll (char)stClassName)*.



  • Fehlermeldung bei Verwendung von Beispiel 1:

    1>c:\users\lybrial\documents\visual studio 2010\projects\grundlagen windows programmierung\grundlagen windows programmierung\ein erstes fenster.cpp(65): error C2664: 'CreateWindowExW' : cannot convert parameter 2 from 'char [15]' to 'LPCWSTR'
    1> Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast

    Fehlermeldung bei Verwendung von Beispiel 2:

    1>c:\users\lybrial\documents\visual studio 2010\projects\grundlagen windows programmierung\grundlagen windows programmierung\ein erstes fenster.cpp(65): error C2664: 'CreateWindowExW' : cannot convert parameter 2 from 'char *' to 'LPCWSTR'
    1> Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast



  • Der Fehler hat nichts mit Const oder nicht Const zu tun.
    Wie unicode schon sagte, es liegt ein Problem mit dem Zeichensatz vor.
    Du könntest anstatt CreateWindowEx die ASCII-Version CreateWindowExA aufrufen.
    besser ist es aber, in den Projekt-Einstellungen den Zeichensatz von Unicode auf ASCII umzustellen.

    Eine weitere Möglichkeit wäre das mit dem L vor dem String:

    hWnd = CreateWindowEx    (NULL,
                                L"Erstes Fenster"
                                L"Das erste Fenster!",
                                WS_OVERLAPPEDWINDOW | WS_VISIBLE,
                                100, 100,
                                300, 250,
                                NULL,
                                NULL,
                                hInst,
                                NULL);
    

    MfG, Jochen



  • Jetzt hat sich was verändert.

    1> Ein erstes Fenster.cpp
    1> Grundlagen Windows Programmierung.vcxproj -> c:\users\lybrial\documents\visual studio 2010\Projects\Grundlagen Windows Programmierung\Debug\Grundlagen Windows Programmierung.exe
    ========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========

    Allerdings wird mir das Fenster nicht angezeigt 😞



  • Ruf mal vor der Nachrichtenschleife UpdateWindow und ShowWindow auf.
    also in Zeile 70 noch folgendes einfügen:

    ShowWindow(hWnd, SW_SHOW);
    UpdateWindow(hWnd);
    

    So müsste das Fenster auch erscheinen.
    Anstatt SW_SHOW kannst du der Funktion auch den 4. Parameter der WinMain (in diesem Falle also ncmdshow übergeben.

    MfG, Jochen



  • Hmmm, nein sehe das Fenster leider trotzdem nicht 😞



  • ShowWindow braucht er nicht, aber das hier fehlt:

    windowclass.lpszClassName = szClassName;
    


  • Leider nicht, dann bekomme ich wieder die alte Fehlermeldung rein 😞



  • 🙂 Dann nicht "string", sondern TEXT("string"), und nicht char, sondern TCHAR:

    //nicht: char szClassName[] = "Erstes Fenster";
    TCHAR szClassName[] = TEXT("Erstes Fenster"); // ja!
    
    // CreateWindowEx
    TEXT("Das erste Fenster!")
    


  • So hats funktioniert Danke ! 😃
    Kannst du mir sagen was dahinter steckt?
    Also wieso es ein Text-string sein muss?



  • Eine Zeichenkette vom TCHAR stellt sich projektabhängig automatisch entweder auf char oder auf wchar, je nachdem ob UNICODE aktiv ist oder nicht.

    Das Makro TEXT(""), oder auch _T("") sorgen dafür das der ansonsten typenlose Text in den zum Projekt passenden Datentyp gespeichert wird.

    Will man sich die Arbeit erleichtern ist es empfehlenswert Zeichenketten immer objektbasiert abzulegen. Das ist insbesondere deshalb von Vorteil wenn man die Zeichenkette in verschiedenen Versionen benötigt. Ausserdem kümmert sich das Objekt selbst um den benötigten Speicher und gibt ihn auch automatisch wieder frei.

    Ich empfehle CString-Objekte.

    #include <atlstr.h> 
    
    using namespace std;
    

    Beispiele:

    CString str1;
    CString str2("hallo);
    
    str1 = str2 + TEXT(" super");
    
    wcout << str1.GetString() << endl;
    

Anmelden zum Antworten