![](/img/trans.png)
[英]How to connect an MFC control to a custom control in the visual dialog editor
[英]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 方法中執行此操作,則對話框中將不顯示任何內容。
任何幫助表示贊賞。 謝謝。
文章說如果您想更改功能,請覆蓋OnPaint
和OnEraseBkgnd
。 這並不是說您必須始終覆蓋。
只需刪除ON_WM_PAINT
和ON_WM_ERASEBKGND
,如果不需要它們,請刪除OnPaint
和OnEraseBkgnd
。 或者,如果您沒有進行任何更改,則調用基類實現:
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::OnPaint
和MyPanel::PreSubclassWindow
未執行任何操作,則MyPanel
顯示為空白控件。
...對每個對話框元素都這樣做??? 好像有點矯枉過正……
您可以直接將_groupBox
添加到主對話框中。 但是,如果您想在MyPanel
添加特定控件,則必須手動進行。
您還可以在主對話框中創建子對話框。 例如,這就是選項卡控件的工作方式。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.