gpt4 book ai didi

c++ - 单击按钮后,MFC 中动态创建的按钮事件不会触发

转载 作者:行者123 更新时间:2023-11-30 05:22:06 27 4
gpt4 key购买 nike

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

对于消息映射,我已经尝试了这两种方法,但它们都不起作用或捕获函数,至于 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)

我还确保 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 中开发它,并且根据我在 header 中找到的类声明判断,这个项目(可能)使用 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)

稍后编辑:如果您真的想要客户区中的按钮,那么您将有一些工作要做。首先,导出一个“子框架”,类似这样的东西:

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

关于c++ - 单击按钮后,MFC 中动态创建的按钮事件不会触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39824028/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com