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







  • 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 Child

    3 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 Child

    3 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? 😕



  • Zdravko schrieb:

    Ooops! Was ist das "MDI Client" ? Und wie erstelle ich so was?
    P.S. Was ist Petzold? 😕

    Charles Petzold
    DER Autor DES Buches über Win32 Programmierung.

    Das hier
    http://www.joachimrohde.com/cms/xoops/modules/articles/article.php?id=90
    ist glaube ich eine nette Kurzeinführung in das Thema.

    Grüsse

    *this

    P.S.: Deshalb wars wichtig zu schauen wie und wo hParent_ usw erzeugt werden!


Anmelden zum Antworten