Childelemente werden in WM_CREATE nicht angezeigt
-
Guten Tag,
Ich komme hier mit einem simplen Programm nicht klar. Das Problem besteht darin, dass das RichEdit-Fenster zwar angezeigt wird, wenn CreateWindow noch vor dem ersten MessageLoop stattfindet, jedoch nichts zu sehen ist, wenn CreateWindow erst unter WM_CREATE aufgerufen wird. Derartige Probleme hatte ich schon oefter, so dass ich endlich den Grund dafuer finden moechte. Ausserdem scheint es in diesem Codebeispiel so, dass das erste WM_SIZE noch vor dem erstellen der RichEdit Control gesendet wird, weil die Control erst die Groesse aendert, wenn man am laufenden Programm-Fenster herumspielt. Natuerlich wurde schon geprueft, ob WM_CREATE und WM_SIZE gesendet wurden.
#include <windows.h> #include <richedit.h> INT WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, INT); LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); HWND hWnd; HWND hRichEdit; HINSTANCE hInstance; INT WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, INT nCmdShow) { MSG msg; hInstance = hInst; LoadLibrary("RICHED32.DLL"); WNDCLASS wc = {0, WndProc, 0, 0, hInstance, (HICON)LoadIcon(hInstance, (LPCTSTR)1001), LoadCursor(0,IDC_ARROW), (HBRUSH)COLOR_BACKGROUND, 0, "anChat"}; RegisterClass(&wc); hWnd = CreateWindow("anChat", "anChat v0.1.1", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 800, 600, HWND_DESKTOP, NULL, hInstance, NULL); ShowWindow(hWnd, nCmdShow); // Position 1: Steht CreateWindow hier, wirds angezeigt. hRichEdit = CreateWindow("RICHEDIT", "", WS_BORDER | WS_CHILD | WS_VISIBLE | ES_MULTILINE | WS_VSCROLL, 5, 5, 100, 100, hWnd, (HMENU) 1, hInstance, NULL); while(GetMessage(&msg, 0, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return (msg.wParam); } LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_CREATE: // Position 2: Steht CreateWindow hier, wird nichts angezeigt. // hRichEdit = CreateWindow("RICHEDIT", "", WS_BORDER | WS_CHILD | WS_VISIBLE | ES_MULTILINE | WS_VSCROLL, 5, 5, 100, 100, hWnd, (HMENU) 1, hInstance, NULL); break; case WM_SIZE: MoveWindow(hRichEdit, 5, 5, LOWORD(lParam) - 10, HIWORD(lParam) - 10, true); break; case WM_DESTROY: PostQuitMessage(0); break; } return DefWindowProc(hwnd, message, wParam, lParam); }
Ich bedanke mich schonmal im voraus,
MfG aneas
-
Hallo,
Ich vermute der Grund dafür, dass das RichEdit-Fenster in der 2. Position nicht zur Erscheinung kommt ist der, dass das Parent-Fenster ohne dem Window-Style WS_VISIBLE erstellt wird. Es wird erst sichtbar wenn die CreateWindow Funktion zurückkehrt und die Funktion ShowWindow aufgerufen wird.
Probier mal aus CreateWindow mit WS_VISIBLE aufzurufen.
-
Nein, geht leider nicht mit WS_VISIBLE, habe das vorhin auch schon probiert
MfG aneas
-
Ich hab schon mal eine RichEdit-Box in einem MDI-Child Fenster erstellt, und da gab es keine Probleme als ich die RE-Box beim Behandeln der WM_CREATE Message erstellt habe.
Meine Parameter unterscheiden sich aber wie folgt:
diese Styles hab ich verwendet: WS_CHILD | WS_VISIBLE | ES_NOHIDESEL | ES_SAVESEL | ES_READONLY | ES_SUNKEN | ES_MULTILINE
und statt (HMENU) 1 hab ich einfach NULL hingeschriebenHast du schon versucht den WS_BORDER Style auszulassen?
-
Habe es gerade erfolglos versucht. Ehrlich gesagt bezweifle ich auch, dass es etwas mit CreateWindow der RichEditControl zu tun hat, weil der Befehl an Position 1 wunderpraechtig funktioniert
MfG aneas
-
Ändere hWnd mal auf hwnd in der 2. Position. Is ja klar, dass die globale Variable noch keinen Wert beinhaltet
Ich würde empfehlen statt hWnd bezeichnendere Namen zu verwenden w.z.B. g_hMainWnd. (g für global, MainWnd für Hauptfenster)
-
Es geht
Hmm, wenn du mir jetzt noch sagen kannst, warum hWnd noch keinen Wert hat (imho hab ich ihn in WinMain zugewiesen *g*), bist du meinem persoenlichen Gott-Status einen Schritt naeherMfG aneas
-
Das ist ganz einfach: Die Funktion CreateWindow kehrt solange nicht zurück bis die WndProc mit dem Behandeln der WM_CREATE Message fertig ist. Da hWnd in der Zeit noch uninitialisiert ist darfst du diese Variable nicht verwenden. Außerdem, wieso die globale Variable verwenden, wenn sie die lokale da auch anbietet?
PS.: Vergöttere nicht mich, sondern Jenen, dem es gebührt.
-
OK, bisher hatte ich angenommen, dass WndProc erst nach CreateWindow aufgerufen wird. So haette ich das Problem nur durch Zufall selbst loesen koennen.
Ausserdem, wieso die interne Variable verwenden, wenn ich die globale eh habe?Danke fuer die Loesung
MfG aneas
-
Aneas schrieb:
Ausserdem, wieso die interne Variable verwenden, wenn ich die globale eh habe?
Du kannst dir dann ja ggf. die globale Variable sparen - dadurch wird das Programm imho recht schnell unübersichtlich