在Visual 2019中创建基于对话框的应用程序。在资源中插入一个新对话框。在该对话框中放置一个控件(或两个),稍后(尝试)连接到一个变量(例如,一个编辑框,以输入您的名称)。
准备通过为第二个对话框创建一个类来添加该控制变量。如果您继承了CDialogEx (或者其他类也是--没有经过测试),那么您可以继续为您添加的控件添加一个变量--简单、正常。
但是,如果您的脑海中有上面标题中的“选项卡控件”上下文,并选择从CMFCPropertyPage继承,那么以后可以添加一个变量吗?不行--添加的类不引用对话框资源的ID,因此添加变量进程没有找到要向其添加变量的类的基础。
我认为这是中的一个bug ..。但是我并不是百分之百确定,因为我总是发现有关属性表和属性页的文档有些令人困惑。具体地说:
我相信这是前者,但我可以想象使用制表符控件,因为制表符内容之间有很大的相似之处,因此在一个地方实现所有控制变量可能有好处,以避免重复。我只是希望能在某个地方明确说明它的意图。
更广泛的背景:我正在尝试实现一个基于对话框的应用程序,其中有一个选项卡控件控制着该对话框。MS文档说要使用CPropertySheet和CPropertyPage来实现选项卡控件,以实现选项卡对话框和选项卡内容。但是,没有(直接)方法来创建基于对话框的应用程序,其主对话框继承自CPropertySheet。当您在应用程序级别查找选项卡控件的示例时,可以很容易地找到明显偏离记录路径的东西 --既不使用CPropertySheet也不使用CPropertyPage,使用WM_LBUTTONDOWN事件而不是TCN_SELCHANGE,这两者都没有明显的原因。
任何关于(a)如何修复明显的Visual错误和/或(b)如何为我的应用程序对话框继承CPropertySheet和/或(c)如何在顶层找到一个更清晰和更常规的选项卡控件使用示例的技巧,都将不胜感激。
发布于 2021-06-23 09:17:54
有一次,我也是这样提出申请的。我不记得我是否使用了Visual新项目向导。很可能是我干的。但如果你找不到助手,我会帮你做好这件事。
最重要的是:
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");}CMFCTabCtrl元素,而不是使用CPropertySheet。发布于 2021-06-24 00:17:26
考虑到似乎没有明确和一致的方法来处理这个问题,如果(像我一样)您认为“这有多难?”,您可能会天真地开始考虑是否可以创建一个基于CDialog的新的基于对话框的应用程序,并将其手动转换为CPropertyPage。您可能会过得更好;我很快就遇到了一个奇怪的问题:应用程序编译但没有运行--它无法从资源ID加载窗口标题,尽管标题实际上是黑白的。由于奇怪,这是一个危险的信号,所以在我的脑海中的问题(b)似乎是不值得的努力。
如果没有顶级的CPropertySheet,就没有必要让任何类型的CPropertyPage或CMFCPropertyPage参与进来,使问题(a)变得毫无意义。尽管如此,如果您手动将选项卡类的(默认) CDialogEx转换为CPropertyPage,则编译和运行它似乎没有问题--选项卡没有任何与主对话框集成的功能。
相反,我现在可以建议您研究一下视频示例的细节,尽管它乍一看会做一些奇怪的事情。您可以以大致相同的方式实现所需的结果,如下所示:
CDialogEx,因此自己提供所有的选项卡切换/显示/隐藏/控制工作(示例演示了这一点)。CDialog-based类。SetRectangle()函数)TCN_SELCHANGE事件中更改的选项卡,而不是WM_LBUTTONDOWN。如前所述,重新定位选项卡可以简化为以下内容:
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()的额外调用都是多余的。
https://stackoverflow.com/questions/68091361
复制相似问题