簡體   English   中英

單擊按鈕后不會觸發 MFC 中動態創建的按鈕事件

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM