CreateWindow, Parameter 1 und 2 typecasten???



  • Hi, ich habe folgendes BeispielProgramm:

    #include "stdafx.h"
    #include <windows.h>
    
    LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
    
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, 
                       PSTR szCmdLine, int iCmdShow)
    {
    	HWND       myHWND;	
    	MSG        myMSG;
    	WNDCLASS   myWNDCLASS;
    	myWNDCLASS.style =  CS_HREDRAW | CS_VREDRAW;
    	myWNDCLASS.lpfnWndProc =  WndProc;	
    	myWNDCLASS.cbClsExtra =  0;
    	myWNDCLASS.cbWndExtra =  0;
    	myWNDCLASS.hInstance = hInstance;
    	myWNDCLASS.hCursor = LoadCursor(NULL,IDC_ARROW);
    	myWNDCLASS.hIcon = LoadIcon(NULL,IDI_APPLICATION);
    	myWNDCLASS.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    	myWNDCLASS.lpszClassName =  "Klasse1";	
    	myWNDCLASS.lpszMenuName  =  NULL;
    	RegisterClass(&myWNDCLASS);	
    	myHWND = CreateWindow("Klasse1", "Titel", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL);
    	ShowWindow(myHWND, iCmdShow);
    	UpdateWindow(myHWND);
    
             //und so weiter
    

    Nun kann ich aber nicht starten weil der erste und der zweite Parameter bei CreateWindow in einen LPCWSTR gecastet werden sollen. Mach ich das, startet zwar mein Fenster, der Text ist aber nicht zu lesen, sind lauter Vierecke.

    Komischerweise sind alle Beispiele, die ich gefunden hab (zum Beispiel MSDN und ein paar gegoogelte) ohne typecasten, geht aber bei mir, wie gesagt, nicht.

    Thx für Hilfe und Durchlesen 🙂



  • Du hast Unicode aktiviert... d.h. muss du vor deiner Zeichenkette ein L setzen... oder du includierst tchar.h und nutz den TCHAR Datentype...

    // Unicode
    CreateWindow(L"Klasse1", L"Titel", //...);
    
    // #include <tchar.h> nicht vergessen!
    CreateWindow(_T("Klasse1"), _T("Titel"), //... 
    
    // Wobei char wird zu TCHAR, LPCSTR wird zu LPCTSTR usw. am besten auch tstrcpy usw. dann benutzen...
    

    Bei letzterem kannst de nicht Unicode und Unicode compilieren 😉



  • Mal BTW: Also ich bevorzuge statt _T(exp) immer TEXT(exp), aber dat is wohl Ansichtsache 😉 .



  • Nope ist es nicht. Wenn du keine tchar includierst nimmst du TEXT. Andernfalls _T 🙂



  • lol aber wenne windows.h inkludierst, inkludierste autom. tchar.h , also kann man auch TEXT nehemen^^



  • Wäre mir ehrlichgesagt neu... VC2003 includiert bei nem WinAPI Programm(vom Assist erstellt) auch immer die tchar EXTRA hinzu...



  • Hm ok, dann vllt n Missverständnis...:

    #include <Windows.h>
    
    TCHAR szIrgWas[] = TEXT("blablabla");
    

    Also das da oben geht, ohne Tchar.h 🙄



  • Hm, danke für die Tipps, workt nun einwandfrei! 👍



  • (D)Evil schrieb:

    // Unicode
    CreateWindow(L"Klasse1", L"Titel", //...);
    

    Dann aber bitte CreateWindowW benutzen.

    CodeFinder schrieb:

    Also das da oben geht, ohne Tchar.h 🙄

    Das funktioniert, weil TCHAR und TEXT in <winnt.h> definiert werden, welche wiederum durch <windows.h> eingebunden wird. <tchar.h> muss man jedenfalls immer separat einbinden, wenn Funktionalität daraus genutzt werden soll.



  • groovemaster schrieb:

    (D)Evil schrieb:

    // Unicode
    CreateWindow(L"Klasse1", L"Titel", //...);
    

    Dann aber bitte CreateWindowW benutzen.

    Das macht der Compiler automatisch.

    groovemaster schrieb:

    CodeFinder schrieb:

    Also das da oben geht, ohne Tchar.h 🙄

    Das funktioniert, weil TCHAR und TEXT in <winnt.h> definiert werden, welche wiederum durch <windows.h> eingebunden wird. <tchar.h> muss man jedenfalls immer separat einbinden, wenn Funktionalität daraus genutzt werden soll.

    Ahso...danke. Aber welche Funktionen sind denn bspw. in tchar.h deklariert (für die es sich lohnt diese Datei zu inkludieren) ?



  • CodeFinder schrieb:

    [...] Aber welche Funktionen sind denn bspw. in tchar.h deklariert [...] ?

    Wie wär's mit 'reinschauen? 😉

    *SCNR*

    Greetz, Swordfish



  • Swordfish schrieb:

    CodeFinder schrieb:

    [...] Aber welche Funktionen sind denn bspw. in tchar.h deklariert [...] ?

    Wie wär's mit 'reinschauen? 😉

    *SCNR*

    Greetz, Swordfish

    ttl



  • Also ganz komme ich da noch nicht mit.

    Was ist zum Beispiel, wenn ich der Funktion ein CharakterArray übergeben will?

    //Beispiel
    char myText[] = "Hello World";
    				TextOut(myHDC, 15, 15, myText, sizeof(myText) - 1);
    

    Das geht nicht, weil ich wieder Typcasten müsste, wie mach ich das also in solchen Fällen?



  • Wenn es in einer UNICODE Anwendung ist, dann machst du

    wchar_t myText[] = L"Hello World";
    TextOut( myHDC, 15, 15, myText, sizeof(myText) - 1 );
    

    und gut is.

    Greetz, Swordfish



  • Oder (sry Swordy, das ich das noch erwähne, ik weiß du magst keine Makros,a ber hier isses sinnvoll 😉 ) du benutzt das Makro TEXT und den Datentyp TCHAR, damit kannst du dann Zeichensatz-unabhängig kompilieren.

    Also so:

    TCHAR myText[] = TEXT("Hello World");
    TextOut( myHDC, 15, 15, myText, lstrlen(myText));
    


  • CodeFinder schrieb:

    Oder (sry Swordy, das ich das noch erwähne, ik weiß du magst keine Makros, aber hier isses sinnvoll 😉 ) du benutzt das Makro TEXT und den Datentyp TCHAR, damit kannst du dann Zeichensatz-unabhängig kompilieren.

    Sinvoll? Ich kann die Sinnhaftigkeit einer möglichen "Zeichensatz-unabhängigen" Compilierung nicht erkennen. Bei mir ist es so, dass ich entweder eine UNICODE-Anwendung oder eine ASCII- (oder ANSI-, nenn es wie du willst) Anwendung erstelle. Aber was hab' ich von einer .exe mit UNICODE und einer .exe der im Prinzip selben Anwendung in ASCII?

    Kannst du mir das bitte erklären.

    Greetz, Swordfish



  • Irgendwie geht das mit dem wchar_t nicht, er zeigt mir nun zwar schön einen String in meinen Fenster an, allerdings sieht der so aus:
    "Hello World||||||||"

    Das liegt denk ich irgendwie an dem sizeof ... wenn ich -13 mach passt es, also stimmt irgend was mit dem Stringdelimiter (wenn man das so schreibt) nicht, denk ich ...



  • Ähm, sorry, du nummst natürlich:

    wchar_t myText[] = L"Hello World";
    TextOut( myHDC, 15, 15, myText, sizeof( myText ) / sizeof( wchar_t ) - 1 );
    

    D!3ce schrieb:

    wenn ich -13 mach passt es, also stimmt irgend was mit dem Stringdelimiter (wenn man das so schreibt) nicht, denk ich ...

    Nein, am abschließenden L"\0" liegt's nicht, sondern daran, das TextOut im Parameter cbString die Anzahl der auszugebenden Zeichen haben möchte und nicht die Anzahl der Bytes.

    Greetz, Swordfish



  • Swordfish schrieb:

    [...]
    Kannst du mir das bitte erklären.
    [...]

    Jop, clör:
    Also es liegt ja auf der Hand, das ein UNICODE-Programm mehr Speicher verbraucht, als ein ANSI-Programm rischtisch ?

    Die Vorzüge von UNICODE liegen auch auf der Hand: Man kann auch exotische Sprachen bzw. Zeichen einbauen bzw. unterstützen.

    So nun kannst du, wenn du ein Programm schreibst, eine speicherintensive UNICODE-Version herausgeben und eine ANSI-Version, die jedoch einen kleinere Sprach-Unterstützung hat. Also so seh ich das zum mindestens 😉 .



  • Ui, super!

    Das funktioniert nun und ist auch einigermaßen logisch, danke schön!


Anmelden zum Antworten