TCHAR konvertieren in char*? (Möglichst einfach)



  • Bei so vielen Fehlern kann das doch nie gelaufen haben!!

    FERNman schrieb:

    int WINAPI WinMain (HINSTANCE hInst, HINSTANCE hPrevInst,
    					LPSTR lpcmdline, int ncmdshow)
    {
    	HWND   hWnd;
    	MSG    message;     // Nachricht
    
    	hWnd = ErstelleFenster(hInst);
    
            // Hauptfenster erstellen
    	ErstelleFenster(hInst);
            
            //aufruf der Funktion zum Hinzufügen von Buttons usw.
    	ErstelleElemente(hWnd, hInst);
    
    	// Prüfen, ob alles glatt ging
    	if (hWnd == NULL)
    		return (0);
    
    	while (GetMessage (&message, NULL, 0, 0) )
    	{
    		TranslateMessage (&message);
    		DispatchMessage (&message);
    
    	}
    
    	return (int)(message.wParam);
    
    } // WinMain
    

    Wenn

    hWnd = ErstelleFenster(hInst);
    

    schon schiefläuft wird

    ErstelleElemente(hWnd, hInst);
    

    wohl auch keinen Sinn machen. die zugehörige Fehlerabfrage kommt viel zu spät.

    Unsinnigerweise wird ErstelleFenster() doppelt aufgerufen - beide Male erfolglos.

    FERNman schrieb:

    HWND ErstelleFenster(HINSTANCE hInst)
    {
    	WNDCLASSEX windowclass; // Struktur für Fenstereigenschaften
    	HWND       hWnd;        // Fenster-Handle
    	const TCHAR szClassName[] = TEXT("Erstes Fenster");
    
    ...
    
    	// Fensterklasse registrieren
    	if (!RegisterClassEx(&windowclass))
    		return (0);
    
    	// Das Fenster erzeugen
    	hWnd =		CreateWindowEx(NULL,
    				szClassName,
    				TEXT("Das erste Fenster!"),
    				WS_OVERLAPPEDWINDOW | WS_VISIBLE,
    				325, 150,
    				1250, 720,
    				NULL,
    				NULL,
    				hInst,
    				NULL);
    }
    

    Wie kommt der Fensterhandle denn hier zurueck; immerhin wird er ja bei

    ErstelleElemente(hWnd, hInst);
    

    benötigt ?

    Beim zweiten (unsinnigen) Aufruf wird er dann garnicht erst zugewiesen ?

    Der folgender Code ist auch absolut sinnfrei; wurde schon gesagt:

    FERNman schrieb:

    TCHAR szTEXT[512];
      int Resultat;
      GetWindowText(hLabel, szTEXT, 512);
      if (szTEXT == "Hallo")  { ...
    

    Üblicherweise nimmt man dafür strcmp() oder (in deinem Fall) die entsprechende
    UNICODE-Version davon.



  • Danke für die schnellen Antworten!
    Ja ich gebe zu, ich habe noch nicht so weit gedacht, dass man c-strings nicht vergleichen kann.

    Aber zur zweiten Antwort:
    Wenn ich meinen (zugegebenermaßen Sinnfreien) Code entferne, dann Läuft alles einwandfrei. Ich weiß nicht was du hast. Gut, es kann sein das der doppelaufruf sinnlos ist, probiere ich nachher gleich aus

    MFG
    FERNman



  • FERNman schrieb:

    und mit der MultiByteToWideChar() Funktion komme ich iwie nicht zurecht.

    #include <windows.h>
    #include <iostream>
    #include <string>
    
    using namespace std;
    
    wstring toWide(string in, UINT from)
    {
       int len = MultiByteToWideChar(from, 0, in.c_str(), -1, 0, 0);
    
       if(!len)
          cout << "Fehler toWide?!\n";
    
       WCHAR *res = new WCHAR[len];
    
       int result = MultiByteToWideChar(from, 0, in.c_str(), -1, res, len);
    
       if(result != len)
          cout << "Fehler toWide?!\n";
    
       wstring s(res);
    
       delete[] res;
    
       return s;
    }
    
    string toMultiByte(wstring in, UINT to)
    {
       const int len = WideCharToMultiByte(to, 0, in.c_str(), -1, 0, 0, 0, 0);
    
       if(!len)
          cout << "Fehler toMBCS 1?!\n";
    
       char *res = new char[len];
    
       int result = WideCharToMultiByte(to, 0, in.c_str(), -1, res, len, 0, 0);
    
       if(result != len)
          cout << "Fehler toMBCS2?!\n";
    
       string s(res);
    
       delete[] res;
    
       return s;
    }
    
    string AnsiToUTF8(const string &in)
    {
       wstring tmp = toWide(in, CP_ACP);
       string res = toMultiByte(tmp, CP_UTF8);
       return res;
    }
    
    string UTF8ToAnsi(const string &in)
    {
       wstring tmp = toWide(in, CP_UTF8);
       string res = toMultiByte(tmp, CP_ACP);
       return res;
    }
    

  • Mod

    Es ist weitaus einfacher die ATL Macros zu verwenden CT2A CW2A CA2W CA2T etc...
    die lost der Compiler auch auf wenn eben nichts zu konvertieren ist bei den T Varianten.





  • Martin Richter schrieb:

    Es ist weitaus einfacher die ATL Macros zu verwenden CT2A CW2A CA2W CA2T etc...
    die lost der Compiler auch auf wenn eben nichts zu konvertieren ist bei den T Varianten.

    Wenn ich mich nicht irre, hab ich die bei meiner Express-Version nicht?


  • Mod

    Belli schrieb:

    Martin Richter schrieb:

    Es ist weitaus einfacher die ATL Macros zu verwenden CT2A CW2A CA2W CA2T etc...
    die lost der Compiler auch auf wenn eben nichts zu konvertieren ist bei den T Varianten.

    Wenn ich mich nicht irre, hab ich die bei meiner Express-Version nicht?

    Stimmt. ATL ist nicht im Express drin...
    Aber die Sourcen fliegen auch so im Netz herum, dass man sich den Ansatz schnel abkupfern kann. 🙂



  • Danke, habs hinbekommen.

    Aber ich habe noch eine Frage, wie kann ich CreateFont() auf einen Statischen Text anwenden? Mit Select Objekt oder? Wie funktioniert diese Funktion?

    MFG
    FERNman


  • Mod

    SetFont / WM_SETFONT



  • FERNman schrieb:

    Wenn ich meinen (zugegebenermaßen Sinnfreien) Code entferne, dann Läuft alles einwandfrei. Ich weiß nicht was du hast. Gut, es kann sein das der doppelaufruf sinnlos ist, probiere ich nachher gleich aus.

    Das es zu laufen scheint, heisst nicht das es richtig ist.

    Der Fensterhandle könnte wohl NULL sein 😃

    In Deinem Fall kann aber auch das nicht sein, da

    FERNman schrieb:

    // Prüfen, ob alles glatt ging
    	if (hWnd == NULL)
    		return (0);
    

    Das ganze beenden würde.

    Bleibt noch die Möglichkeit, das der gepostete Code nicht mit dem verwendeten
    übereinstimmt.



  • Ja, Danke für Eure Antworten!

    Bleibt noch die Möglichkeit, das der gepostete Code nicht mit dem verwendeten
    übereinstimmt.

    Also das kann schonmal nicht sein, da ich meinen Code einfach genommen habe und ihn hierher kopiert habe :D.

    Ja es kann schon sein dass ich Fehler habe, und dass der Fensterhandle NULL sein kann, das wusste ich nicht, ich beschäftige mich ja auch erst seit Drei Tagen mit der WinApi.

    MFG
    FERNman


Anmelden zum Antworten