C++ MFC自定义控件未出现在对话框上

C++ MFC自定义控件未出现在对话框上,c++,mfc,custom-controls,C++,Mfc,Custom Controls,使用Visual Studio 2013,我使用资源编辑器创建了一个对话框资源。它是一个没有边框的子控件,只是单选按钮、按钮和静态文本的集合。我想将其转换为自定义控件,以便将其放置在几个不同的位置。让我们称之为“面板” 然后,我创建了一个常规对话框,并使用工具箱“自定义控件”,为面板定义了一个区域。面板注册自身并具有有效的窗口句柄 我使用了以下示例: 父级的DDX被命中,并且_面板被正确实例化: MyDialog::DoDataExchange(CDataExchange* pDX) {

使用Visual Studio 2013,我使用资源编辑器创建了一个对话框资源。它是一个没有边框的子控件,只是单选按钮、按钮和静态文本的集合。我想将其转换为自定义控件,以便将其放置在几个不同的位置。让我们称之为“面板”

然后,我创建了一个常规对话框,并使用工具箱“自定义控件”,为面板定义了一个区域。面板注册自身并具有有效的窗口句柄

我使用了以下示例:

父级的DDX被命中,并且_面板被正确实例化:

MyDialog::DoDataExchange(CDataExchange* pDX)
{
   CDialog::DoDataExchange(pDX)
   DDX_Control(pDX, IDC_CUSTOM_PANEL, _panel)
}
我读到我需要重写OnPaint()和OnEraseBkgnd(CDC*pDC)方法,以便Panel类具有这些方法,但它们是空的。我没有任何自定义的绘画,因为面板只包含常规按钮

OnPaint()中必须包含哪些内容?

我还注意到,面板中没有一个成员按钮像对话框的DoDataExchange方法中通常发生的那样被实例化。相反,我不得不求助于在面板的PreSubclassWindow()方法中动态创建每个控件:

我已经在资源编辑器中定义/设计了面板及其每个控件,为什么还要这样做?

如果不在PreSubclassWindow方法中执行此操作,则对话框上将不会显示任何内容


感谢您的帮助。谢谢。

如果您想更改功能,文章会说override
OnPaint
OnEraseBkgnd
。它并不是说你必须总是覆盖

只需删除画图上的
和擦除BKGND上的
,如果不需要它们,请删除画图上的
和OnEraseBkgnd上的
。如果不进行任何更改,请调用基类实现:

void MyPanel::OnPaint() { CWnd::OnPaint(); }
BOOL MyPanel::OnEraseBkgnd(CDC* pDC) { return CWnd::OnEraseBkgnd(pDC); }
这将显示一个空白控件,其中没有任何内容,除非您像在
MyPanel:PreSubclassWindow
中那样将子窗口添加到
\u面板

您正在将
\u组框
添加到
\u面板
。您正在将
\u面板
添加到
MyDialog

MyDialog::需要DoDataExchange(…){DDX_控件(pDX、IDC_自定义_面板、_面板)}
来调用
子类窗口
,以调用
_面板
。依次调用
\u groupBox.Create

如果
MyPanel::OnPaint
MyPanel::PreSubclassWindow
没有执行任何操作,则
MyPanel
显示为空白控件

。。。对每个对话框元素执行此操作???看起来太过分了

您可以直接将
\u groupBox
添加到主对话框中。但是,如果您想在
MyPanel
中添加特定控件,则必须手动添加


也可以在主对话框中创建子对话框。例如,选项卡控件就是这样工作的。

谢谢。我可以通过PreSubclassWindow绘制每个元素,但您最后的评论“您也可以在主对话框中创建子对话框”使我找到了一个更简单的解决方案。我不知道为什么我认为我被限制在一个对话框中只有一个对话框,但因为我不是,我可以使面板成为一个对话框,可以在各种控件中使用,只要我在其父OnInitDialog中动态创建它,而不是依赖其父DDX来实例化它。
void MyPanel::OnPaint() { CWnd::OnPaint(); }
BOOL MyPanel::OnEraseBkgnd(CDC* pDC) { return CWnd::OnEraseBkgnd(pDC); }