2016-10-03 100 views
1

所以我被要求在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 
+0

您是否看到您创建的按钮?解释你用来创建项目的设置,例如带有Doc/View支持的MDI +标准或办公风格... –

+0

@BarmakShemirani是的,我可以看到我创建的按钮,我不太确定,因为我不是创建项目文件但AFAIK的人不使用Ribbon Style。 – EiZenHoweLL

+0

我不知道发生了什么事。我认为这应该工作。也许你在'PreTranslateMessage'或其他地方做了一些奇怪的事情。或者在发生碰撞的情况下为'IDC_MAINFRM_BTN_1'尝试不同的值。 –

回答

1

这是一种奇怪的方式来放置按钮,因为框架通常有孩子的窗口(像个孩子框架和MDI框架等),但在这里它是,与SDI框架的工作(我没有在端

CButton*    testButton; 

afx_msg void ShowTestMessage(); 

CMainFrame::OnCreate:测试它的一个MDI框架,虽然):

CMainFrame

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并在那里创建它们。您应该能够处理客户端类中的按钮点击。

+0

OP说按钮显示,所以这不应该是一个问题。但你说得对,它是一个奇怪的放置按钮的地方。 –

+0

@AdrianRoman哪里是放置按钮的正确位置?顺便说一句,我刚刚了解到,该项目可能有MDI框架判断他的代码片段,我在MainFrm头'class CMainFrame:public CMDIFrameWnd'中找到。我只是从字面上理解了MFC的周末,我仍然对它感到困惑,因为它与开发Java程序截然不同@ __ @ 而且,它仍然不起作用。我尝试用你写的那个替换消息映射。 :/也许有一些东西与@Barmak所说的消息混淆:/ – EiZenHoweLL

+2

您已经复制了OP已经有的确切代码。这没有帮助。 @EiZenHoweLL:你正试图同时学习MFC,C++和Windows编程。永远不会去工作。 [学习MFC编程的先决条件](http://stackoverflow.com/q/18165076/1889329)告诉你,需要什么。如果您不耐烦,请查看[TN021:命令和消息路由](https://msdn.microsoft.com/en-us/library/xt2c310k.aspx)。 – IInspectable

相关问题