Dialog-Resource in TabControl



  • Hallo euch allen. 🙂

    Ich stecke momentan etwas fest. Folgendes habe ich versucht:

    Eine Klasse die von CDockablePane ableitet und ein TabControl als Member hat, soll in ihren Tabs Dialog-Resourcen anzeigen.
    Meine Resourcen mit Basisklasse CDialog konnte ich über AddTab dem Tabcontrol übergeben.

    Das Ergebnis sieht bestens aus, genau wie ich's wollte.
    Ich kriege ein Dockablepane, das verschiedene Tabs besitzt und in jedem Tab einen anderen Dialog.

    Das Problem ist, dass ich keine Maus-Events in die Dialoge kriege. 😞
    Tasten sind kein Problem, ich kann in den CEdits der Dialoge schreiben, ich kann mit Enter die Buttons anwählen etc.. Aber wenn ich mit der Maus auf ein Element eines Dialoges klicke, wird passiert nix.
    Höchstens dass die Auswahl die ich mit Tab verändert habe, wieder zurück auf die Ausgangssituation gesetzt wird. Egal wo ich in den Dialog klicke.

    Ich weiss nicht, ob das TabControl vielleicht alle Maus-Events abgreift und die Dialoge deshalb diese Events nicht mehr bekommen,.. oder ob ich meine Resourcen vielleicht von etwas anderem ableiten sollte als CDialog. 😕

    Hoffentlich hat jemand von euch ein Tip für mich. 🙂

    Ich weiss, Code wäre hier bestimmt hilfreich, aber grade komm ich nicht wirklich an mein Zeugs ran. Nach Feierabend und so 😉

    "Grob" überschlagen aus dem Kopf:

    // Dialog
    class MyDialog : public CDialog
    {
    	message-map, buttons, cedit, etc..
    }
    
    // Header
    class MyPane : public CDockablePane
    {
    
    public:
    	void InitDialogs();
    
    private:
    	CTabCtrl m_tabCtrl;
    };	
    
    // CPP
    void MyPane::InitDialogs()
    {
    	MyDialog* pDialog = new MyDialog();
    	pDialog->Create(IDD_MYDIALOG,this);
    
    	m_tabCtrl.AddTab(pDialog,_T("Tab1"),....);
    }
    

    Ich hoffe, jemand kann mir da etwas weiterhelfen.


  • Mod

    Was sagt Spy++. Wer bekommt die Nachricht?



  • Ziemlich nettes Ding. 🙂 Ich muss sagen, ich kannte Spy++ bisher noch nicht.

    WM_LBUTTONDOWN hab ich mir jetzt mal anzeigen lassen und verschiedene Windows ausprobiert:

    Class: Afx: ControlBar bekommt die Message. (sollte das angedockte Window sein)
    Class: Afx: TabWnd bekommt die Message.
    Class: #32770(Dialog) bekommt die Message nicht.

    Ob man direkt eine Liste aller Klassen ausspucken lassen kann, welche die Message bekommen, habe ich noch nicht herausgefunden. Ich hoffe das waren die richtigen Infos.

    Was vielleicht noch helfen könnte, wären folgende Teile:

    Im Create von MyPane

    // Fenster erstellen
    CString caption;
    caption.LoadString(IDS_DETAILS_TITLE);
    if(!CDockablePane::Create(caption, pParentWnd, rect, TRUE, ID_DETAILS, WS_CHILD
     | WS_VISIBLE | CBRS_BOTTOM | CBRS_FLOAT_MULTI , AFX_CBRS_REGULAR_TABS, AFX_CBRS_RESIZE | AFX_CBRS_AUTOHIDE))
    {
    	ASSERT(0);
    	return FALSE;
    }
    

    Im OnCreate von MyPane

    // Tab-Control erstellen
    CRect rectDummy;
    rectDummy.SetRectEmpty();
    if(!m_wndTabCtrl.Create(CMFCTabCtrl::STYLE_3D,rectDummy,this,ID_DETAIL_CONTROL))
    {
    	ASSERT(0);
    	return -1;
    }
    m_wndTabCtrl.SetLocation (CMFCTabCtrl::LOCATION_TOP);
    

    Schonmal Danke für den Tipp mit Spy++ Martin! 🙂

    Btw, kleine korrektur von dem Post gestern Abend:
    m_wndTabCtrl ist vom typ CMFCTabCtrl und nicht CTabCtrl.

    edit: Lange Zeile gebrochen



  • Wie siehts denn eigentlich allgemein aus?

    Ist es Blödsinn ein CDialog in ein TabControl zu stecken, oder müsste das an sich eigentlich funktionieren?
    Ich hab irgendwie nirgens sowas ähnliches gefunden.

    Falls irgendwelche Infos noch nützlich wären, nur raus damit. 🙂



  • Gibt es dafür schon eine Lösung oder nicht? Mich würd das auch interessieren da ich einen ähnlichen Fall derzeit hab...

    Lg
    m0w



  • Leider gar nicht. Ich bin in diesem Fall immer noch gleich weit. 😕

    Heisst das du probierst auch eine Resource in ein Control zu stecken?
    Ich hab immernoch keine Ahnung, ob das so gedacht ist, oder ob man das "normalerweise" auf ne ganz andere Weise handhabt.

    Vielleicht kann man irgendwie die Messages vom DockingPane direkt zum Dialog umleiten.

    Ich hoffe hier kommen noch ein paar Meinungen dazu. 🙂



  • Mich hat es beim Umstellen auf das Feature Pack auch ganz schön gefuchst (ehrlich gesagt ich bin immer noch nicht überall ganz durchgestiegen).
    Ich hatte auch mit den DockablePanes Probleme. Im Endeffekt habe ich in meinem DockablePane ein CDialogBar created, welches die Ressource lädt.

    Command-Routing funktioniert, du musst nur im OnSize des DockablePanes die WindowPos des DialogBars anpassen.


  • Mod

    Kontrolliere mal nur die Behandlung von WM_NCHITTEST. Evtl. ist hier was faul.



  • @dwo77
    Hmm.. wenn ich DialogBars statt Dialoge benutze, wird dieser im Gegensatz zum Dialog leider nicht mehr angezeigt.
    Mit PropertyPages wär ich gleich weit wie mit Dialogen. Angezeigt aber keine Maus-Events.
    Im OnSize von MyPane setze ich momentan nur die Position des TabCtrl neu.
    SetWindowPos auf den Dialog klappt ja nicht.

    @Martin
    Im MyDialog:

    BEGIN_MESSAGE_MAP(MyDialog, CDialog)
    	ON_WM_LBUTTONDOWN()
    	ON_WM_NCHITTEST()
    	ON_BN_CLICKED(...)
    	ON_EN_UPDATE(...)
    END_MESSAGE_MAP()
    
    ...
    
    LRESULT MyDialog::OnNcHitTest(CPoint point)
    {
    	TRACE(_T("HitTest!\n"));
    	return CDialog::OnNcHitTest(point);
    }
    

    Was mir sonst noch als u.U. hilfreich einfallen würde wär, dass der Dialog als Member im MyPane gesetzt ist und dessen Create initialisiert wird.
    Zum TabControl wird es erst später hinzugefügt.
    Leider ohne Erfolg. Die Message kommt nicht an. 😕



  • Vor AddTab:

    ::SetParent(m_pMyDialog->m_hWnd, m_wndTabCtrl.m_hWnd);
    

    Es scheint, dass dies mein Problem gelöst hat. oO
    Sogar resize funktioniert scheinbar perfekt.

    Ich bin zwar noch etwas skeptisch, weil ich nicht weiss, ob das wirklich so gedacht ist, dass man da jetzt quasi mit dem Holzhammer das Message-Routing fixt,.. aber solange es funktioniert. ^^"

    Vielen Dank für eure Hilfe!


  • Mod

    Hättest Du evtl. das Control gleich als Child des Tab-Controls anlegen sollen?
    Was passiert dann?



  • Genau das gleiche.
    Ist aber schöner, du hast recht. 🙂
    Im Nachhinein wirkt das alles furchtbar logisch.

    m_pMyDialog->Create(IDD_MYDIALOG,&m_wndTabCtrl);
    

  • Mod

    Euronymuz schrieb:

    Ist aber schöner, du hast recht. 🙂
    Im Nachhinein wirkt das alles furchtbar logisch.

    Jo. Vermutlich lag es einfach an überlappenden (unsichtbaren) Fenstern.
    Wäre interessant dies noch mal im Spy++ in der nicht funktionierdnen Weise anzusehen.
    Dann hättest Du evtl. gesehen, dass sich hier evtl. zwei Siblings überlagern.


Anmelden zum Antworten