Tabstop von Parent- nach Childdialog?
-
Gebe ich dem tab control WS_EX_CONTROLPARENT und seinem child-dialog auch WS_EX_CONTROLPARENT und noch DS_CONTROL, so wie es hier beschrieben wurde ... http://www.eggheadcafe.com/forumarchives/vcmfc/nov2005/post24544104.asp ... dann werden nur die Controls im Child-Dialog durchwandert.
Klicke ich dann manuell paar mal auf einen Tab-Reiter, erscheint dort zwar das focus rectangle; aber drücke ich dann Tab, friert das Programm wieder ein.
-
Hey sorry, das stimmt so nicht. Hab mich vertan.
Also nochmal:- Ohne diesen styles:
Drücke ich Tab, egal wo der Fokus gerade ist, geht das focus rectangle immer zum Tab-Reiter und nicht mehr weg.- Nur Child-Dialog (Die "Seite") mit WS_EX_CONTROLPARENT:
Alle Controls der Seite werden durchwandert, dann friert das Programm ein.
Klicke ich manuell auf einen Tab-Reiter, bis dieser das focus rectangel erhält, und drücke dann Tab, passiert gar nichts.- Nur Tab Control mit WS_EX_CONTROLPARENT:
Hat ein Control der Seite den Fokus, verschwindet er ins Nichts, wenn ich Tab drücke. Bekommt ein Tab-Reiter den Fokus + focus rectangle, friert das Programm beim drücken von Tab ein.- Tab Control und Child-Dialog mit WS_EX_CONTROLPARENT:
Controls der Seite werden immer wieder durchwandert. Aber zum Tab-Reiter komme ich nicht. Child-Dialog mit zusätzlich DS_CONTROL dasselbe...
-
Sollten die Child-Dialoge, also die Seiten, vielleicht eher den Hauptdialog als parent haben, anstatt das tab control?
Aber als ich das zunächst eh so gemacht hatte, wurde das tab control von den Seiten überzeichnet...

-
MOMG
Das Tab Control hatte kein WS_TABSTOP

Nun, es funktioniert jetzt aber nur, wenn die Child-Dialoge (Seiten) den Hauptdialog als Parent haben und nicht das Tab Control. Dann übermalen die Seiten aber, wie schon gesagt, das Tab Control...
Was könnte ich da machen?
-
SetWindowPos(tabHandle, childDialogHandle, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);... hilft, aber macht man das so? Oder geht es besser/eleganter?
-
Wenn SetWindowPos in dieser Form ausgeführt hast, dann sind Deine Seiten keine Kindcontrols des Tab-Ctrol. Was sie aber sein sollten.
Wie erzeigst Du das Tab-Ctrl und die Pages?
Schau Dir Deinen Konstrukt in Spy++ an.
Wenn das Tab-Ctrl und die Pages Siblings sind, dann ist das Verhalten normal und eben durch Dich so verursacht.
-
Moment mal, jetzt verwirrst du mich.
Also, im Internet wird meistens beschrieben, dass die Child-Dialoge das Tab Control als parent haben sollen.
Das ist aber angeblich falsch, in Wirklichkeit ist es "richtig", wenn die Child-Dialoge den Hauptdialog als parent haben. Also sowohl Tab Control als auch die Child-Dialoge haben den Hauptdialog als parent.
Und nur dann funktioniert das Durchswitchen aller Controls die man sieht inklusive Tab Control.
Nur muss man dann halt den Z-Order manuell setzen, damit die Child-Dialoge über dem Tab Control (Im Rahmen des Tab Control, aber halt nicht über den Reitern) gezeichnet werden.Habe da auch Unsinn geschrieben. Die Child-Dialoge sollen das Tab Control ja überdecken, aber nicht die Reiter. Das geht auch, müssen halt richtig positioniert/resized werden.
Also nochmal:
mainDialog | ---------------- | tabControl | ---------------- | | pageDialog1 pageDialog2 // Haut nicht hin, nur die Controls der page werden durchlaufen, dann endet das focus rectangle beim Reiter und will dort nicht mehr wegmainDialog | ---------------------------------- | | | tabControl pageDialog1 pageDialog2 // So funktioniert es tadellos, lediglich die pages müssen durch SetWindowPos in den Vordergrund gebracht werden
-
Und wo hast Du nun WS_EX_PARENTCONTROL gesetzt? Es muss natürlich in jedem KInde gesetzt werden!
Deine zweite Formführt dazu, dass ein Tab_Control dass die Child Windows überlagert diese auch übermalt. Sofern WS_CLIPSIBLINGS nicht gesetzt is.
-
Sowohl der Hauptdialog als auch die Childdialoge haben WS_EX_PARENTCONTROL gesetzt, die Childdialoge noch zusätzlich DS_CONTROL.
Übrigens: In einem Beispiel hier http://msdn.microsoft.com/en-us/library/bb760551 hat der Childdialog auch nicht als parent das Tab Control, sondern den Hauptdialog!
(Siehe vorletzter Codeblock OnSelChanged(), und das wird im darüberliegenden Codeblock mit dem Hauptdialoghandle aufgerufen)
-
Also soll ich es nun so machen? Oder geht es noch "richtiger"? Ich bekomme es nicht anders hin!
Siehe vorige Seite ganz unten, die untere Skizze. So funktioniert es, man kann alle Controls durchtabben, einschließlich der Tab-Reiter.
-
Schau Dir doch an wie es MS macht:
Ein Propertysheet Dialog hat auch das Tab-Control und die Seiten auf der selben Ebene.