Создать кнопку и ссылку в карте сообщений - PullRequest
0 голосов
/ 29 января 2019

Я создаю кнопку на своем экране, используя карту сообщений.

Я не могу получить сообщение обратного вызова от ON_BN_CLICKED при передаче ссылки на ICL_OK.

Я не верю, что это проблема с родительскими функциями.Окно представляет собой CFrameWnd, а родительское - CMainFrame.

Даже получая все сообщения, я могу переключаться между тем, что я хочу сделать, так как у меня есть списки и поля ввода для добавления, а также для редактирования / получения ответа.

Спасибо

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

            okBtn.Create(_T("Ok Button"), WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,
        CRect(10, 10, BUTTON_WIDTH, HEIGHT), this, ICL_OK);

Чтобы нажать кнопку и получить ответ.Вместо этого в использовании OnCmdMsg и получении ссылки на его nID, который мне не нравится.Я хочу, чтобы BN_CLICKED работал.

Ссылаясь на этот ответ Макросы карты сообщений

Я снова могу подтвердить, что oncmdmsg работает, но событие wm_command не запускается. Макросы карты сообщений

ОБНОВЛЕНИЕ: Все еще не работает, альтернативой является использование ON_COMMAND_RANGE и все еще запускает WM_COMMAND, поэтому просто нужно ограничить количество сообщений, которые он обрабатывает.Надеюсь, это кому-нибудь поможет.Если вы хотите сгенерировать кнопку, вам может помочь приведенное ниже решение.

1 Ответ

0 голосов
/ 29 января 2019

Вы пишете, что кнопка не отображается в окне.Для этого есть причина, и я бы предположил это: вы определяете кнопку в подпрограмме / методе / функции вместо определения ее в родительском классе.

Вместо этого в родительском классе, является ли этоCMainFrame или какое-либо другое окно, определите кнопку, например:

class CMainFrame : public CFrameWnd
{
/// bunch of stuff, including OnCreate() or OnCreateClient()
   CButton m_button;
};

В классе, в котором находится кнопка, предполагая, что сейчас CMainFrame, создайте кнопку ... в идеале в OnCreate () или OnCreateClient ()

вызов версии базового класса, а затем ваша кнопка create ....

int CMainFrame::OnCreate(LPCREATESTRUCT lpcs)
{
   int ret = __super::OnCreate(lpcs);
   if (ret != -1) {
       m_button.Create(_T("Ok Button"), WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON, CRect(10, 10, BUTTON_WIDTH, HEIGHT), this, ICL_OK);
   }
   return ret;
}

Если ваш конструктор находится в методе, то его деструктор будет вызываться в конце метода.Производные классы окон MFC CWnd обычно вызывают DestroyWindow () в своем деструкторе, и это означает, что окно уничтожается к концу вызова, и поэтому оно невидимо.

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