TabCtrl unter VC2013
-
Hallo,
unter VC 2005 hatte ich folgende Lösung, die auch unter 2013 soweit funktioniert, nur der Zugriff auf meine Methoden klappt nicht! Ich kann nur auf die Methode, die aus CDialog stammen zugreifen. Kennt jemand die Lösung? Hier der Code für das zentrale Control, das die einzelnen Seiten-Dialoge erzeugt und anzeigt:
#pragma once // CMainTabCtrl #define LIST_TAB_ZAHL 3 class CMainTabCtrl : public CTabCtrl { DECLARE_DYNAMIC(CMainTabCtrl) public: // Konstruktion CMainTabCtrl(); virtual ~CMainTabCtrl(); // Variablen int m_aktuelleSeite; CDialog* m_tabellenSeite[LIST_TAB_ZAHL]; // Methoden void Initialisierung(); void SetRec(); // Generierte Nachrichtenzuordnungsfunktionen protected: //{{AFX_MSG(CMainTabCtrl) afx_msg void OnLButtonDown(UINT nFlags, CPoint point); //}}AFX_MSG DECLARE_MESSAGE_MAP() }; // End CMainTabCtrl.h #include "stdafx.h" #include "FileHandler.h" #include "MainTabCtrl.h" #include "TabPage1.h" #include "TabPage2.h" #include "TabPage3.h" // CMainTabCtrl IMPLEMENT_DYNAMIC(CMainTabCtrl, CTabCtrl) CMainTabCtrl::CMainTabCtrl() { m_tabellenSeite[0] = new CTabPage1; m_tabellenSeite[1] = new CTabPage2; m_tabellenSeite[2] = new CTabPage3; } CMainTabCtrl::~CMainTabCtrl() { int i; for(i=0;i<LIST_TAB_ZAHL;i++) { delete m_tabellenSeite[i]; } } void CMainTabCtrl::Initialisierung() { int i; m_aktuelleSeite = 0; m_tabellenSeite[0]->Create(IDD_TAB_PAGE_1, this); m_tabellenSeite[1]->Create(IDD_TAB_PAGE_2, this); m_tabellenSeite[2]->Create(IDD_TAB_PAGE_3, this); m_tabellenSeite[0]->ShowWindow(SW_SHOW); for (i=1;i<LIST_TAB_ZAHL;i++) m_tabellenSeite[i]->ShowWindow(SW_HIDE); SetRec(); } void CMainTabCtrl::SetRec() { CRect tabRec, itemRec; int nX, nY, nXz, nYz; int i; GetClientRect(&tabRec); GetItemRect(0,&itemRec); nX = itemRec.left; nY = itemRec.bottom + 1; nXz = tabRec.right - itemRec.left - 1; nYz = tabRec.bottom - nY - 1; m_tabellenSeite[0]->SetWindowPos(&wndTop, nX, nY, nXz, nYz, SWP_SHOWWINDOW); for(i=1;i<LIST_TAB_ZAHL;i++) { m_tabellenSeite[i]->SetWindowPos(&wndTop, nX, nY, nXz, nYz, SWP_HIDEWINDOW); } } BEGIN_MESSAGE_MAP(CMainTabCtrl, CTabCtrl) //{{AFX_MSG_MAP(CMainTabCtrl) ON_WM_LBUTTONDOWN() //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // Behandlungsroutinen für Nachrichten CMainTabCtrl void CMainTabCtrl::OnLButtonDown(UINT nFlags, CPoint point) { CTabCtrl::OnLButtonDown(nFlags, point); if(m_aktuelleSeite != GetCurFocus()) { m_tabellenSeite[m_aktuelleSeite]->ShowWindow(SW_HIDE); m_aktuelleSeite=GetCurFocus(); m_tabellenSeite[m_aktuelleSeite]->ShowWindow(SW_SHOW); m_tabellenSeite[m_aktuelleSeite]->SetFocus(); } }
Hier exemplarisch der Code für eine TabPage, die den eigentlichen Inhalt transportiert:
#pragma once // CTabPage2-Dialogfeld class CTabPage2 : public CDialog { DECLARE_DYNAMIC(CTabPage2) public: CTabPage2(CWnd* pParent = NULL); // Standardkonstruktor virtual ~CTabPage2(); // Dialogfelddaten enum { IDD = IDD_TAB_PAGE_2 }; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV-Unterstützung DECLARE_MESSAGE_MAP() }; // End CTabPage2.h // TabPage2.cpp: Implementierungsdatei // #include "stdafx.h" #include "FileHandler.h" #include "TabPage2.h" // CTabPage2-Dialogfeld IMPLEMENT_DYNAMIC(CTabPage2, CDialog) CTabPage2::CTabPage2(CWnd* pParent /*=NULL*/) : CDialog(CTabPage2::IDD, pParent) { } CTabPage2::~CTabPage2() { } void CTabPage2::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CTabPage2, CDialog) END_MESSAGE_MAP() // CTabPage2-Meldungshandler
Das Anzeigen und Umschalten zwischen den verschiedenen Tabs klappt gut, aber wenn ich eine neue Methode od. Variable einfüge, kann ich nicht von außerhalb der Klasse darauf zugreifen, da die Tab-Klasse alle von CDialog abgeleitet sind und unter MainTabCtrl als Instanzen von CDialog gerzeugt werden. Es scheint als könnte ich entweder nur die vererbten Methoden nutzen oder die eigenen, falls ich die Klasse mit ihrem eigenen Typ instanziere...
-
Ich erinnere mich ganz dunkel an etwas, weiß aber nicht mehr ob es was mit TabCtrls zu tun hatte, is schon zu lange her. Ich erinnere mich an ein Problem, das daraus resultierte, dass VS standartmäßig von CDialog ableitet. Das Problem, das ich damals hatte, ließ sich nur beheben in dem man nicht von CDialog ableitet, sondern von CDialogEx, also quasi überall im Code von CDialog steht, noch ein "Ex" dran hängen.
Wie gesagt, das ist bei mir schon sehr lange her und ich weiß nicht ob es wirklich was mit TabCtrls zu tun hatte, aber ein Versuch ist es wert...
-
Danke für den Hinweis. Inzwischen habe ich alles auf DialogEx umgebaut, allein schon weil das unter VC2013 die Standard-Klasse für alle Dialoge zu sein scheint - hat aber nichts gebracht. Ich kann immer noch nicht auf neue hinzu gekommene Variablen bzw. Methoden zugreifen, die in der CDialogEx nicht vorhanden sind...