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



  • Hey Leute,

    Wieder mal eine Frage meinerseits:

    Und zwar habe ich heute mit einem kleinen Fenster herumgespielt, und dabei bin ich auf ein Hindernis gestoßen. Ich habe nämlich ein kleines Fenster geschrieben, doch nun weiß ich nicht weiter, ich möchte Text von einem Label abrufen und diesen dann mit "if" oder noch besser "switch" vergleichen und vom Inhalt abhängige Reaktionen daraus hervorgehen lassen. Außerdem bringt Unicode abschalten gar nichts, falls das gleich jemand schreiben möchte, und mit der MultiByteToWideChar() Funktion komme ich iwie nicht zurecht. Aber ich möchte nicht mehr länger schreiben, hier einmal der Quellcode:

    #define ID_BUTTON 4000
    #define ID_TEXT 4001
    #define ID_BUTTON1 4002
    #define ID_LABEL 4003
    #define ID_BUTTON2 4004
    #include <windows.h>
    
    // Prototyp der Callback-Funktion
    LRESULT CALLBACK WindowProc (HWND hWnd, UINT message,
    							 WPARAM wParam, LPARAM lParam);
    HWND ErstelleFenster(HINSTANCE hInst);
    void ErstelleElemente(HWND hWnd, HINSTANCE hInst);
    void ErstelleWeitereElemente(HWND hWnd, HINSTANCE hInst);
    
    HINSTANCE hInst;
    HWND hLabel;
    HWND hButton;
    HWND hText;
    HWND hButton1;
    HWND hButton2;
    
    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
    
    LRESULT CALLBACK WindowProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    	switch (message)
    	{
    		case WM_DESTROY:
    		{
    			PostQuitMessage (0);
    			return (0);
    
    		}
    
    		case WM_KEYDOWN:
    		{
    			switch (wParam)
    			{
    				case VK_ESCAPE:
    				{
    					PostQuitMessage (0);
    					return (0);
    
    				}
    
    			}
    		} break;
    
    		case WM_COMMAND:
    		{
    						   switch (wParam)
    						   {
    						   case ID_BUTTON:
    						   {
    											 int Resultat;
    
    											 Resultat = MessageBox	(hWnd, TEXT("Wirklich Beenden?"),
    																	 TEXT("Programm verlassen"),
    																	 MB_YESNO | MB_ICONQUESTION);
    											 if (Resultat == IDYES)
    											 {
    												 PostQuitMessage(0);
    												 return (0);
    											 }
    											 return (0);						   
    						   }
    						   case ID_BUTTON1:
    						   {
    											  ErstelleWeitereElemente(hWnd, hInst);
    						   }
    						   case ID_BUTTON2:
    						   {
    											  TCHAR szTEXT[512];
    											  int Resultat;
    
    											  GetWindowText(hLabel, szTEXT, 512);
    
    											  if (szTEXT == "Hallo")
    											  {
    												  Resultat = MessageBox(hWnd, TEXT("Username?"),
    													  TEXT("Hey Dude."),
    													  MB_OK | MB_ICONQUESTION);
    											  }
    						   }
    						   }
    		}
    		} 
    
    	// Die Nachricht wurde nicht von uns verarbeitet, also
    	// von Windows verarbeiten lassen.
    	return (DefWindowProc (hWnd, message, wParam, lParam) );
    
    } // WindowProc
    
    HWND ErstelleFenster(HINSTANCE hInst)
    {
    	WNDCLASSEX windowclass; // Struktur für Fenstereigenschaften
    	HWND       hWnd;        // Fenster-Handle
    	const TCHAR szClassName[] = TEXT("Erstes Fenster");
    
    	// 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;
    
    	windowclass.cbClsExtra = 0;
    	windowclass.cbWndExtra = 0;
    
    	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);
    	windowclass.hbrBackground = (HBRUSH) CreateSolidBrush (RGB (240, 240, 240));
    
    	// Ein Menü brauchen wir nicht
    	windowclass.lpszMenuName = NULL;
    
    	windowclass.lpszClassName = szClassName;
    
    	// 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);
    }
    
    void ErstelleElemente(HWND hWnd, HINSTANCE hInst)
    {
    	hButton =	CreateWindow(TEXT("BUTTON"),
    							TEXT("Beenden"),
    							BS_PUSHBUTTON | WS_VISIBLE | WS_CHILD,
    							1080, 600,
    							70, 30,
    							hWnd,
    							(HMENU)ID_BUTTON,
    							hInst,
    							NULL);
    
    	hText	=	CreateWindow(TEXT("STATIC"),
    							TEXT("© Gabs Studios 2013"),
    							WS_VISIBLE | WS_CHILD,
    							1080, 650,
    							150, 16,
    							hWnd,
    							(HMENU)ID_TEXT,
    							hInst,
    							NULL);
    
    	hButton1 =  CreateWindow(TEXT("BUTTON"),
    							TEXT("Klick mich :)"),
    							BS_PUSHBUTTON | WS_VISIBLE | WS_CHILD,
    							550, 100,
    							150, 30,
    							hWnd,
    							(HMENU)ID_BUTTON1,
    							hInst,
    							NULL);
    }
    
    void ErstelleWeitereElemente(HWND hWnd, HINSTANCE hInst)
    {
    	hLabel =	CreateWindow(TEXT("EDIT"),
    							TEXT("      Gib deinen Namen ein!"),
    							WS_VISIBLE | WS_CHILD | WS_BORDER,
    							525, 150,
    							200, 30,
    							hWnd,
    							(HMENU)ID_LABEL,
    							hInst,
    							NULL);
    
    	hButton2 = CreateWindow(TEXT("BUTTON"),
    							TEXT("Fertig?"),
    							BS_PUSHBUTTON | WS_VISIBLE | WS_CHILD,
    							590, 200,
    							70, 30,
    							hWnd,
    							(HMENU)ID_BUTTON2,
    							hInst,
    							NULL);
    }
    

    Hoffe auf eure Antworten

    MFG
    FERNman



  • Du musst zuerst mal Grundlagen lernen: Man kann C-Strings nicht mit dem Operator

    ==
    

    vergleichen!



  • 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