在 MFC 中将选项卡添加到 CTabCtrl

Posted

技术标签:

【中文标题】在 MFC 中将选项卡添加到 CTabCtrl【英文标题】:Adding tabs to CTabCtrl in MFC 【发布时间】:2015-03-11 17:59:24 【问题描述】:

我正在尝试将 CTabCtrl 添加到我的 MFC 应用程序中。我正在尝试直接关注 MSDN。

*MSDN: Adding Tabs to Tab Control

这是我尝试过的:

DDX_Control(pDX, TAB1, m_TabCtrl);

TC_ITEM ti;
ti.mask = TCIF_TEXT;
ti.pszText = _T("First Tab");

m_TabCtrl.InsertItem(0,&ti);

我收到以下错误消息:

如果我点击忽略,我的 CTabCtrl 会显示,但没有任何选项卡(只是一个灰色方块)。如果我点击重试,我会在以下位置获得断点:

_AFXCMN_INLINE BOOL CTabCtrl::SetItem(int nItem, TCITEM* pTabCtrlItem)
 ASSERT(::IsWindow(m_hWnd)); return (BOOL)::SendMessage(m_hWnd, TCM_SETITEM, nItem, (LPARAM)pTabCtrlItem); 

我尝试添加标题#include "afxcmn.h",但没有任何改变。

我只是尝试让命名选项卡显示在我的应用程序中作为第一步。最终我希望标签显示无模式对话框。有人可以告诉我我做错了什么吗?有没有更好的方法在 MFC 中使用选项卡?

【问题讨论】:

您是否单击了重试以单步执行代码? 在该对话框上单击重试将引导您获得更多有用的调试信息。 您的代码在哪里调用了 InsertItem?不能在DoDataExchange中,需要在对话框初始化并创建控制窗口后调用的函数中。 我用调试信息更新了我的问题。我在主 Dialog 类的 OnInitDialog() 之后调用了 InsertItem。 很可能,在执行 InsertItem 命令时,您的句柄 (m_hwnd) 无效。这意味着在您尝试执行插入命令之前未正确创建您的选项卡控件。 【参考方案1】:

根据您提供的信息,很明显它是在 IsWindow(m_hWnd) 上进行断言。这意味着当您调用 InsertItem() 时,您的选项卡控件的窗口尚未创建。

您是将 CTabCtrl 放在 CDialog 派生类还是其他 CWnd 派生类中?您是否在 DDX_Control() 代码行上设置了断点,以确保 1)它实际上被调用,以及 2)它是成功的?我有一种感觉,它甚至没有被调用,因为如果它被调用,那么你将有一个有效的 m_hWnd,或者你会在你的 DDX_Control() 调用时得到一个 ASSERT() 来说明它失败了。

【讨论】:

以上是关于在 MFC 中将选项卡添加到 CTabCtrl的主要内容,如果未能解决你的问题,请参考以下文章

MFC_2.5 选项卡控件的使用

使 MFC CTabCtrl 不使用绘图选项卡的完整控件宽度

C++ MFC 为 CTabCtrl 中的每个选项卡附加不同的对话框

如何在基于 mfc 对话框的应用程序中将选项卡添加到 tabcontrol 并在对话框中间显示选项卡

如何更改 CTabCtrl 选项卡颜色?

CTabCtrl SetItemRect?