所以我被要求在MFC中创建一堆按钮来使用新函数更新应用程序。在MFC中动态创建按钮事件不会在单击按钮后触发
我做了什么是
a。 resource.h中
#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
预留的ID我也确信,有一个在RESOURCE.H
B无重复的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
℃。对于消息映射,我已经尝试了这两种方法,并且它们都不工作或捕获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并不擅长。我试图寻找所有可能犯的错误,但我仍然无法找出事件不发生的原因。 @ __ @
编辑1:如果它帮助我在Visual Studio 2013中开发这个项目(也许)使用MDI来判断我在标题中找到的类声明。
class CMainFrame : public CMDIFrameWnd
您是否看到您创建的按钮?解释你用来创建项目的设置,例如带有Doc/View支持的MDI +标准或办公风格... –
@BarmakShemirani是的,我可以看到我创建的按钮,我不太确定,因为我不是创建项目文件但AFAIK的人不使用Ribbon Style。 – EiZenHoweLL
我不知道发生了什么事。我认为这应该工作。也许你在'PreTranslateMessage'或其他地方做了一些奇怪的事情。或者在发生碰撞的情况下为'IDC_MAINFRM_BTN_1'尝试不同的值。 –