MFC自定义控件未出现在对话框中



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

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

我使用了以下示例:https://www.codeproject.com/Articles/521/Creating-Custom-Controls

父对象的DDX被命中,并且_panel被正确实例化:

MyDialog::DoDataExchange(CDataExchange* pDX)
{
   CDialog::DoDataExchange(pDX)
   DDX_Control(pDX, IDC_CUSTOM_PANEL, _panel)
}

我读到我需要重写OnPaint((和OnEraseBkgnd(CDC*pDC(方法,所以Panel类有这些方法,但它们是空的。我没有任何自定义绘画要做,因为面板只包含常规按钮。

我必须在OnPaint((中包含什么

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

void MyPanel:PreSubclassWindow()
{
   _groupBox.Create(_T("Options"), WS_CHILD|WS_VISIBLE|BS_GROUPBOX, CRect(11, 11, 112, 231), this, IDC_STATIC_GROUPBOX);
   //... do this for every dialog element??? seems like overkill...
   CWnd::PreSubclassWindow()
}

既然我已经在资源编辑器中定义/设计了Panel及其每个控件,为什么我需要这样做

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

感谢您的帮助。谢谢

这篇文章说,如果您想更改功能,请覆盖OnPaintOnEraseBkgnd。它并没有说你必须总是重写。

只需移除ON_WM_PAINTON_WM_ERASEBKGND,如果不需要,则移除OnPaintOnEraseBkgnd。或者,如果您没有进行任何更改,则调用基类实现:

void MyPanel::OnPaint() { CWnd::OnPaint(); }
BOOL MyPanel::OnEraseBkgnd(CDC* pDC) { return CWnd::OnEraseBkgnd(pDC); }

这将显示一个空白控件,其中没有任何内容,除非您像在MyPanel:PreSubclassWindow 中那样向_panel添加子窗口

您正在将_groupBox添加到_panel。您正在将_panel添加到MyDialog

需要CCD_ 13来为CCD_ 15调用CCD_。这反过来又调用_groupBox.Create

如果CCD_ 17和CCD_ 18没有做任何事情,则CCD_。

。。。对每个对话框元素都这样做???看起来太夸张了

您可以直接将_groupBox添加到主对话框中。但是,如果要在MyPanel中添加特定控件,则必须手动执行。

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

最新更新