Нажатие кнопки во встроенном диалоге CTabCtrl
От: Tujh Голландия  
Дата: 13.02.19 16:34
Оценка:
Добрый день.

Вопрос вроде простой, а я что-то не могу уловить суть.
В ресурсах есть диалог для встройки на котором лежат только метка и кнопка. Далее этот диалог подгружается в TabCtrl:
BOOL Cmfc_testDlg::OnInitDialog()
{
  CDialog::OnInitDialog();

  CDialog* pDialog = new CDialog;
  CTabCtrl* parent = (CTabCtrl*)GetDlgItem( IDC_TAB1 );
  pDialog->Create( IDD_DIALOG1, parent->GetWindow( IDD_DIALOG1 ) );

  parent->InsertItem(0, _T("Page1"));

  // ... тут считаются размеры диалога
  crClient.OffsetRect(crTab.left, crTab.top);

  pDialog->MoveWindow(&crClient);
  pDialog->EnableWindow( TRUE );
  pDialog->ShowWindow( SW_SHOW );
  
  return TRUE;  // return TRUE  unless you set the focus to a control
}

сути и всё, но хочется обработать нажатие на кнопку, которая на диалоге IDD_DIALOG1, через редактор назначил обработчик, но он не срабатывает
BEGIN_MESSAGE_MAP(Cmfc_testDlg, CDialog)
    ON_WM_PAINT()
    ON_WM_QUERYDRAGICON()
    //}}AFX_MSG_MAP
  ON_BN_CLICKED(IDC_BUTTON1, &Cmfc_testDlg::OnBnClickedButton1)
END_MESSAGE_MAP()

...

void Cmfc_testDlg::OnBnClickedButton1()
{
  AfxMessageBox(_T("Cmfc_testDlg::OnBnClickedButton1()"));
}

С MFC давно не работал и чувствую, что какую-то мелочь упустил.

Заранее благодарю за ответы.

З.Ы. CPropertySheet не предлагать
Re: Нажатие кнопки во встроенном диалоге CTabCtrl
От: Carc Россия https://vk.com/gosha_mazov
Дата: 13.02.19 20:10
Оценка:
Здравствуйте, Tujh, Вы писали:

T>Добрый день.


T>Вопрос вроде простой, а я что-то не могу уловить суть.

T>В ресурсах есть диалог для встройки на котором лежат только метка и кнопка. Далее этот диалог подгружается в TabCtrl:
T>
BOOL Cmfc_testDlg::OnInitDialog()
T>{
T>  CDialog::OnInitDialog();

T>  CDialog* pDialog = new CDialog;
T>  CTabCtrl* parent = (CTabCtrl*)GetDlgItem( IDC_TAB1 );
T>  pDialog->Create( IDD_DIALOG1, parent->GetWindow( IDD_DIALOG1 ) );

T>  parent->InsertItem(0, _T("Page1"));

T>  // ... тут считаются размеры диалога
T>  crClient.OffsetRect(crTab.left, crTab.top);

T>  pDialog->MoveWindow(&crClient);
T>  pDialog->EnableWindow( TRUE );
T>  pDialog->ShowWindow( SW_SHOW );
  
T>  return TRUE;  // return TRUE  unless you set the focus to a control
T>}

T>сути и всё, но хочется обработать нажатие на кнопку, которая на диалоге IDD_DIALOG1, через редактор назначил обработчик, но он не срабатывает
T>
BEGIN_MESSAGE_MAP(Cmfc_testDlg, CDialog)
T>    ON_WM_PAINT()
T>    ON_WM_QUERYDRAGICON()
T>    //}}AFX_MSG_MAP
T>  ON_BN_CLICKED(IDC_BUTTON1, &Cmfc_testDlg::OnBnClickedButton1)
T>END_MESSAGE_MAP()

T>...

T>void Cmfc_testDlg::OnBnClickedButton1()
T>{
T>  AfxMessageBox(_T("Cmfc_testDlg::OnBnClickedButton1()"));
T>}
T>

T>С MFC давно не работал и чувствую, что какую-то мелочь упустил.

T>Заранее благодарю за ответы.


T>З.Ы. CPropertySheet не предлагать

По ходу всё дело в этих строчках

  CTabCtrl* parent = (CTabCtrl*)GetDlgItem( IDC_TAB1 );
  pDialog->Create( IDD_DIALOG1, parent->GetWindow( IDD_DIALOG1 ) ); //то бишь родитель для дочернего диалога CTabCtrl

А в карте что написано?

BEGIN_MESSAGE_MAP(Cmfc_testDlg, CDialog)// карта-то ептытъ для диалога, а нотификации от кнопки пойдут в CTabCtrl, а не в его родительский диалог
T>  ON_BN_CLICKED(IDC_BUTTON1, &Cmfc_testDlg::OnBnClickedButton1)
T>END_MESSAGE_MAP()


А пытаемся ловить нотификацию BN_CLICKED уже в диалоге верхнего уровня, на котором лежит CTabCtrl, а именно в CTabCtrl придет нотификацию, а не в диалог на котором CTabCtrl болтается.

Просто нужно создавать дочерний диалог, на самом диалоге. А CTabCtrl просто лежит рядом. Обычно так делают.

PS: я так дума-а-а-аю ©… Ну по крайней мере навскидку, судя по коду.
Aml Pages Home
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.