在 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 CTabCtrl 不使用绘图选项卡的完整控件宽度
C++ MFC 为 CTabCtrl 中的每个选项卡附加不同的对话框