我正在使用消息映射在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,因此只需限制其处理的消息量即可。希望它可以帮助某人。如果您想生成一个按钮,下面的解决方案可能会为您提供帮助。
答案 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(),这意味着该窗口在调用结束时被破坏,这就是它不可见的原因。