Fenster innerhalb von anderem Fenster bleiben lassen.



  • hallo Community,
    ich lade eine DLl in einen Prozess der ein Fenster hat. Ich möchte jedoch, dass man das Fenster aus meiner DLL nicht über den Rand bzw. clientbereich des anderen Ziehen kann. Als Parent setzen ist leider keine Lösung, da dann die eingabe für das Hauptfenster blockiert wird.



  • Hallo du solltes WM_MOVING und WM_SIZEING auswerten.
    Wenn dien Fenster auserhalb deiner Koordinaten ist dann
    kannt du durch Shreiben auf (LPRECT)lParam das Fenster wieder
    zurück schieben.


  • Mod

    Guest9xx schrieb:

    hallo Community,
    ich lade eine DLl in einen Prozess der ein Fenster hat. Ich möchte jedoch, dass man das Fenster aus meiner DLL nicht über den Rand bzw. clientbereich des anderen Ziehen kann. Als Parent setzen ist leider keine Lösung, da dann die eingabe für das Hauptfenster blockiert wird.

    Klar ist das eine Lösung, Du darfst nur nicht das Parent disablen. Wie erzegst Du denn Dein Fenster. Ich hoffe nicht als modalen Dialog...



  • mit DialogBox


  • Mod

    Guest9xx schrieb:

    mit DialogBox

    Eben!
    Erzeuge den Dialog nicht modal und gut ists.



  • danke so klappt es!

    extern "C" void __declspec(dllexport) Funcname()
    {
    	HWND lol = CreateDialog(hInstDll, MAKEINTRESOURCE(IDD_DIALOG1), Window, mainDlg);
           ShowWindow(lol, SW_SHOW); 
    }
    

    aber es kommt ja sofort zurück, die Funktion soll aber nicht abgeschlossen werden. Kann ich einfach ein while(1) Sleep(50); adden oder lieber

    MSG msg;
    	while(GetMessage(&msg, NULL, 0, 0))
    	{
    		TranslateMessage(&msg);
    		DispatchMessage(&msg);
    	}
    

    damit die Funktion Funcname nicht beendet wird?



  • ich war wohl etwas voreilig... obwohl ich CreateDialog mit dem HWND vom Parent benutze, kann ich das Fenster über den Clientbereich des parents ziehen 😞


  • Mod

    Wenn Du nicht willst das das Parent disabled wird, dann musst Du WSA_CHILD verwenden. Dann kannst Du es aber nicht mehr verschieben.
    Wenn Du willst, dass die Operation abgeschlossen wird, musst Du verhindern das im Parent was geschieht, es also disbalen.
    Irgendwie widersprechen sich Deine Wünsche in meinen Augen...

    Ansonsten hast Du den Tipp auf WM_MOIVING schon erhalten.



  • ich schreibe am besten noch was genau ich will und was ich versucht habe:
    Ich will, dass ich mein Dialog Fenster nicht über den Clientbereich des Hauptfensters des Programms ziehen kann, aber trotzdem den Focus auf das Hauptfenster setzen kann und mit ihm arbeiten kann (das Fenster aber trotzdem im Clientbereich bleibt). Ich habe CreateDialog mit dem Hauptfenster als parent benutzt, aber ich kann es immernoch über den Clientbereich ziehen. Und bei DialogBox wird das parent disabled -> keine Lösung.



  • Muss ich also WM_MOVING auswerten?


  • Mod

    Guest9xx schrieb:

    Muss ich also WM_MOVING auswerten?

    Lies doch einfach die Doku, dann kannst Du selber die Entscheidung treffen.
    http://msdn.microsoft.com/en-us/library/ms632632(VS.85).aspx

    Und hilft Dir das?



  • Vielleicht meint er sowas (child dialog):

    BOOL CALLBACK DialogMain(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam),BOOL
    {
    	if (uMsg == WM_CLOSE)
    	{
    		EndDialog(hwnd,0); PostQuitMessage(0);
    	}
    	return FALSE;
    }
    
    int main()
    {
    	HWND hDlg = CreateWindow(WC_DIALOG,TEXT("Parent dialog"),WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,0,CW_USEDEFAULT,0,0,0,0,0);
    	if (hDlg)
    	{
    		ShowWindow(hDlg, SW_SHOW);
    		CreateWindow(WC_DIALOG,TEXT("Child dialog"),WS_OVERLAPPEDWINDOW|WS_VISIBLE|WS_CHILD,100,100,200,100,hDlg,0,0,0);
    		SetWindowLong(hDlg, DWL_DLGPROC, &DialogMain);
    		MSG msg;
    		while (GetMessage(&msg,0,0,0))
    		{
    			if (!IsDialogMessage(hDlg, &msg))
    			{
    				TranslateMessage(&msg);
    				DispatchMessage(&msg);
    			}
    		}
    	}
    }
    

    Du kannst also CreateDialog statt CreateWindow nehmen, aber vergis WS_CHILD nicht.

    Martin, ohne (VS.85) schon mal versucht ? 🙂


Anmelden zum Antworten