создать элемент управления программно с помощью MFC - PullRequest
6 голосов
/ 09 июня 2009

Мне просто интересно, как это сделать. Я пишу:

CEdit m_wndEdit;

и в обработчике событий кнопки (диалоговое приложение), Я пишу:

m_wndEdit.Create(//with params);

но я все еще не вижу элемента управления в пользовательском интерфейсе.

Я написал это в обработчике кнопок:

CWnd* pWnd = GetDlgItem(IDC_LIST1);
CRect rect;

pWnd->GetClientRect(&rect);

//pWnd->CalcWindowRect(rect,CWnd::adjustBorder);

wnd_Edit.Create(ES_MULTILINE | ES_NOHIDESEL | ES_READONLY,rect,this,105);

wnd_Edit.ShowWindow(SW_SHOW);

this->Invalidate();

id 105 не существует. (Я использовал его в функции Create члена CEdit). Я просто положил это туда. разве это не должен быть идентификатор, который вы хотите дать новому контролю? Должен ли он уже существовать?

Ответы [ 3 ]

4 голосов
/ 10 июня 2009
  • Invalidate () не требуется

  • Добавьте флаг WS_VISIBLE к своим флагам создания, вам не нужно ShowWindow

  • Вы создаете кнопку в месте, где находится IDC_LIST1 - вы, вероятно, захотите выполнить pWdn-> Destroy () после GetClientRect ()

  • Идентификатор, который вы передаете Create (), может быть любым, конечно, если вы хотите обрабатывать сообщения от этой кнопки позже, вам нужно будет использовать правильный идентификатор. В этом случае проще всего вручную добавить запись в resource.h.

  • Что вы имеете в виду под «Я поместил этот код в обработчик событий кнопки» - какую кнопку? Надеюсь, вы отличаетесь от того, который вы пытаетесь создать? Ваш код вызывается вообще, он останавливается, когда вы ставите точку останова? Каково значение wnd_Edit-> m_hWnd после вызова Create ()?

  • wnd_Edit является членом вашего диалога, верно, а не локальной переменной функции?

4 голосов
/ 09 июня 2009

Проверьте со следующим набором флагов, как в примере, упомянутом в MSDN :

   pEdit->Create(ES_MULTILINE | WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_BORDER | ES_NOHIDESEL | ES_READONLY,
      rect, this, 105);
0 голосов
/ 09 июня 2009

Что такое wnd_Edit? Если в этой функции это локальная переменная, скорее всего, это проблема. Деструктор CWnd уничтожает окно, связанное с CWnd. Поэтому, когда wnd_Edit выходит из области видимости, поле редактирования также уничтожается. Если это не так, проверьте возвращаемое значение Create (). Это NULL? Если это так, проверьте значение GetLastError ().

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