Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » tab control designen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: [ 1 ] > 2 <
010
14.05.2004, 09:15 Uhr
rene rosenberger



die frage ist :

ich habe einen dialog (ganz normal). in diesen dialog möchte ich ein rigisterkarten steuerelement einfügen. habe daher aus der toolbox ganz normal das steuerelemt gepackt und in meinen dialog gezogen. habe auch eine klasse ctabportsheet erzeugt welche von cpropertysheet erbt. hierzu aber keinen eigenen dialog angelegt. nur für die registerkarten habe ich 2 dialoge angelegt und 2 klassen welche von cpropertypage erben. jetzt, woher weiß das steuerelemt auf meinem normalen hauptdialog welches cpropertysheet er anzeigen soll. wird hier überhaupt noch ein sheet benötigt, oder reichen die ppages ? ich raffs nicht ! wie füge ich das ganze in meinen dialog ein. und in welcher klasse schreibe ich den code zum anzeigen der pages ? in der sheetklasse oder in meiner normalen dialogklasse. bin hier echt über alle maße verwirrt.

gruesse rene
--
gruesse rene
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
011
14.05.2004, 16:16 Uhr
~toxic
Gast


hi,
also soweit iss das doch alles richtig, ausser ... ich schreib mal wie ich das gemacht hab:
1. ganz normalen dialog anlegen (MyDlg)
2. die sheetpage-dialoge anlegen und einer klasse zuweissen (Seite1, Seite2)
das wars schon, die klasse die von cpropertysheet erbt kanste dir sparen.
jetzt nur noch im "oninitdialog" (oder eine eigene funktion [OnCreateSheet], und die dann in oninit aufrufen) folgendes einfügen:

C++:
// Membervariablen:
//    CPropertySheet* m_dlgPropertySheet;
//    CPropertyPage* m_SheetPage[4];
//    int m_iSheetPages;

void MyDlg::OnCreateSheet()
{
m_dlgPropertySheet = new CPropertySheet("name");
ASSERT(m_dlgPropertySheet);

m_SheetPage[0] = new Seite1;
m_SheetPage[1] = new Seite2;
m_iSheetPages = 2;
for ( int i = 0; i < m_iSheetPages; i++ )
    m_dlgPropertySheet->AddPage(m_SheetPage[i]);
// jetzt das tab "herstellen"
m_dlgPropertySheet->Create(this, WS_CHILD | WS_VISIBLE | WS_TABSTOP, 0);
// alle sheets anzeigen... damit werden sie initialisiert
for ( i = 0; i < m_dlgPropertySheet->GetPageCount(); i++ )
    m_dlgPropertySheet->SetActivePage(i);

// und die seite die die dann als erstes angezeigt werden soll
m_dlgPropertySheet->SetActivePage(0);

// der zugriff vom hauptdialog geht dann so
// zb. den text des "IDC_BUTTON1" auf seite "0" ändern
((CPropertyPage*)m_dlgPropertySheet->GetPage(0))->SetDlgItemText(IDC_BUTTON1, "Text");

// oder eine memberfunction der Seite2 aufrufen
((Seite2*)m_SheetPage[1])->DeineMemberFunction();

// man kann die klassen der pages auch weglassen wenn man keine
// komplexen sachen macht und nicht auf WM_'s oder so reagieren muss
// dann benutzt man das einfach mit der angelegten resource
m_SheetPage[0] = new CPropertyPage(IDD_DIALOG1, 0);

// und kann dann zb so ein listctrl ansprechen
CListCtrl* lStatus = ((CListCtrl*)(((CPropertyPage*)m_dlgPropertySheet->GetPage(2))->GetDlgItem(IDC_LIST1)));
lStatus->SendMessage(LVM_SETEXTENDEDLISTVIEWSTYLE, 0, (LPARAM)LVS_EX_FULLROWSELECT|LVS_EX_ONECLICKACTIVATE|LVS_EX_FLATSB);
lStatus->InsertColumn(0,"Status", LVCFMT_CENTER, 66);
lStatus->InsertColumn(1,"Bezeichnung", LVCFMT_LEFT, 130);
lStatus->InsertItem(0, " initial", 0);



ich hoffe das hilft
--
grusz
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
012
14.05.2004, 16:21 Uhr
~toxic
Gast


achja... un bedingt darauf auchten das:
C++:
m_dlgPropertySheet->Create(this, WS_CHILD | WS_VISIBLE | WS_TABSTOP, 0);
auch WS_CHILD ist sonst macht er dir nen neuen dialog mit den sheets auf, welchen man dann auch modal machen kann.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
013
14.05.2004, 16:50 Uhr
rene rosenberger



m_dlgPropertySheet

was ist das für einen membervariable ? die von dem tabctrl welches du in deinen dialog gezogen hast ? oder hast du für dieses steuerelement garkeine membervariable eingefügt ?

gruesse rene
--
gruesse rene
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
014
14.05.2004, 17:37 Uhr
rene rosenberger



also habs nun soweit mal hinbekommen das die seiten angezeigt werden problem ist immernoch : jetzt fliegt das teil mal hier mal da in meinem hauptdialog rum. das soll ja plaziert werden. habe ja auch ein ctabctrl in meinem dialog der genau die richtige position hat. aber wie verbinde ich das neue propertysheet mit dem tabctrl ?

gruesse rene
--
gruesse rene
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
015
14.05.2004, 18:30 Uhr
~toxic
Gast


hi,
C++:
// Membervariablen:
    CPropertySheet* m_dlgPropertySheet;
    CPropertyPage* m_SheetPage[4];
    int m_iSheetPages;

// in OnInitDialog() oder extra-function
m_dlgPropertySheet = new CPropertySheet("name");

ein tabctrl hab ich garnicht benutzt, das macht die CPropertySheet von selbst, platzieren kannste die sheets ganz normal wie jeden anderen child-dialog.
--
grusz
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
016
14.05.2004, 18:36 Uhr
~toxic
Gast


achso... in den destructor des hauptdialogs muss noch was rein:

C++:
MyDlg::~MyDlg()
{
    if (m_dlgPropertySheet)
    {
        for ( int i = 0; i < m_iSheetPages; i++ )
            delete m_SheetPage[i];
        delete m_dlgPropertySheet;
    }
}
sonst giebts leaks.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
017
15.05.2004, 09:43 Uhr
rene rosenberger



also mit dem plazieren hab ich schwierigjkeiten. habe sowas noch nicht gemacht. sehe ja die registerkarten erst zur laufzeit ohne tabctrl. wie plaziere ich also korrekt ?

danke für die mühe.

gruesse rene
--
gruesse rene
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
018
17.05.2004, 00:12 Uhr
~toxic
Gast


hi, das platzieren ist eigentlich relativ einfach...

C++:
WINDOWPLACEMENT wplace;
m_dlgPropertySheet->GetWindowPlacement(&wplace);

int breit = wplace.rcNormalPosition.right - wplace.rcNormalPosition.left;
int hoch = wplace.rcNormalPosition.bottom - wplace.rcNormalPosition.top;

int newLeft = 60;
int newTop = 80;

wplace.rcNormalPosition.left = newLeft;
wplace.rcNormalPosition.right = newLeft + breit;
wplace.rcNormalPosition.top = newTop;
wplace.rcNormalPosition.bottom = newTop + hoch;

m_dlgPropertySheet->SetWindowPlacement(&wplace);


aber schau dir trotzdem mal die WINDOWPLACEMENT struct an, da kann man mehr mit machen als nur das window positionieren
--
...die MSDN ist dein freund...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
019
17.05.2004, 10:44 Uhr
rene rosenberger



du bist mein held
funktioniert alles wunderbar !

vielen dank !
--
gruesse rene
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: [ 1 ] > 2 <     [ VC++ / MFC ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: