TCHAR Variable bleibt nach zweitem Aufruf von GetWindowText leer?
-
Hallo liebe leutz,
ich habe mal wieder außergewöhnliche Probleme, schande über mein Haupt :).
Also mein Problem ist folgendes: Ich habe 2 Fenster mit jeweils einer eigenen WNDCLASS sowie
WndProc, nennen wir sie mal jetzt, außergewöhnlicher weise, Fenster 1 und Fenster 2.Jetzt bekomme ich als erstes Fenster 1 zu sehen, in diesem existiert ein Button und ein Edit-Control,
wenn man den Button betätigt soll Fenster 2 erscheinen (SW_SHOW), dabei soll der eingegebene Inhalt aus
dem Edit-Control (GetWindowText) ausgelesen werden und dann in Fenster 2 als Überschrift dargestellt
werden (WM_PAINT - DrawText).Das funktioniert soweit auch erstmal gut, ABER
leider nur beim ersten mal, wenn ich dann nämlich Fenster 2 schließe (WM_CLOSE - SW_HIDE) und dann
wieder auf Button Click einblende (SW_SHOW), bleibt die Überschrift leer, um genauer zu sein meine
Variable (TCHAR) bleibt leer, das weiß ich da ich direkt nach GetWindowText, mittels MessageBox,
meine Variable abgefragt habe, beim ersten Aufruf (Click auf Button) wurde der Text aus dem Edit-Control
richtig wiedergegeben, beim zweiten Aufruf ( (SW_HIDE) SW_SHOW) bleibt die Variable leer und kann
von keinem Punkt im Programm gültig wiedergegeben werden (MessageBox).
ABER nicht das das alles wäre
Wenn ich Fenster 2 über das "X" oben rechts in der Titelleiste des Fensters schließe, funktioniert alles einwandfrei, aber sobald ich Fenster 2 über einen in diesem erstellten Button, nennen wir ihn Button 2,
schließe (WM_COMMAND - switch(HMENU) - SendMessage(hwnd, WM_CLOSE, 0, 0)), funktioniert
es ebend nicht. Ich fange die WM_CLOSE message ab und schreibe dort ShowWindow(... SW_HIDE),
ich bekomme doch in beiden fällen (X und SendMessage WM_CLOSE) die Nachricht WM_CLOSE und reagiere doch in beiden Fällen gleich auf diese Nachricht oder täusche ich mich da?
Und warum funktioniert das nicht? Ich zerbrech mir schon seit 2 Tagen den Kopf.man man lange Rede garkein Sinn :), ich hoffe jemand versteht das vielleicht doch und kann mir da einen
Tipp geben, ich wäre sehr dankbar.MFG
DeeJayExTasy
und hier ein paar Beispiele wie das in wirklichkeit aussieht:
//Globale Variable static TCHAR szProjektName[256] = {0}; static HWND hwndWindow1, hwndWindow2; WNDCLASS wndclass; wndclass.style = CS_ENABLE; wndclass.lpfnWndProc = WndProcWindow1; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.hInstance = hInstance; wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION); wndclass.hCursor = LoadCursor(NULL, IDC_ARROW); wndclass.hbrBackground = MyBrushWindow1; wndclass.lpszMenuName = NULL; wndclass.lpszClassName = szSeite1; if(!RegisterClass (&wndclass)) { MessageBox(NULL, "Fehler beim erzeugen des fensters!", "Fehler!", MB_OK | MB_ICONERROR); return 0; } wndclass.style = CS_ENABLE; wndclass.hbrBackground = MyBrushWindow2; wndclass.lpfnWndProc = WndProcWindow2; wndclass.lpszClassName = szSeite2; if(!RegisterClass (&wndclass)) { MessageBox(NULL, "Fehler beim erzeugen des fensters!", "Fehler!", MB_OK | MB_ICONERROR); return 0; } hwndWindow1 = CreateWindow(szSeite1, "Seite 1", WS_OVERLAPPEDWINDOW, 300, 200, 700, 600, NULL, NULL, hInstance, NULL); hwndWindow2 = CreateWindow(szSeite2, "Seite 2", WS_OVERLAPPEDWINDOW, 300, 200, 700, 600, NULL, NULL, hInstance, NULL); //In WndProc Window1 (Button + Edit) static HWND hwndErstellen, hwndEdit; case WM_CREATE: hwndErstellen = CreateWindow ( "Button", "Erstellen", WS_CHILD | WS_VISIBLE | BS_OWNERDRAW, 340, 30, 150, 30, hwndWindow1, (HMENU)3, ((LPCREATESTRUCT) lParam)->hInstance, NULL); hwndEdit = CreateWindowEx ( WS_EX_CLIENTEDGE, "edit", "", WS_CHILD | WS_VISIBLE, 20, 30, 300, 30, hwndWindow1, (HMENU)2, ((LPCREATESTRUCT) lParam)->hInstance, NULL); return 0; break; case WM_COMMAND: switch(LOWORD(wParam)) { case 3: GetWindowText(hwndEdit, szProjektName, 255); MessageBox(NULL, szProjektName, "hallo", MB_OK); ShowWindow(hwndWindow2, SW_SHOW); return 0; break; //In WndProcWindow2 static HWND hwndSchliessen; case WM_CREATE: hwndSchliessen = CreateWindow ("button", "schliessen", WS_CHILD, 490, 510, 150, 30, hwndWindow2, (HMENU)2, ((LPCREATESTRUCT) lParam)->hInstance, NULL); return 0; break; case WM_COMMAND: switch(LOWORD(wParam)) { case 2: ... ... ... SendMessage(hwndWindow2, WM_CLOSE, 0, 0); return 0; break; case WM_CLOSE: ShowWindow(hwndWindow2, SW_HIDE); SetFocus(hwndWindow1); return 0; break;
Das sind selbstverständlich nur ausschnitte.
-
Ich hab's mir jetzt nicht sooo genau angesheen, muss ich gestehen. Was mir aber sofort ins Auge springt:
case WM_CREATE: hwndErstellen = CreateWindow(..., hwndWindow1, ...);
Du bekommst WM_CREATE gesendet schon bevor CreateWindow(szSeite1) zurückkehrt. Das soll heißen, dass an dieser Stelle noch kein vernünftiger Wert in hwndWindow1 stehen kann. Du musst also das Erstellen der Children entweder an die Stelle nach CreateWindow(szSeite1) verschieben oder aber das an die WndProcWindow1 übergebene HWND als Parent verwenden.
Für WndProcWindow2 gilst das dann natürlich ebenso.
-
@deejayextasy
Was soll der Code?
Willst du uns verarschen?
-
Hallo Mox,
vielen Dank schon mal für deinen Tipp, ich bin heute etwas schwer von begriff,
kannst du mir das bitte noch etwas genauer erklären was du damit meinst:Du bekommst WM_CREATE gesendet schon bevor CreateWindow(szSeite1) zurückkehrt.
Ich lese das Edit Control ja bei Button Click aus und nicht bei WM_CREATE.
Wenn ich dich richtig verstehe, sollte das mir helfen? :
... wndclass.style = CS_ENABLE; wndclass.hbrBackground = MyBrushWindow2; wndclass.lpfnWndProc = WndProcWindow2; wndclass.lpszClassName = szSeite2; if(!RegisterClass (&wndclass)) { MessageBox(NULL, "Fehler beim erzeugen des fensters!", "Fehler!", MB_OK | MB_ICONERROR); return 0; } hwndWindow1 = CreateWindow(szSeite1, "Seite 1", WS_OVERLAPPEDWINDOW, 300, 200, 700, 600, NULL, NULL, hInstance, NULL); hwndErstellen = CreateWindow ( "Button", "Erstellen", WS_CHILD | WS_VISIBLE | BS_OWNERDRAW, 340, 30, 150, 30, hwndWindow1, (HMENU)3, ((LPCREATESTRUCT) lParam)->hInstance, NULL); hwndEdit = CreateWindowEx ( WS_EX_CLIENTEDGE, "edit", "", WS_CHILD | WS_VISIBLE, 20, 30, 300, 30, hwndWindow1, (HMENU)2, ((LPCREATESTRUCT) lParam)->hInstance, NULL); ...
Deinen zweiten Tipp erfülle ich bereits. :
LRESULT CALLBACK WndProcWindow1(HWND hwndWindow1, UINT message, WPARAM wParam, LPARAM lParam) ... case WM_CREATE: hwndErstellen = CreateWindow ( "Button", "Erstellen", WS_CHILD | WS_VISIBLE | BS_OWNERDRAW, 340, 30, 150, 30, hwndWindow1, (HMENU)3, ((LPCREATESTRUCT) lParam)->hInstance, NULL); hwndEdit = CreateWindowEx ( WS_EX_CLIENTEDGE, "edit", "", WS_CHILD | WS_VISIBLE, 20, 30, 300, 30, hwndWindow1, (HMENU)2, ((LPCREATESTRUCT) lParam)->hInstance, NULL);
Die Parents meiner Controls heißen gleich dem an WndProc1 übergebenen HWND,
wenn du das meintest?Sorry für meine Begriffsstutzigkeit.
MFG
DeeJayExTasy