CDockablePane und Tastenkürzel des Hauptfensters
-
Hallo,
Ich habe eine MFC-Anwendung mit CDockablePanes. Es wird ein CDialog Modal aufgerufen. Dieser Dialog gibt die Kontrolle an ein CDockablePane ab, das schon geöffnet war. Dazu wird mittels ClipCursor() der Cursor innerhalb des CDockablePane gehalten. Außerdem mit SetCapture() die Maus an das CDockablePane gebunden. Die Funktionalität an sich klappt prima. Das Problem, dass ich habe ist, dass man in diesem Zustand mit Alt+Buchstabe ins Hauptmenü kommt bzw. Tastenkürzel ala Strg-O des Hauptfensters funktionieren und dadurch mitten drin andere Fenster modal aufgehen können. Das bringt natürlich alles durcheinander. Das interessante ist, das passiert nur, wenn das CDockablePane im Floating-Modus ist. Wenn es angedockt ist, passiert das nicht, dann funktionieren die Tastenkürzel nicht.
Woher kommt das?
Wie schaffe ich es, dass die Tastenkürzel nicht funktionieren?seb
-
Ein modaler Dialog kann keine Kontrolle an ein Fenster geben, dass von einem Frame geownt wird, der gerade disabled wurde.
Dein Konzept ist für die Katze.
Das kann so nicht funktionieren.Grundsätzlich: Deine DockablePanes wurden auch brav mit EnableDocking und DockControlBar bekannt gemacht?
Intern hat die MFC "normalerweise" einen Mechanismus, der Fenster die flaoting sind als eigene Frames behandelt und disabled wenn DoModal aufgerufen wird.
Ansonsten: Ünbergib immer das Handle des MainFrames an den Dialog! Sonst mag es noch andere Probleme geben.
-
Hallo,
Danke für die Antwort.
Martin Richter schrieb:
Ein modaler Dialog kann keine Kontrolle an ein Fenster geben, dass von einem Frame geownt wird, der gerade disabled wurde.
Dein Konzept ist für die Katze.
Das kann so nicht funktionieren.Tja, ich habe das leider so "geerbt". Also früher war das nen normaler CDialog, der nicht modal war und der wurde halt von dem modalen Dialog "benutzt". Ich habe das Programm halt etwas modernisiert und DockPanels eingeführt. Da hab ich den nichtmodalen Dialog eben durch ein DockPanel ersetzt.
Der Dockpanel-Dialog muss ja auch nicht direkt funktionieren. Da ist ein Bild drin und die Maus ist drin gefangen. Die Maustasten müssen noch funktionieren und das tun sie ja - also das Dockpanel bekommt dann die Messages. Leider nicht vom Mausrad - SetFocus() geht irgendwie auch nicht auf das Fenster (da hat dann keiner den Fokus).Martin Richter schrieb:
Grundsätzlich: Deine DockablePanes wurden auch brav mit EnableDocking und DockControlBar bekannt gemacht?
Die werden im MainFrm mit EnableDocking und DockPane bzw. FloatPane eingebunden - so wie es der Assistent beim Anlegen des Ausgangsprojektes gemacht hat. DockControlBar benutz ich nicht direkt.
Martin Richter schrieb:
Intern hat die MFC "normalerweise" einen Mechanismus, der Fenster die flaoting sind als eigene Frames behandelt und disabled wenn DoModal aufgerufen wird.
Ja, die sind dann ja auch disabled. Ich hol das dann vom Dialog aus in den Vordergrund, indem ich das Frame vom FloatPane in den Vordergrund holen - das funktioniert so weit. Und wenn ich das wieder rückgängig mache, dann hat auch wieder mein modaler Dialog ganz normal den Focus und alles und man kommt ans FloatPane nicht ran. Nur eben, wenn das FloatPane im Vordergrund ist und mit SetCapture die Maus hat, dann funktionieren die Tastenkürzel vom MainFrm und das ist schlecht.
Ich weiß, dass das sicher nie so gedacht war, aber leider erfordert es der Arbeitsablauf des Programms.
Martin Richter schrieb:
Ansonsten: Ünbergib immer das Handle des MainFrames an den Dialog! Sonst mag es noch andere Probleme geben.
Der modale Dialog hat als Owner und Parent das MainFrm.
seb
-
Ich merk grad, dass ich das Tasten-Problem nur habe, wenn ich mit SetWindowPos() das Fenster (FloatPanel) größer mache bzw. mit BringWindowToTop() das Fenster vor hole. Wenn ich das Fenster so lasse, wie es ist, dann funktionieren die Tastenkürzel bzw. Alt+Taste fürs Menü nicht.
-
Hallo,
Gibt es eine Möglichkeit dem MainFrm temporär beizubringen, dass Hotkeys und Alt+Buchstabe (Menü) nicht funktionieren? Das würde mir schon weiter helfen.
-
Hallo,
So, ich weiß, das Ganze ist nicht schön, aber ich hab da jetzt doch wenigstens ne Lösung gefunden. Ich hab mal in deinem (Martin Richter) Blog angefangen zu lesen und hab doch einiges Interessantes gefunden. Und auch die Anregung zu meiner Lösung: PreTranslateMessage im MainFrm fängt jetzt WM_SYSKEYDOWN ab.
Danke für deinen Blog!