簡體   English   中英

MFC 自定義控件未出現在對話框中

[英]MFC Custom Control Not Appearing On Dialog

使用 Visual Studio 2013,我使用資源編輯器創建了一個對話框資源。 它是一個沒有邊框的子控件,只是單選按鈕、按鈕和靜態文本的集合。 我想把它變成一個自定義控件,以便將它放在幾個不同的位置。 我們稱之為“面板”。

然后我創建了一個常規對話框並使用工具箱“自定義控件”為面板定義了一個區域。 Panel 注冊自己並有一個有效的窗口句柄。

我使用了以下示例: 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 方法中那樣在面板中實例化任何成員按鈕。 相反,我不得不求助於在面板的 PreSubclassWindow() 方法中動態創建每個控件:

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()
}

當我已經在資源編輯器中定義/設計了面板及其每個控件時,為什么還需要這樣做?

如果我不在 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

MyDialog::DoDataExchange(...){DDX_Control(pDX, IDC_CUSTOM_PANEL, _panel)}需要為_panel調用SubclassWindow 這反過來調用_groupBox.Create

如果MyPanel::OnPaintMyPanel::PreSubclassWindow未執行任何操作,則MyPanel顯示為空白控件。

...對每個對話框元素都這樣做??? 好像有點矯枉過正……

您可以直接將_groupBox添加到主對話框中。 但是,如果您想在MyPanel添加特定控件,則必須手動進行。

您還可以在主對話框中創建子對話框。 例如,這就是選項卡控件的工作方式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM