[英]Dynamically Created Button Events in MFC Doesn't Fire After Clicking the Button
所以我被要求在 MFC 中制作一堆按钮来更新应用程序的新功能。
我所做的是
一种。 在 resource.h 中保留 ID
#define IDC_MAINFRM_BTN_1 40501
#define IDC_MAINFRM_BTN_2 40502
#define IDC_MAINFRM_BTN_3 40503
#define IDC_MAINFRM_BTN_4 40504
#define IDC_MAINFRM_BTN_5 40505
我还确保 resource.h 中没有重复的 ID
湾为了创建按钮,我在 CMainFrame::OnCreate() 函数中插入了这些代码
//Custom function start
cButtonA = new CButton();
cButtonB = new CButton();
cButtonC = new CButton();
cButtonD = new CButton();
cButtonE = new CButton();
cButtonA->Create(_T("My button 1"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, CRect(btnLeft1, btnTop1, btnRight1, btnBottom1), this, IDC_MAINFRM_BTN_1);
cButtonB->Create(_T("My button 2"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, CRect(btnLeft1, btnTop2, btnRight1, btnBottom2), this, IDC_MAINFRM_BTN_2);
cButtonC->Create(_T("My button 3"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, CRect(btnLeft1, btnTop3, btnRight1, btnBottom3), this, IDC_MAINFRM_BTN_3);
cButtonD->Create(_T("My button 4"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, CRect(btnLeft2, btnTop1, btnRight2, btnBottom1), this, IDC_MAINFRM_BTN_4);
cButtonE->Create(_T("My button 5"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, CRect(btnLeft2, btnTop2, btnRight2, btnBottom2), this, IDC_MAINFRM_BTN_5);
头文件:
CButton* cButtonA; //First Button
CButton* cButtonB; //Second Button
CButton* cButtonC; //Third Button
CButton* cButtonD; //Fourth Button
CButton* cButtonE; //Fifth Button
C。 对于消息映射,我已经尝试了这两种方法,但它们都不起作用,也没有捕获函数,就像 ShowTestMessage 函数一样,它只包含一个占位符 AfxMessageBox 代码。 也试过在这些上设置断点,但它仍然不起作用。
BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd)
//{{AFX_MSG_MAP(CMainFrame)
//Method 1
ON_COMMAND_RANGE(IDC_MAINFRM_BTN_1, IDC_MAINFRM_BTN_13, &CMainFrame::ShowTestMessage)
//Method 2
ON_BN_CLICKED(IDC_MAINFRM_BTN_1, &CMainFrame::ShowTestMessage)
d. 我还确保 MainFrm.h 中处理事件的函数具有 afx_msg 前缀。
protected:
//{{AFX_MSG(CMainFrame
afx_msg void ShowTestMessage();
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
//}}AFX_MSG
DECLARE_MESSAGE_MAP(
我尝试通过在 PreTranslateMessage 中添加一些代码行来拦截消息的其他事情
if (pMsg->message == BN_CLICKED){ //This doesn't work
AfxMessageBox("Ohlala", MB_OK);
}
if (pMsg->message == WM_LBUTTONDOWN){ //This one work
AfxMessageBox("Ohlala", MB_OK);
}
然后我尝试将事件句柄更改为
void CMainFrame::OnLButtonDown(UINT nFlags, CPoint point)
然而这个也没有触发(因为断点没有被触发)
所以我错过了什么吗? 我不得不承认我并不擅长 MFC。 我尝试搜索我可能犯的所有可能的错误,但我仍然无法找出事件没有触发的原因。 @__@
EDIT1:如果它有助于我在 Visual Studio 2013 中开发它,并且这个项目(也许)根据我在标题中找到的类声明来判断使用 MDI。
class CMainFrame : public CMDIFrameWnd
这是一种放置按钮的奇怪方式,因为框架通常有子窗口(例如子框架和 MDI 框架等),但在这里,使用 SDI 框架(我没有针对 MDI 框架对其进行测试,尽管):
在CMainFrame
:
CButton* testButton;
afx_msg void ShowTestMessage();
在CMainFrame::OnCreate
最后:
testButton = new CButton();
testButton->Create(_T("My button 1"),
WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, CRect(10, 10, 100, 30), this, ID_TEST_BUTTON);
“点击”方法:
afx_msg void CMainFrame::ShowTestMessage()
{
AfxMessageBox(L"Bingo!");
}
在消息映射中:
ON_COMMAND(ID_TEST_BUTTON, &CMainFrame::ShowTestMessage)
稍后编辑:如果您真的想要客户区中的按钮,那么您将有一些工作要做。 首先,派生一个“子框架”,像这样:
class CChildFrame : public CMDIChildWndEx
其次,用您的文档模板替换子框架,如下所示:
m_pWhateverDocTemplate = new CMultiDocTemplate( IDR_SOME_ID, RUNTIME_CLASS(CWhateverDoc), RUNTIME_CLASS(CChildFrame), RUNTIME_CLASS(CWhateverView)); AddDocTemplate(m_pWhateverDocTemplate);
此处更改的是CChildFrame
而不是默认的CMDIChildWndEx
。 现在您可以在客户端窗口中创建您的按钮。 也许您可以覆盖OnCreateClient
并在那里创建它们。 您应该能够处理客户端类中的按钮点击。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.