使用 VC6.0 開發 MFC 應用,主視圖為 CFormView,放置一個 CTabCtrl 作為一級標籤,並在其某個標籤頁內再嵌套第二個 CTabCtrl。結果發現:二級標籤頁的屬性頁面無法點擊,編輯框、按鈕等控件全部失效。嘗試將父窗口改為 CDialog 後問題依舊。
MFC 的 CTabCtrl 本質上是一個無標題的對話框容器,其消息分發機制依賴父窗口的 PreTranslateMessage 與 OnCmdMsg 路由。嵌套兩層 CTabCtrl 會導致:
WS_EX_CONTROLPARENT 樣式未正確傳遞,導致對話框管理器無法識別其內部控件。正如最佳回答所言:「沒必要嵌套,直接增加 Tab 項好了。」
CTabCtrl 中直接插入所有業務所需的標籤項(InsertItem)。CDialog 衍生類(屬性頁),通過 Create(IDD_DIALOG, &tabCtrl) 建立,並設置位置大小覆蓋標籤客戶區。TCN_SELCHANGE 通知,僅顯示當前選中標籤對應的對話框(ShowWindow(SW_SHOW)),隱藏其餘。CMFCPropertySheet(VS2008+ 支持)實現樹狀標籤。void CMyFormView::OnTcnSelchangeTabMain(NMHDR *pNMHDR, LRESULT *pResult)
{
int nSel = m_tabMain.GetCurSel();
for (int i = 0; i < m_tabPages.size(); ++i) {
m_tabPages[i].ShowWindow(i == nSel ? SW_SHOW : SW_HIDE);
}
*pResult = 0;
}
若專案允許,強烈建議升級至 Visual Studio 2019/2022 + MFC Feature Pack,使用 CMFCTabCtrl、CMFCPropertySheet 等現代類,原生支持文檔標籤、圖標、拖拽排序、右鍵菜單,徹底避開 VC6.0 時代的嵌套坑。