VS2008下如何為mfc新增自定義訊息
阿新 • • 發佈:2019-02-01
VS2008與其它VS系列有很大的變化,取消了class wized這個東西,用起來一開始確實很不習慣,以前新增自定義訊息直接按新增按鈕然後配置一個頭檔案就好了,現在都要自己來寫,也算溫習下windows的訊息機制吧
1.首先在標頭檔案中定義ON_MESSAGE函式的ID
#define WM_MY_MESSAGE WM_USER+0x001
2.在標頭檔案中定義訊息函式
afx_msg LRESULT OnMyMessage(WPARAM wparam,LPARAM lparam);
3.在cpp檔案中新增自定義訊息的訊息對映(BEGIN_MESSAGE_MAP(CSubDlg, CDialog)與END_MESSAGE_MAP()之前進行新增)
ON_MESSAGE(WM_MY_MESSAGE,&CSubDlg::OnMyMessage)
4.在cpp檔案中寫函式的方法
afx_msg LRESULT CSubDlg::OnMyMessage(WPARAM wParam, LPARAM lParam)
{
MessageBox(_T("接受的我的自定義訊息!"),_T("提示"),MB_ICONINFORMATION);
return 0;
}
這樣一個自定義訊息就被建立成功了,如何想被呼叫的話直接使用定義的函式ID來進行呼叫
void CSubDlg::OnBnClickedOk()
{
// TODO : 在此新增控制元件通知處理程式程式碼
SendMessage(WM_MY_MESSAGE);
}
下面貼上完整的.h與.cpp檔案
.h
#pragma once
#define WM_MY_MESSAGE WM_USER+0x001
// CSubDlg 對話方塊
class CSubDlg : public CDialog
{
DECLARE_DYNAMIC(CSubDlg)
public:
CSubDlg(CWnd* pParent = NULL); // 標準建構函式
virtual ~CSubDlg();
// 對話方塊資料
enum { IDD = IDD_DIALOG2 };
protected :
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支援
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnBnClickedOk();
afx_msg LRESULT OnMyMessage(WPARAM wparam,LPARAM lparam);
afx_msg void OnEnChangeEdit2();
afx_msg void OnEnChangeEdit1();
};
.CPP
// SubDlg.cpp : 實現檔案
//
#include "stdafx.h"
#include "test_ui.h"
#include "SubDlg.h"
#include "test_ui.h"
// CSubDlg 對話方塊
IMPLEMENT_DYNAMIC(CSubDlg, CDialog)
CSubDlg::CSubDlg(CWnd* pParent /*=NULL*/)
: CDialog(CSubDlg::IDD, pParent)
{
//GetDlgItem(IDC_EDIT1)->SetWindowText(_T("在主對話方塊編輯框Edit中顯示"));
}
CSubDlg::~CSubDlg()
{
}
void CSubDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CSubDlg, CDialog)
ON_BN_CLICKED(IDOK, &CSubDlg::OnBnClickedOk)
ON_EN_CHANGE(IDC_EDIT2, &CSubDlg::OnEnChangeEdit2)
ON_EN_CHANGE(IDC_EDIT1, &CSubDlg::OnEnChangeEdit1)
ON_MESSAGE(WM_MY_MESSAGE,&CSubDlg::OnMyMessage)
END_MESSAGE_MAP()
// CSubDlg 訊息處理程式
void CSubDlg::OnBnClickedOk()
{
// TODO: 在此新增控制元件通知處理程式程式碼
//test_ui dlg;
//dlg.DoModel();
SendMessage(WM_MY_MESSAGE);
}
void CSubDlg::OnEnChangeEdit2()
{
// TODO: 如果該控制元件是 RICHEDIT 控制元件,則它將不會
// 傳送該通知,除非重寫 CDialog::OnInitDialog()
// 函式並呼叫 CRichEditCtrl().SetEventMask(),
// 同時將 ENM_CHANGE 標誌“或”運算到掩碼中。
// TODO: 在此新增控制元件通知處理程式程式碼
}
afx_msg LRESULT CSubDlg::OnMyMessage(WPARAM wParam, LPARAM lParam)
{
MessageBox(_T("接受的我的自定義訊息!"),_T("提示"),MB_ICONINFORMATION);
return 0;
}
void CSubDlg::OnEnChangeEdit1()
{
// TODO: 如果該控制元件是 RICHEDIT 控制元件,則它將不會
// 傳送該通知,除非重寫 CDialog::OnInitDialog()
// 函式並呼叫 CRichEditCtrl().SetEventMask(),
// 同時將 ENM_CHANGE 標誌“或”運算到掩碼中。
// TODO: 在此新增控制元件通知處理程式程式碼
}