1. 程式人生 > >MFC應用程式程式設計

MFC應用程式程式設計

九MFC的訊息分類

MFC的訊息分類按照處理方式來分。主要分為4類:

1 視窗訊息

例如WM_CREATE、WM_PAINT、滑鼠、鍵盤等訊息,這些訊息的處理方式是直接呼叫訊息處理函式.

這類訊息使用的巨集:

    ON_MESSAGE(  )

    ON_WM_XXXXX( ): ON_WM_CREATE()

訊息處理時,採用上面的處理方式.

前面的WM_CREATE訊息就不用寫成ON_MESSAGE( WM_CREATE, OnCreate ),而直接寫成ON_WM_CREATE即可。

函式的定義和宣告也要相應地修改為:

afx_msg LRESULT OnCreate( WPARAM wParam, LPARAM lParam );

afx_msg int OnCreate();

LRESULT CMsgFrame::OnCreate( WPARAM wParam,

LPARAM lParam )

{

AfxMessageBox("OnCreate");

return 0;

}

int CMsgFrame::OnCreate()

{

AfxMessageBox("OnCreate");

return 0;

}

2 命令訊息 WM_COMMAND

選單、工具欄、按鈕等點選時的命令. 訊息首先發送到主視窗,由主視窗逐層向子視窗派發。

這類的訊息使用的巨集:

     ON_COMMAND( )

     ON_COMMAND_RANGE( )

訊息處理時,在OnWndMsg中呼叫OnCommand處理函式進行訊息處理.

3 通知訊息 WM_NOTIFY

子視窗對父視窗的通知訊息。

  控制元件訊息巨集,例如: EDIT控制元件 ON_EN_CHANGE、ON_NOTIFY/ON_NOTIFY_RANGE訊息處理時,在OnWndMsg中呼叫OnNotify(OnCommand)處理函式進行訊息處理。

4 自注冊訊息

使用者自注冊訊息的處理。

使用者需呼叫RegisterWindowMessage函式註冊訊息,然後在訊息對映中使用.

  UINT RegisterWindowMessage(

     LPCTSTR lpString //訊息名字串

    );

返回註冊成功的訊息ID(0xC000-0xFFFF)

訊息對映巨集: ON_REGISTERED_MESSAGE

訊息處理時, 與視窗訊息處理類似,但是在查詢訊息處理函式和執行訊息處理函式時不同.

自注冊訊息使用舉例:

// RegisterMsg.cpp : Defines the entry point for the application.

//

#include "stdafx.h"

//註冊訊息ID

UINT g_nRegMsg = RegisterWindowMessage( "MYREGMSG" );

class CRegsiterFrame : public CFrameWnd

{

        DECLARE_MESSAGE_MAP( )

public:

        afx_msg int OnCreate( LPCREATESTRUCT lpCreateStruct );

        afx_msg void OnTest( );

        //訊息處理函式

        afx_msg LRESULT OnRegMsg( WPARAM wParam,LPARAM lParam );

};

BEGIN_MESSAGE_MAP( CRegsiterFrame, CFrameWnd )

        ON_WM_CREATE( )

        ON_COMMAND( 1001, OnTest )

        //訊息巨集對映

        ON_REGISTERED_MESSAGE( g_nRegMsg, OnRegMsg )

END_MESSAGE_MAP( )

int CRegsiterFrame::OnCreate( LPCREATESTRUCT lpCreateStruct )

{        //父類的OnCreate處理

        /*if(!CFrameWnd::OnCreate( lpCreateStruct ) )

        {

                return 0;

        }*/

        //建立按鈕

        CreateWindow( "BUTTON", "Test",

                WS_CHILD|WS_VISIBLE,

                50, 50, 200, 30, m_hWnd, (HMENU)1001,

                AfxGetApp()->m_hInstance, NULL );

        return 1;

}

void CRegsiterFrame::OnTest( )

{        //傳送訊息

        SendMessage( g_nRegMsg );

}

LRESULT CRegsiterFrame::OnRegMsg( WPARAM wParam,LPARAM lParam )

{

        AfxMessageBox( "OnRegMsg" );

return 0;

}

class CRegisterApp : public CWinApp

{

public:

        virtual BOOL InitInstance( );

};

CRegisterApp theApp;

BOOL CRegisterApp::InitInstance( )

{

        CRegsiterFrame * pWnd = new CRegsiterFrame( );

        pWnd->Create( NULL, "Register Msg" );

        m_pMainWnd = pWnd;

        m_pMainWnd->ShowWindow( SW_SHOW );

        m_pMainWnd->UpdateWindow( );

        return TRUE;

}