Visual c++ CTab_Ctrl类是否需要其他属性才能在其;窗口;?

Visual c++ CTab_Ctrl类是否需要其他属性才能在其;窗口;?,visual-c++,mfc,cwnd,Visual C++,Mfc,Cwnd,我有一个“默认外观”对话框,如下所示: 我正在尝试修改这些选项卡,并在第一个选项卡中插入RichEditCtrl InitCommonControlsEx; CWnd* pTab = GetDlgItem(IDC_TAB1); if (pTab) { CRect rect; m_TabCtrl = (CTabCtrl*)pTab; m_TabCtrl->GetClientRect(&rect);

我有一个“默认外观”对话框,如下所示:

我正在尝试修改这些选项卡,并在第一个选项卡中插入RichEditCtrl

    InitCommonControlsEx;
    CWnd* pTab = GetDlgItem(IDC_TAB1);
    if (pTab) {
        CRect rect;

        m_TabCtrl = (CTabCtrl*)pTab;
        m_TabCtrl->GetClientRect(&rect);
        
        m_TabCtrl->InsertItem(0, "Stats");
        m_TabCtrl->InsertItem(1, "Settings");
        BOOL getRect = m_TabCtrl->GetItemRect(0, &rect);

        if (!m_richEditCtrl.Create(WS_VISIBLE | ES_READONLY | ES_MULTILINE | ES_AUTOHSCROLL | WS_HSCROLL | ES_AUTOVSCROLL | WS_VSCROLL, rect, m_TabCtrl, 0))
            return FALSE;

        m_font.CreateFont(-11, 0, 0, 0, FW_REGULAR, 0, 0, 0, BALTIC_CHARSET, 0, 0, 0, 0, "Courier New");
        m_richEditCtrl.SetFont(&m_font);
    }
我之前修改的示例只使用了RichTextCtrl,并在“占位符”文本框中“创建”了它。它工作得很好,但我想将RichTextCtrl插入一个选项卡,并创建另一个选项卡来显示一些数据。问题是我现在只有两个空白标签。我知道父对话框设置“剪辑子对象”和“剪辑兄弟对象”可能很重要,但我不确定是否需要,如果需要的话。我还知道我的RichEditCtrl仍然存在,因为我仍然在向它发送数据,但它肯定不会显示

我的程序甚至没有那么紧急,我只是想让它在这一点上发挥作用…

产生一种错觉,即分隔符和显示区域是同一个控件的一部分。事实并非如此。选项卡控件实际上只是标签,加上占位符显示区域。应用程序负责使显示区域的内容生效

通常,需要执行以下步骤来实现功能齐全的选项卡控件:

  • 创建选项卡控件和标签
  • 创建显示区域的子控件。通常在对话框中放置包含单个“页面”的控件
  • 订阅消息,并动态更新控件的可见性,即隐藏不属于当前“页面”的所有控件,并显示属于当前“页面”的所有控件。将“页面”的所有控件放置在对话框中,只需切换对话框的可见性,即可简化此操作
  • 这是选项卡控件工作原理的大致概述。鉴于您的代码,您需要更改一些内容。具体而言,需要注意以下几点:

  • IDC_TAB1
    引用的选项卡控件需要具有
    WS_CLIPCHILDREN
    样式,以便显示区域不覆盖子控件
  • m_richEditCtrl
    需要使用
    WS_CHILD
    样式创建
  • 使用计算显示区域的大小,并使用该大小调整
    m\u richEditCtrl
    以填充整个显示区域(如果需要)
  • 通过这些更改,您将看到一个选项卡控件,其显示区域由一个丰富的编辑控件填充。在选项卡之间切换并不会改变显示区域的内容。这是您需要根据应用程序的要求实现的


    以下代码示例基于向导生成的基于对话框的应用程序MfcTabCtrl。生成的对话框资源(
    IDD_MFCTABCTRL_dialog
    )删除了所有内容,只留下一个空白的对话框模板

    同样,主对话框实现的大部分功能都被剥离了,只剩下重要的部分。这是MFCTabCTRLDG.h标头:

    #pragma一次
    #包括“afxdialogex.h”
    //控制标识符
    UINT constexpr IDC_TAB{100};
    UINT constexpr IDC_RICH_EDIT{101};
    CMfcTabCtrlDlg类:公共CDialogEx
    {
    公众:
    CMfcTabCtrlDlg(CWnd*pParent=nullptr);
    受保护的:
    afx_msg void OnSize(UINT nType、int cx、int cy);
    afx_msg void OnTabChanged(NMHDR*pNMHDR,LRESULT*pResult);
    //方便地实现了显示面积的计算
    RECT GetDisplayArea();
    虚拟BOOL-OnInitDialog();
    声明消息映射()
    私人:
    CTabCtrl m_TabCtrl{};
    CRICHEDITCRL m_richEditCtrl{};
    };
    
    实现文件mfctabctrldg.cpp也不是很广泛:

    #包括“mfctabctrldg.h”
    cmfctabctrldG::cmfctabctrldG(CWnd*pParent/*=nullptr*/)
    :CDialogEx(IDD_MFCTABCTRL_对话框,pParent)
    {
    }
    void CMfcTabCtrlDlg::OnSize(UINT nType、int cx、int cy)
    {
    CDialogEx::OnSize(nType、cx、cy);
    //仅在创建选项卡控件后调整其大小
    if(IsWindow(m_TabCtrl)){
    m_TabCtrl.MoveWindow(0,0,cx,cy);
    //确定显示区域
    自动常量显示区域{GetDisplayArea()};
    //调整子控件的大小以覆盖整个显示区域
    如果(!IsRectEmpty(&disp_area)和&IsWindow(m_richEditCtrl)){
    m_richEditCtrl.MoveWindow(显示区域和显示区域);
    }
    };
    }
    无效CMfcTabCtrlDlg::OnTabChanged(NMHDR*/*pNMHDR*/,LRESULT*预设)
    {
    auto const cur_sel{m_TabCtrl.GetCurSel()};
    开关(电流选择){
    //选择的第一个选项卡
    案例0:
    m_richEditCtrl.ShowWindow(SW_SHOW);
    打破
    //选择第二个选项卡
    案例1:
    m_richEditCtrl.ShowWindow(SW_HIDE);
    打破
    }
    //允许其他订阅者处理此消息
    *预设=假;
    }
    //返回相对于对话框的以客户机坐标表示的显示区域。
    //失败时返回一个空矩形。
    RECT CMfcTabCtrlDlg::GetDisplayArea()
    {
    矩形显示区{};
    if(IsWindow(m_TabCtrl)){
    m_选项卡Ctrl.GetWindowRect(&disp_区域);
    m_选项卡Ctrl.AdjustRect(错误和显示区域);
    此->屏幕到客户端(&disp_区域);
    }
    返回显示区;
    }
    //消息映射仅注册所需的消息
    开始消息映射(CMfcTabCtrlDlg、CDialogEx)
    关于_WM_SIZE()
    ON_通知(TCN_选择更改、IDC_选项卡和CMfcTabCtrlDlg::OnTabChanged)
    结束消息映射()
    BOOL cmfctabctrldg::OnInitDialog()
    {
    CDialogEx::OnInitDialog();
    //设置选项卡控件以覆盖整个客户端区域
    RECT客户端{};
    GetClientRect(&client);
    m_TabCtrl.Create(WS_VISIBLE | WS|u CHILD | WS|u clipcchildren,client,this,IDC|u选项卡);
    m_TabCtrl.InsertItem(0,L“Stats”);
    m_TabCtrl.InsertItem(1,L“设置”);
    //设置丰富的编辑控件。
    //严格设置WS_边框样式以使其可见。
    自动常量显示区域{GetDisplayArea()};
    m|u richEditCtrl.Create(WS|u BORDER | WS|u VISIBLE | WS|u CHILD,
    显示区域和m_选项卡(Ctrl、IDC_RICH_EDIT);
    复述