Пользовательский элемент управления MFC не отображается в диалоговом окне - PullRequest
0 голосов
/ 15 ноября 2018

Используя 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 ()?

Я также заметилчто ни одна из кнопок-членов не создается в Panel, как это обычно происходит в диалоговом методе DoDataExchange.Вместо этого мне пришлось прибегнуть к динамическому созданию каждого элемента управления внутри метода Panel 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, в диалоговом окне ничего не появится.

Любая помощь приветствуется.Спасибо.

1 Ответ

0 голосов
/ 15 ноября 2018

В статье говорится о переопределении OnPaint и OnEraseBkgnd, если вы хотите изменить функциональность. Это не говорит, что вы должны переопределять всегда.

Просто удалите ON_WM_PAINT и ON_WM_ERASEBKGND, удалите OnPaint и OnEraseBkgnd, если они вам не нужны. Или вызовите реализации базового класса, если вы не вносите никаких изменений:

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

Это покажет пустой элемент управления без ничего, если вы не добавите дочернее окно к _panel, как вы это сделали в MyPanel:PreSubclassWindow

Вы добавляете _groupBox к _panel. И вы добавляете _panel к MyDialog.

MyDialog::DoDataExchange(...){DDX_Control(pDX, IDC_CUSTOM_PANEL, _panel)} необходим для вызова SubclassWindow для _panel. Это, в свою очередь, вызывает _groupBox.Create.

Если MyPanel::OnPaint и MyPanel::PreSubclassWindow ничего не делают MyPanel отображается как пустой элемент управления.

... сделать это для каждого элемента диалога ??? кажется излишним ...

Вы можете напрямую добавить _groupBox в главное диалоговое окно. Но если вы хотите добавить определенные элементы управления в MyPanel, то вам нужно сделать это вручную.

Вы также можете создать дочерний диалог в главном диалоге. Например, так работает элемент управления вкладками.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...