【发布时间】:2021-07-15 00:33:18
【问题描述】:
在这种情况下,我并没有“卡住”,而是在寻找一些关于如何执行有意义且易于构建的 GUI 布局机制的“指导”。我正在使用TreeControl,它在视觉上“匹配”Winamp 的所有设置和程序选项的选项/首选项对话框。
要明确:这不是我曾经尝试过的事情,我从未尝试过寻找用户输入来帮助我越过终点线。
我在“树”(“父”)中有 6 个项目和 5 个“子项目”。我已经完全构建了它,我可以从选择的任何节点获取数据(我将在图片下方发布)。
我正在使用“do.Modal 对话框”,当我单击树节点时,我希望对话框的右侧更新为该节点功能所需的控件。对我来说,通过“显示”和“隐藏”执行控制似乎很容易。我遇到的问题是,当每个“节点分页”控件在design time 期间可能会或可能不会在视觉上位于彼此之上时,如何在资源编辑器中执行可视化“静态”控件。在运行期间,当在节点上选择每个节点时,控件将处于活动状态,但在设计期间,我可能将控件放在彼此之上,这将是一个逻辑上的噩梦,试图理清它们的位置等。
如何解决构建它的这方面问题?我认为它是一个 select: 'node' show: 'option page controls' 所以我明白了逻辑;我只是想知道我是否应该有单独的“弹出”页面并调用它们……或者直接处理控件。这有意义吗?
我已经对如何执行此操作进行了一些搜索,但是示例到处都是,我认为在这里询问是最有意义的。我确信有多种方法可以做到这一点,我只是在寻找最短的路径,最容易维护,并可能在未来扩展选项。
对话框的例子和我正在使用的源代码:
这里是初始化代码:
BOOL CSettingsDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: Add extra initialization here
HTREEITEM hParent, hToolbars, hColorScheme, hTabStyles, hPowerUser,
hResetApp;
//HTREEITEM hCompany, hLevel, hLevelNext; // Used in core example, not needed here
hParent = m_TreeCtrl.InsertItem((L"Preferences"), TVI_ROOT);
hToolbars = m_TreeCtrl.InsertItem((L"Toolbars"), hParent);
hColorScheme = m_TreeCtrl.InsertItem((L"Color Scheme"), hParent);
hTabStyles = m_TreeCtrl.InsertItem((L"Tab Styles"), hParent);
hPowerUser = m_TreeCtrl.InsertItem((L"Power User"), hParent);
hResetApp= m_TreeCtrl.InsertItem((L"Reset All Options"), hParent);
m_TreeCtrl.Expand(hParent, TVE_EXPAND);
m_TreeCtrl.SelectItem(hParent);
GetDlgItem(IDC_SETTINGS_CAPTION)->SetWindowText(_T("Preferences Settings"));
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
这是我从头开始的对话框架,只是为了到达这里:
void CSettingsDlg::OnTvnSelchangedTree1(NMHDR *pNMHDR, LRESULT *pResult)
{
//LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR);
//SetDlgItemInt(IDC_TXT_TREE1, m_TreeCtrl.GetItemData(pNMTreeView->itemNew.hItem));
//*pResult = 0;
HTREEITEM sel = m_TreeCtrl.GetSelectedItem();
CPoint point;
CString str;
GetCursorPos(&point);
m_TreeCtrl.ScreenToClient(&point);
UINT flags = 0;
HTREEITEM hitItem = m_TreeCtrl.HitTest(point, &flags);
if (hitItem && sel != hitItem)
{
sel = hitItem;
m_TreeCtrl.SelectItem(sel);
str = m_TreeCtrl.GetItemText(sel);
//MessageBox((LPCTSTR)str); // Just to verify.
}
if (str == "Preferences")
{
this->SetWindowText(_T("Preferences Settings"));
GetDlgItem(IDC_SETTINGS_CAPTION)->SetWindowText(_T("Preferences Settings"));
}
if (str == "Toolbars")
{
this->SetWindowText(_T("Toolbars Settings"));
GetDlgItem(IDC_SETTINGS_CAPTION)->SetWindowText(_T("Toolbars Settings"));
}
if (str == "Color Scheme")
{
this->SetWindowText(_T("Color Scheme"));
GetDlgItem(IDC_SETTINGS_CAPTION)->SetWindowText(_T("Color Scheme Settings"));
}
if (str == "Tab Styles")
{
this->SetWindowText(_T("Tab Styles Settings"));
GetDlgItem(IDC_SETTINGS_CAPTION)->SetWindowText(_T("Tab Styles Settings"));
}
if (str == "Power User")
{
this->SetWindowText(_T("Power User Settings"));
GetDlgItem(IDC_SETTINGS_CAPTION)->SetWindowText(_T("Power User Settings"));
}
if (str == "Reset All Options")
{
this->SetWindowText(_T("Reset All Settings"));
GetDlgItem(IDC_SETTINGS_CAPTION)->SetWindowText(_T("Reset All Settings"));
}
*pResult = 0;
}
如图所示,您可以看到我能够将静态标题更改为从树中选择的“活动”页面节点。我正在寻找处理右侧 GUI 元素的最佳方法....
例如,一些控件将是:
Color scheme Node: 5 check boxes for theme changing
Toolbars Node: Radio button for Docked or Floating
Power User Node: Checkbox to disable user warning within program operation
Tab Styles Node: Radio buttons to select flat, 3d, whatever.
当用户“选择”它写入注册表的任何内容时,我调用该函数来读取数据等等等等……
这就是我所在的位置。有没有人对行动方案有任何建议,所以我不会把自己画到角落里?
【问题讨论】:
-
您正在寻找CDialog。
标签: c++ user-interface visual-studio-2017 mfc mdi