Visual c++ CTab_Ctrl类是否需要其他属性才能在其;窗口;?
我有一个“默认外观”对话框,如下所示: 我正在尝试修改这些选项卡,并在第一个选项卡中插入RichEditCtrlVisual 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);
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);
复述