因此我被要求在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)
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
答案 0 :(得分:1)
这是放置按钮的一种奇怪的方式,因为框架通常有子窗口(如子框架和MDI框架等),但这里是,使用SDI框架(我没有不过测试它的MDI框架:
在func >>- <T:UIView> (lhs: (T,T), attributes: [NSLayoutAttribute]){
for attribute in attributes{
let closure: (inout Constraint) -> () = {
$0.attribute = attribute
}
lhs >>- closure
}
}
:
CMainFrame
最后在CButton* testButton;
afx_msg void ShowTestMessage();
:
CMainFrame::OnCreate
点击&#39;方法:
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
并在那里创建它们。您应该能够处理客户端类中的按钮点击。