1. 程式人生 > >VS2008下如何為mfc新增自定義訊息

VS2008下如何為mfc新增自定義訊息

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:  在此新增控制元件通知處理程式程式碼


}