问题标签 [cdialog]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
700 浏览

mfc - 在同一个对话框类中刷新 CDialog MFC

有什么方法可以CDialog在同一个类中刷新() MFC 吗?

我曾尝试使用Invalidate(), RedrawWindow()UpdateWindow()但没有成功...

我将不胜感激任何帮助。

0 投票
1 回答
873 浏览

mfc - 调整大小光标显示在固定对话框框架的边框上

在这里为您提供一个最小的工作示例有点困难,但我将尝试解释我刚刚注意到的这个问题。

上下文

所以,我有一个常规CDialogEx派生类,定义如下:

我已将其设置为边框不会调整大小:

设置

主应用程序(也是CDialogEx基于)有一个固定的窗口。那行为是正确的。

  • 用户从菜单中显示一个可调整大小的对话框(编辑器)。
  • 在这个对话框上是一个用户可以按下的按钮,它将依次显示我所指的弹出模式对话框。

发生什么了

当显示此对话框时,当您将鼠标悬停在对话框边框上时,我注意到了这一点:

帧光标

我不明白为什么会这样。

光标管理

在产生这个弹出窗口的“编辑器”中,我确实有一些像这样的光标管理:

但是,我暂时尝试从没有游标管理的主应用程序对话框中调用此弹出窗口,结果仍然相同。

间谍结果

根据要求,我刚刚使用 Spy 来检查窗口样式:

间谍结果

果然不出所料我们突然WS_THICKFRAME设置了,当它不在资源编辑器中时!

所以

在我的 RC 文件中,对话框DS_MODALFRAME设置了标志,但在运行时它最终WS_THICKFRAME设置了。据我所知,我从未对这些受影响的对话框对象进行这些更改。

更新

我发现了以下内容:

如果我在调用之前放置检查代码,CDialogEx::OnInitDialog();则样式设置为DS_MODALFRAME. 但是,如果我在调用放置相同的检查代码,则CDialogEx::OnInitDialog();它会更改为WS_THICKFRAME. 为什么?

好的

因此,该CDialogEx::OnInitDialog方法调用CWnd::LoadDynamicLayoutResource(LPCTSTR lpszResourceName). 这反过来调用CWnd::InitDynamicLayout(). 在方法中,它这样做:

我们去吧。所以这是因为我正在使用CDialogEx我的基类。这是MFC中的错误吗?

澄清

“编辑器”(拥有按钮的弹出窗口的父窗口)确实使用动态布局功能:

编辑

但在这种情况下,弹出窗口不需要。但这是因为我的弹出窗口源于CDialogEx这种情况。

情节变厚了

所以这是始终使用以下命令调用的 MFC 代码CDialog::OnInitDialog

由于某种原因,此调用BOOL bResult = CMFCDynamicLayout::LoadResource(this, lpResource, dwSize);是 return TRUE。结果,对话框最终调用InitDynamicLayout. 在我的其他弹出对话框中,这不会发生。取而代之的是,bResult最终FALSE框架没有调整大小。

那么为什么它认为它有效呢?

0 投票
1 回答
1035 浏览

c++ - 创建一个新的基 CDialogEx 派生类

我有很多CDialogEx派生类在做这样的事情OnInitDialog

然后,我在每个派生对话框类中添加了以下内容:

每个对话框唯一不同的是用于保存窗口位置的短语。

我想要一个CDialogEx可以继承的基础类,它将执行上述操作。我看过 SO,似乎有些问题,并创建了一个CDialog类并从另一个类继承CDialog。但是我想创建的这个类更通用。有效地用作基础而不是CDialogEx.

这可以做到吗?我是否过于复杂了?

问题

为什么我尝试创建一个新类,派生自CDialogEx

设置

结果

错误

我不知道是不是因为它需要一个对话框 ID ,如此所述。

需要对话 ID的类,如CDialogCFormView或。CPropertyPage

所以我无法找到正确的方法来创建一个用于我所有其他对话框类的基本 CDialogEx 类。

更新

我创建了这段代码,它告诉我这CResizingDialog不是一个类或命名空间:

0 投票
0 回答
256 浏览

mfc - 将状态栏添加到 CDialog 并正确设置控件位置

所以,我有一个CDialog我用了很长时间的资源,我决定给它添加一个状态栏。这是资源:

资源

所有控件都很好地适合对话框。现在,在运行时,它是这样的:

结果

我遵循的教程在这里,并且在大多数情况下都有效。这是我的设置代码:

我已经尝试不使用 WindowsBlinds,但问题仍然存在。

所以我的问题是:

1/ 控件与状态栏重叠。如何在资源编辑器中准确设置这些控件,以免发生此问题?应该如何解决?命中n错过?

2/我的对话框支持使用动态布局调整大小,它OBM_SIZE在右下角有:

我如何避免您现在可以在右下角看到的问题?

更新

看起来我应该使用CreateEx并使用这种风格SBARS_SIZEGRIP。然后停止创建我自己的调整大小图标。我假设两个夹具看起来相同。所以这可能是答案之一。

我尝试使用上面的标志,但不幸的是我不能使用它:

固定杆中的夹持器

这个抓手与我正在使用的另一个抓手不一致,所以我需要保留我原来的抓手。

更新 2

我现在意识到无论如何都会创建夹具,所以我在那里有两个夹具!我现在派生了自己的状态栏类并关闭了默认抓手:

所以现在我只有一个抓手。但是我的两个问题仍然存在。

更新 3

我偶然发现了这一点。理论上,如果我重写这个DrawGripper方法,我应该能够渲染我自己的抓手。不工作。该方法永远不会被调用。

更新 4

我决定不与系统抗争。我已经让状态栏绘制了主题抓手,并且我调整了我的调整大小对话框类来绘制主题抓手。所以一切都很好。

0 投票
1 回答
85 浏览

mfc - 对话框关闭时删除文件?

这是我的代码,它工作正常。但是我想通过变量删除文件xmlfilepath,我在OnInitDialog()

0 投票
0 回答
75 浏览

mfc - MFC 模态对话框阻止另一个模态对话框在对话框关闭后继续

创建了一个简单的 mfc 项目,然后创建三个对话框并添加 CDialog 类。

TestA、TestB、TestC 类。

在主框架对话框中,

TestA 类有,

问题发生在

  1. 公开测试A
  2. 开放测试B
  3. 打开TestC

现在,当我关闭 TestB AfxMessageBox(L"B closed"); 在我关闭 TestC 对话框之前不会运行。

为什么会这样?

0 投票
2 回答
564 浏览

mfc - 设置基于 MFC 对话框的应用程序窗口的位置

我有一个CDialog基于 MFC 的应用程序。程序结束时我保存窗口的当前位置。当程序启动时,我想恢复之前的位置。我目前正在尝试在 中执行此操作OnInitDialog(),但是,当我SetWindowPos()从内部调用时,程序会断言OnInitDialog()。我的电话SetWindowPos()类似于:

断言与空m_hWnd句柄有关。

这是重新定位基于对话框的应用程序窗口的正确位置吗?

关于我为什么断言的任何想法?

0 投票
1 回答
100 浏览

mfc - MFC:使用 CTreeCtrl 和 CToolbar 创建一个类(CWnd?)

我有一个CDialog基于应用程序的应用程序,它有两个并排的,CTreeCtrl并且两棵树在它们之上几乎相同CToolbars。目前,当对话框从其中一个工具栏接收到消息时,它会将消息传递给相应的树。我想创建一个新类,可能从 CWnd 派生,其中包含 oneCTreeCtrl和 one CToolbar。这个新类会将消息从它的一个工具栏传递到它的一棵树。它将删除大量冗余代码(大概)简化正在进行的开发。

我的问题是,CWnd这个任务是否合适(结合 aCTreeCtrlCToolbar)?

谢谢!

0 投票
0 回答
438 浏览

c++ - 更新 RichEdit20A 时如何阻止 CDialog(mfc) 在 Invalidate 上闪烁

我有一个计时器,我在 aRichEdit20A内向用户显示CDialog。问题是每次我更新RichEdit20A,屏幕闪烁。

因为我的对话框中有几个RichEdit20A,所以我有一个下面的方法来更新它们。我试过ModifyStyle(0, WS_CLIPCHILDREN, 0); OnInitDialog了,但它会删除我所有的RichEdit20A文字。我还尝试过RedrawWindow(Null,Null, RDW_Erase)--Dialog 仍然闪烁,并且RedrawWindow(Null,Null, RDW_Invalidate)--所有文本都写在旧文本之上,使其无法阅读。

我知道 Invalidate 是导致闪烁的原因,而双缓冲(我以前从未做过)是用来解决 CView 的此类问题的……我不知道该怎么做才能停止CDialog 闪烁,这是我用于程序的窗口。任何帮助,将不胜感激。谢谢!

0 投票
2 回答
403 浏览

c++ - CDialog标题/标题的字体样式

我想更改对话框标题/标题的字体样式和字体大小(源自 CDialog)。由于标题/标题与任何资源 id 都没有关联,所以我什至不能使用 SetFont().Tell