首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于MFC对话框和选项卡控件的应用程序- Visual错误/限制使推荐路径不可能实现?

基于MFC对话框和选项卡控件的应用程序- Visual错误/限制使推荐路径不可能实现?
EN

Stack Overflow用户
提问于 2021-06-22 22:26:31
回答 2查看 377关注 0票数 0

在Visual 2019中创建基于对话框的应用程序。在资源中插入一个新对话框。在该对话框中放置一个控件(或两个),稍后(尝试)连接到一个变量(例如,一个编辑框,以输入您的名称)。

准备通过为第二个对话框创建一个类来添加该控制变量。如果您继承了CDialogEx (或者其他类也是--没有经过测试),那么您可以继续为您添加的控件添加一个变量--简单、正常。

但是,如果您的脑海中有上面标题中的“选项卡控件”上下文,并选择从CMFCPropertyPage继承,那么以后可以添加一个变量吗?不行--添加的类不引用对话框资源的ID,因此添加变量进程没有找到要向其添加变量的类的基础。

我认为这是中的一个bug ..。但是我并不是百分之百确定,因为我总是发现有关属性表和属性页的文档有些令人困惑。具体地说:

  • 在选项卡控件上实现选项卡内容的类是否“包含”选项卡上的“控件”.还是制表符控件真的只是一种提供视觉提示以显示/隐藏控件集的方法,而所有这些控件和相关变量都驻留在一个类中?

我相信这是前者,但我可以想象使用制表符控件,因为制表符内容之间有很大的相似之处,因此在一个地方实现所有控制变量可能有好处,以避免重复。我只是希望能在某个地方明确说明它的意图。

更广泛的背景:我正在尝试实现一个基于对话框的应用程序,其中有一个选项卡控件控制着该对话框。MS文档说要使用CPropertySheetCPropertyPage来实现选项卡控件,以实现选项卡对话框和选项卡内容。但是,没有(直接)方法来创建基于对话框的应用程序,其主对话框继承自CPropertySheet。当您在应用程序级别查找选项卡控件的示例时,可以很容易地找到明显偏离记录路径的东西 --既不使用CPropertySheet也不使用CPropertyPage,使用WM_LBUTTONDOWN事件而不是TCN_SELCHANGE,这两者都没有明显的原因。

任何关于(a)如何修复明显的Visual错误和/或(b)如何为我的应用程序对话框继承CPropertySheet和/或(c)如何在顶层找到一个更清晰和更常规的选项卡控件使用示例的技巧,都将不胜感激。

EN

回答 2

Stack Overflow用户

发布于 2021-06-23 09:17:54

有一次,我也是这样提出申请的。我不记得我是否使用了Visual新项目向导。很可能是我干的。但如果你找不到助手,我会帮你做好这件事。

最重要的是:

  1. 在资源中定义主对话框,并在其H和CPP文件中定义相应的类。
  2. YourAppClass::InitInstance中,您需要的内容如下: YourMainDlgClass dlg;m_pMainWnd = &dlg;INT_PTR nResponse = dlg.DoModal();if (nResponse == IDOK) { // TODO:在对话框被//取消时在这里放置代码以便处理,如果(nResponse == IDCANCEL) { // TODO (nResponse == IDCANCEL){ // TODO:如果(nResponse== -1) { TRACE(traceAppMsg,0,“警告:对话框创建失败,因此应用程序意外终止。\n”);跟踪(traceAppMsg,0,“警告:如果在对话框中使用MFC控件,则不能#定义_AFX_NO_MFC_CONTROLS_IN_DIALOGS.\n");}
  3. 在选项卡对话框中插入CMFCTabCtrl元素,而不是使用CPropertySheet
票数 0
EN

Stack Overflow用户

发布于 2021-06-24 00:17:26

考虑到似乎没有明确和一致的方法来处理这个问题,如果(像我一样)您认为“这有多难?”,您可能会天真地开始考虑是否可以创建一个基于CDialog的新的基于对话框的应用程序,并将其手动转换为CPropertyPage。您可能会过得更好;我很快就遇到了一个奇怪的问题:应用程序编译但没有运行--它无法从资源ID加载窗口标题,尽管标题实际上是黑白的。由于奇怪,这是一个危险的信号,所以在我的脑海中的问题(b)似乎是不值得的努力。

如果没有顶级的CPropertySheet,就没有必要让任何类型的CPropertyPageCMFCPropertyPage参与进来,使问题(a)变得毫无意义。尽管如此,如果您手动将选项卡类的(默认) CDialogEx转换为CPropertyPage,则编译和运行它似乎没有问题--选项卡没有任何与主对话框集成的功能。

相反,我现在可以建议您研究一下视频示例的细节,尽管它乍一看会做一些奇怪的事情。您可以以大致相同的方式实现所需的结果,如下所示:

  • 自始至终使用普通的CDialogEx,因此自己提供所有的选项卡切换/显示/隐藏/控制工作(示例演示了这一点)。
  • 在资源编辑器中创建主对话框和所有选项卡,从其中添加CDialog-based类。
  • 如果您通过插入对话框(泛型)而不是添加资源(使用特定模板)创建选项卡对话框资源,则必须手动设置每个选项卡的某些对话框属性:
    • 边框:Thin (或者我不喜欢)
    • 风格:Child
    • 系统菜单: false
    • 标题栏:假

  • 您可以简化制表符的重新定位(请参阅下面;它几乎没有理由使用单独的SetRectangle()函数)
  • 您应该(可能)驱动从TCN_SELCHANGE事件中更改的选项卡,而不是WM_LBUTTONDOWN

如前所述,重新定位选项卡可以简化为以下内容:

代码语言:javascript
复制
CRect tabRect;
m_tabControl.GetWindowRect( &tabRect );
for ( int i = 0; i < m_totalTabs; i++ )
{
    m_pTabPage[ i ]->SetWindowPos( &wndTop, tabRect.left, tabRect.top, 0, 0,
                i == m_currentTab? SWP_NOSIZE|SWP_SHOWWINDOW : SWP_NOSIZE|SWP_HIDEWINDOW );
}

示例中显示的每个选项卡对ShowWindow()的额外调用都是多余的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68091361

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档