none
自定义消息是如何触发的,机制是什么? RRS feed

  • 问题

  • VC++中标准的消息我倒是明白一些,但是自定义消息是如何触发的,机制是什么?如何触发的呀?

    2011年2月22日 12:14

答案

  • Hi Warden,

    以下过程详细讲解如何在VC++中加入自定义消息,和触发这个消息。

    假设我们的工程名为ownermessage

    1 首先在ownermessageDlg.h定义消息:例如

    define WM_MYMESSAGE (WM_USER+100)

     

    2 .H文件中,加入消息响应函数,如:

    afx_msg LRESULT OnMyMessage(WPARAM w,LPARAM l);

    该函数有规定的格式:

    afx_msg LRESULT Function_Name(WPARAM w,LPARAM l);

     

    3 ownermessageDlg.cpp加入消息响应宏

    在响应该消息的类中,在消息响应块中,

    BEGIN_MESSAGE_MAP(CownermessageDlg, CDialog)

                ON_WM_SYSCOMMAND()

                ON_WM_PAINT()

                ON_WM_QUERYDRAGICON()

                //}}AFX_MSG_MAP

    END_MESSAGE_MAP()

    加入以下语句:

    ON_MESSAGE(WM_MYMESSAGE, OnMyMessage)

    成为如下样式:

    BEGIN_MESSAGE_MAP(CownermessageDlg, CDialog)

                ON_WM_SYSCOMMAND()

                ON_WM_PAINT()

                ON_WM_QUERYDRAGICON()

                ON_MESSAGE(WM_MYMESSAGE,OnMyMessage)

                //}}AFX_MSG_MAP

    END_MESSAGE_MAP()

     

    4 .CPP文件中,编辑消息响应函数,如下:

    LRESULT CownermessageDlg::OnMyMessage(WPARAM wParam, LPARAM lParam) {

                MessageBox(_T("My Message!"));

                return 1;

    }

     

    5.在对话框中为新增的按钮添加单击响应,ownermessageDlg.cpp中的MESSAGE_MAP变成:

    BEGIN_MESSAGE_MAP(CownermessageDlg, CDialog)

                ON_WM_SYSCOMMAND()

                ON_WM_PAINT()

                ON_WM_QUERYDRAGICON()

                ON_MESSAGE(WM_MYMESSAGE,OnMyMessage)

                //}}AFX_MSG_MAP

                ON_BN_CLICKED(IDC_BUTTON1, &CownermessageDlg::OnBnClickedButton1)

    END_MESSAGE_MAP()

     

    void CownermessageDlg::OnBnClickedButton1()

    {

                // TODO: Add your control notification handler code here

                //::PostMessage(

                PostMessage(WM_MYMESSAGE, IDC_BUTTON1);

    }

     

    如果您的问题解决了,请把有用的回答标记为答案,

     

    谢谢,

    Lucy


    Lucy Liu [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    • 已标记为答案 Warden_ 2011年2月24日 7:45
    2011年2月24日 6:19
    版主

全部回复

  • while (GetMessage(&msg, NULL, 0, 0)) { } 触发的最重要的机制“消息循环” 处理消息靠这个 LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { } 发送一个消息 LRESULT SendMessage( HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam ); SendMessage(hWnd,WM_我的消息,0,0); 自定义消息 无非就是Msg不是系统常值 自已定的一个数 处理自定义消息要在WndProc 中搞定 switch (message) { case WM_我的消息(0x6000): 。。。。。。。 该死的不让换行还删除空格
    2011年2月22日 12:39
  • Hi Warden,

    以下过程详细讲解如何在VC++中加入自定义消息,和触发这个消息。

    假设我们的工程名为ownermessage

    1 首先在ownermessageDlg.h定义消息:例如

    define WM_MYMESSAGE (WM_USER+100)

     

    2 .H文件中,加入消息响应函数,如:

    afx_msg LRESULT OnMyMessage(WPARAM w,LPARAM l);

    该函数有规定的格式:

    afx_msg LRESULT Function_Name(WPARAM w,LPARAM l);

     

    3 ownermessageDlg.cpp加入消息响应宏

    在响应该消息的类中,在消息响应块中,

    BEGIN_MESSAGE_MAP(CownermessageDlg, CDialog)

                ON_WM_SYSCOMMAND()

                ON_WM_PAINT()

                ON_WM_QUERYDRAGICON()

                //}}AFX_MSG_MAP

    END_MESSAGE_MAP()

    加入以下语句:

    ON_MESSAGE(WM_MYMESSAGE, OnMyMessage)

    成为如下样式:

    BEGIN_MESSAGE_MAP(CownermessageDlg, CDialog)

                ON_WM_SYSCOMMAND()

                ON_WM_PAINT()

                ON_WM_QUERYDRAGICON()

                ON_MESSAGE(WM_MYMESSAGE,OnMyMessage)

                //}}AFX_MSG_MAP

    END_MESSAGE_MAP()

     

    4 .CPP文件中,编辑消息响应函数,如下:

    LRESULT CownermessageDlg::OnMyMessage(WPARAM wParam, LPARAM lParam) {

                MessageBox(_T("My Message!"));

                return 1;

    }

     

    5.在对话框中为新增的按钮添加单击响应,ownermessageDlg.cpp中的MESSAGE_MAP变成:

    BEGIN_MESSAGE_MAP(CownermessageDlg, CDialog)

                ON_WM_SYSCOMMAND()

                ON_WM_PAINT()

                ON_WM_QUERYDRAGICON()

                ON_MESSAGE(WM_MYMESSAGE,OnMyMessage)

                //}}AFX_MSG_MAP

                ON_BN_CLICKED(IDC_BUTTON1, &CownermessageDlg::OnBnClickedButton1)

    END_MESSAGE_MAP()

     

    void CownermessageDlg::OnBnClickedButton1()

    {

                // TODO: Add your control notification handler code here

                //::PostMessage(

                PostMessage(WM_MYMESSAGE, IDC_BUTTON1);

    }

     

    如果您的问题解决了,请把有用的回答标记为答案,

     

    谢谢,

    Lucy


    Lucy Liu [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    • 已标记为答案 Warden_ 2011年2月24日 7:45
    2011年2月24日 6:19
    版主
  • IC , Thank You very much !

    2011年2月24日 7:45