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 ausMFG
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; }
-
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.
-
Bezüglich multi-char <> wide-char Strings...
http://www.c-plusplus.net/forum/p1972600#1972600
http://www.c-plusplus.net/forum/p1850229#1850229
-
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?
-
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
-
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