Log-Fenster mit Eingabezeile als separates Toolwindow
-
Hallo!
Ich habe schon ein schönes Window für mein Programm erstellt. Dort wird viel gezeichnet. Jetzt will ich aber ein zusätzliches Window, wo ich eine Art Ein/Aus-gabekonsole brauche.
Das stelle ich mir so vor: ein Child-Window mit 1 Edit und 1 RichEdit Control drin. Der Benutzer soll dann einfach Kommandos eingeben und diese mit Enter ausführen.
Jetzt kommt die Frage: Wie mache ich das? Ich will lieber dieses zweites Window nicht im ersten Window einfügen, sondern eher als Toolwindow irgendwo drunter. Muss ich noch eine separate WNDPROC schreiben, die die Eingabe davon behandelt? Und wie wird es mit der Interkommunikation zwischen den beiden Fenstern klappen?
Danke im Voraus!
-
Also das Fenster brauch auf jeden fall eine eigene WNDPROC, da du da ja auch andere controls drinne hast. Die kommunikation könntest du über window messages machen, oder du hast irgenwo eine liste, die durch eine semaphore, ein mutex oder eine critical section geschützt ist, in der du die nachrichten, bzw. kommandos speicherst und den jeweils anderen thread das abarbeiten lässt sobald er keine messages zu verarbeiten hat.
-
Hmm, ja, gut. Ich würde gerne es erläutern, damit es klarer wird:
Wir haben also insgesamt 2 Fenster :
- 1. Hauptfenster, wo mein Programm läuft und ab und zu etwas drauf zeichnet.
- 2. Toolfenster (oder besser Konsole genannt), wo der Benutzer Befehle eingeben kann und auch die Resultaten davon betrachten.
Problem: Die beiden Fenster sollen irgendwie möglichst schnell und einfach miteinander kommunizieren. Die Konsole soll irgendwie Mitteilungen am Hauptfenster schicken und umgekehrt...
-
Ja jetzt hast es näher erklärt, und?
Ne Lösung für dein Problem mit der Kommunikation wurde dir doch genannt, oder was wilst du jetzt?schirrmie
-
Wo ist die RichEdit Klasse?
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnanchor/html/anch_win32com.asp
-
-
Ok, aber erstens muss ich das zweite Window richtig erstellen. Leider klappt das nicht.
cmd_win(HINSTANCE hinst, HWND hparent_, int x, int y, int w, int h) { WNDCLASSEX wc; wc.lpszClassName = L"CommandWindowClassName"; wc.lpfnWndProc = CWP; wc.style = CS_NOCLOSE; wc.hInstance = hinst; wc.hIcon = LoadIcon(0, IDI_APPLICATION); wc.hIconSm = 0; wc.hCursor = LoadCursor(0, IDC_ARROW); wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wc.lpszMenuName = 0; wc.cbSize = sizeof(wc); wc.cbClsExtra = 0; wc.cbWndExtra = 0; if(!RegisterClassEx(&wc)) { MessageBox(0, L"Registration of the command window class failed", L"Error", MB_OK); return; } RECT client; client.bottom = 0; client.left = 0; client.right = w; client.top = h; AdjustWindowRectEx(&client, WS_OVERLAPPEDWINDOW, false, WS_EX_OVERLAPPEDWINDOW); hwnd_ = CreateMDIWindow( L"CommandWindowClassName", L"Command prompt", MDIS_ALLCHILDSTYLES | WS_EX_TOOLWINDOW, x, y, w, h, hparent_, hinst, 0); if (!hwnd_) { MessageBox(0, L"Creation of the command window failed", L"Error", MB_OK); //hier stürzt das Programm ab return; } } LRESULT CALLBACK CWP(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { /*switch (uMsg) { // Check for windows messages was soll ich hier schreiebn? }*/ // Pass all unhandled messages to DefMDIChildProc return DefMDIChildProc(hwnd, uMsg, wParam, lParam); }
-
LRESULT CALLBACK CWP(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { /*switch (uMsg) { // Check for windows messages was soll ich hier schreiebn? }*/ // Pass all unhandled messages to DefMDIChildProc return DefMDIChildProc(hwnd, uMsg, wParam, lParam); }Wie wär's denn mit sowas?
boof fPromptFocussed; //... case WM_COMMAND: //... case WM_SETFOCUS: //... fPromptFocussed = trus; //... case WM_ENTER : //... if(fPromptFocussed) { //... PostThreadMessage(...) // oae. //... } //... fPromptFocussed = false;Grüsse
*this
-
Gast++, ich fürchte, das sei nicht das größte Problem. Etwas ist falsch mit dem Kreieren.

-
Zdravko schrieb:
Gast++, ich fürchte, das sei nicht das größte Problem. Etwas ist falsch mit dem Kreieren.

Ist
HWND hParent_denn schon valide wenn cmd_win gerufen wird?
"Wer" ist denn hParent_ eigentlich?Grüsse
*this
-
So sieht das HauptWindow:
WNDCLASSEX wc; wc.lpszClassName = classname;//bekannt wc.lpfnWndProc = p;//bekannt wc.style = CS_OWNDC | CS_VREDRAW | CS_HREDRAW; wc.hInstance = hinstance_;//aus der WinMain wc.hIcon = LoadIcon(0, IDI_APPLICATION); wc.hIconSm = 0; wc.hCursor = LoadCursor(0, IDC_ARROW); wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wc.lpszMenuName = 0; wc.cbSize = sizeof(wc); wc.cbClsExtra = 0; wc.cbWndExtra = 0; if(!RegisterClassEx(&wc)) { MessageBox(0, L"Registration of the main window class failed", L"Error", MB_OK); return; } RECT client; client.bottom = 0; client.left = 0; client.right = w;//bekannt client.top = h;//bekannt AdjustWindowRectEx(&client, WS_OVERLAPPEDWINDOW, false, WS_EX_OVERLAPPEDWINDOW); hParent_ = CreateWindowEx( WS_EX_OVERLAPPEDWINDOW, classname, // name of window class title, // title-bar string WS_OVERLAPPEDWINDOW, // top-level window 0, // horizontal position 0, // vertical position client.right, // width client.top, // height 0, // no owner window 0, // use class menu hinstance_, // handle to application instance 0); // no window-creation data
-
Kann mir jemand helfen? Besser wäre es, wenn die ganze Code neu geschrieben wird.
-
Zdravko schrieb:
Besser wäre es, wenn die ganze Code neu geschrieben wird.
Dann tu's doch...
greetz, Swordfish
-
Swordfish schrieb:
Zdravko schrieb:
Besser wäre es, wenn die ganze Code neu geschrieben wird.
Dann tu's doch...
greetz, Swordfish
Ok, dann tue ich es so.

-
Zdravko schrieb:
Swordfish schrieb:
Zdravko schrieb:
Besser wäre es, wenn die ganze Code neu geschrieben wird.
Dann tu's doch...
greetz, Swordfish
Ok, dann tue ich es so.

??? Weiss nicht was das bringen sollte; die Struktur der Codes ist imo korrekt. Fraglich ist nur wann die Fenster instanziiert werden und das lässt sich aus dem Code nich ersehen; wenn hInstance_ schon erzeugt ist ist's imo wirklich nur ein Problem mit dem Message-Dispatching.
Breakpoint drauf setzen!Grüsse
*this
-
Hmm, also erstens erstelle ich mit CreateWindowEx das Main Window. Dann erstelle ich mittels CreateMDIWindow das 2 Window. Dannach wird die Translate/Dispatch Sache durchgeführt! Wie schon gesagt - die Fehlermeldung ist beim:
hwnd_ = CreateMDIWindow( L"CommandWindowClassName", L"Command prompt", MDIS_ALLCHILDSTYLES | WS_EX_TOOLWINDOW, x, y, w, h, hparent_, hinst, 0); if (!hwnd_) { MessageBox(0, L"Creation of the command window failed", L"Error", MB_OK); //hier stürzt das Programm ab return; }
-
Zdravko schrieb:
Hmm, also erstens erstelle ich mit CreateWindowEx das Main Window. Dann erstelle ich mittels CreateMDIWindow das 2 Window. Dannach wird die Translate/Dispatch Sache durchgeführt! Wie schon gesagt - die Fehlermeldung ist beim:
hwnd_ = CreateMDIWindow( L"CommandWindowClassName", L"Command prompt", MDIS_ALLCHILDSTYLES | WS_EX_TOOLWINDOW, x, y, w, h, hparent_, hinst, 0); if (!hwnd_) { MessageBox(0, L"Creation of the command window failed", L"Error", MB_OK); //hier stürzt das Programm ab return; }Momentchen bitte mal - wo ist denn Dein MDI CLient Fenster?
Ich zähl da 2.- Den Hauptrahmen(parent = 0)
- Das MDI Child3 sollten's aber sein; Du kannst afaik das MDI Child nicht einfach in den Hauptrahmen legen!
Grüsse
*this
-
Gast++ schrieb:
Zdravko schrieb:
Hmm, also erstens erstelle ich mit CreateWindowEx das Main Window. Dann erstelle ich mittels CreateMDIWindow das 2 Window. Dannach wird die Translate/Dispatch Sache durchgeführt! Wie schon gesagt - die Fehlermeldung ist beim:
hwnd_ = CreateMDIWindow( L"CommandWindowClassName", L"Command prompt", MDIS_ALLCHILDSTYLES | WS_EX_TOOLWINDOW, x, y, w, h, hparent_, hinst, 0); if (!hwnd_) { MessageBox(0, L"Creation of the command window failed", L"Error", MB_OK); //hier stürzt das Programm ab return; }Momentchen bitte mal - wo ist denn Dein MDI CLient Fenster?
Ich zähl da 2.- Den Hauptrahmen(parent = 0)
- Das MDI Child3 sollten's aber sein; Du kannst afaik das MDI Child nicht einfach in den Hauptrahmen legen!
Was ich zitiert habe, ist genau das MDI Child.
Also mein Vorgang:
1. Erstellen des Hauptfensters
2. Erstellen des MDI Client Fensters - hier ist das Problem.
Warum?
-
"MDI Child" != "MDI Client" !!!
Das muss agfaik so aussehen:
Hauptfenster => "MDI Client" => "MDI Child"
Du brauchst 3; nicht 2.

Grüsse
*this
P.S.: Hast Du nen Petzold?
-
Ooops! Was ist das "MDI Client" ? Und wie erstelle ich so was?
P.S. Was ist Petzold?
