在消息映射中创建按钮和引用

时间:2019-01-29 11:31:26

标签: c++ mfc

我正在使用消息映射在oncreate上创建一个按钮。

在传递对ICL_OK的引用时,我无法从ON_BN_CLICKED获得回调消息。

我不认为这是一个育儿问题。窗口是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工作。

参考此答案 Message map macros

我可以再次确认oncmdmsg正常运行,但是不会触发wm_command事件。 Message map macros

更新:仍然无法正常工作,替代方法是使用ON_COMMAND_RANGE并仍然触发WM_COMMAND,因此只需限制其处理的消息量即可。希望它可以帮助某人。如果您想生成一个按钮,下面的解决方案可能会为您提供帮助。

1 个答案:

答案 0 :(得分:1)

您正在写该按钮未在窗口中显示。这是有原因的,我想这是可能的:您在子例程/方法/函数中定义按钮,而不是在其父类中定义按钮。

相反,在其父类中,无论是CMainFrame还是其他Window,都定义如下按钮:

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

在现在包含CMainFrame的类中,最好在OnCreate()或OnCreateClient()中创建按钮... p

调用基类版本,然后创建按钮。...

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派生的Windows类通常在其析构函数中调用DestroyWindow(),这意味着该窗口在调用结束时被破坏,这就是它不可见的原因。