bestimmts Item im CTabCtrl auswählen

sTEk

Erfahrenes Mitglied
Ich tüftel mal wieder an einem Problem und bekomms einfach nicht hin. :(
Ich habe einen Dialog, in dem ich ein CTabCtrl darstelle. Diesem füge ich nun zwei "Blätter" hinzu und möchte, je nach dem, von wo er aufgerufen wird, entweder die erste oder die zweite Karte aktivieren. Das Anzeigen klappt auch, nur wenn ich die zweite Karte beim Start des Dialogs anzeigen lasse und ich dann auf das erste Item des TabCtrl klicke, passiert nichts, erst ein nochmaliges Klicken auf das zweite gefoglt vom ersten zeigt mir den Inhalt des ersten Blattes an.

Hier mal mein Code:
C++:
...
        m_tab1 = new CD_Einstellungen();
        m_tab2 = new CD_Typen();
        m_TabControl.InsertItem(m_tab1,"Einstellungen",IDD_Kanalauswahl);
        m_TabControl.InsertItem(m_tab2,"Typen",IDD_TedsTypen);
        if (m_Typen) {
            m_tab1->ShowWindow(SW_HIDE);
            m_TabControl.SetCurFocus(1);
            m_TabControl.SetCurSel(1);
            m_tab2->ShowWindow(SW_SHOW);
        }...
Wie erreiche ich, dass die zweite Karte praktisch wirklich selektiert wird? In der MSDN steht, dass das SetCurSel() kein TCN_SELCHANGING bzw TCN_SELCHANGE sendet, wie, oder besser, mit welchen Parametern muss ich das senden?
 
Zuletzt bearbeitet von einem Moderator:
Wenn du auf TCN_SELCHANGE F1 drückst, bekommst du direkt die Infos, welche Parameter wie belegt sein müssen.

Da steht, das TCN_SELCHANGE über WM_NOTIFY abgefackelt wird:

NMHDR NotifyHeader;

NotifyHeader.hwndFrom = GetSafeHwnd();
NotifyHeader.idFrom = GetDlgCtrlID();
NotifyHeader.code = TCN_SELCHANGE;

GetParent()->SendMessage( WM_NOTIFY, (WPARAM)GetDlgCtrlID(), (LPARAM)&NotifyHeader );
 
Ich bin leider heute erst dazu gekommen, das Ganze auszuprobieren.
Allein mit Duringos Tipp klappte es nicht - aber er brachte mich auf einen neuen Weg.
Jetzt funktioniert es:
Ich musste dazu im Parent des TabCtrl die WM_NOTIFY von Hand abfangen und entsprechend bearbeiten. Dort werte ich die beiden Nachrichten TCN_SELCHANGE und TCN_SELCHANGING aus und wechsle so in meinen Tab-Dialogen.
Die Umschaltung realisiere ich fast wie oben, allerdings lasse ich das ShowWindow weg, da das ja schon in der Nachrichtenbehandlung erledigt wird.

die Nachrichtenbehandlung:
C++:
LRESULT CD_Optionen::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
{
    int    ncursel;

   switch(message)
   {
   case WM_NOTIFY:
        switch(((LPNMHDR)lParam)->code)
        {
        case TCN_SELCHANGING:
            //wird vor der Änderung der Tab-Auswahl gesendet
            ncursel = TabCtrl_GetCurSel(((LPNMHDR)lParam)->hwndFrom);
            if(0 == ncursel)
                m_tab1->ShowWindow(SW_HIDE);
            else if(1 == ncursel)
                m_tab2->ShowWindow(SW_HIDE);

                      return(FALSE);
        case TCN_SELCHANGE:
            //wird nach der Änderung der Tab-Auswahl gesendet
            ncursel = TabCtrl_GetCurSel(((LPNMHDR)lParam)->hwndFrom);

            if(0 == ncursel)
                m_tab1->ShowWindow(SW_SHOW);
            else if(1 == ncursel)
                m_tab2->ShowWindow(SW_SHOW);
            return(0);
         default:
            break;
         }
         break;
   }
   return CDialog::WindowProc(message, wParam, lParam);
}

die Änderung der Tab-Auswahl:
Code:
    m_tab1 = new CD_Einstellungen();
    m_tab2 = new CD_Typen();
    m_TabControl.InsertItem(m_tab1,"Einstellungen",IDD_Kanalauswahl);
    m_TabControl.InsertItem(m_tab2,"Typen",IDD_TedsTypen);
    if (m_Typen) {
        m_TabControl.SetCurFocus(1);
        m_TabControl.SetCurSel(1);
    }
 
Zuletzt bearbeitet von einem Moderator:
Zurück