2014年1月7日火曜日

[MFC] 對話框傳訊息 SendMessage

雖然MFC已經很古老了...
不過用於簡單的程式倒是挺方便的。 
在兩個對話框中傳遞訊息的方式: SendMessage、PostMessage。

SendMessage: 在訊息傳送之後,等待接收反應才返回。
PostMessage: 在訊息傳送之後,不等待即立刻返回。


假設有兩個對話框。一個叫 Send_Dlg,一個叫 Receive_Dlg。

Send_Dlg: Send_Dlg.h 和 Send_Dlg.cpp

Receive_Dlg: Receive_Dlg.h 和 Receive_Dlg.cpp

Send_Dlg.h
 // 定義 訊息編號
#define WM_MYMESSAGE (WM_USER + 1)

class Send_Dlg : public CDialogEx
{
public:
    Send_Dlg(CWnd* pParent = NULL); 

    // 傳遞訊息的 function 
    afx_msg void sender();
}

Send_Dlg.cpp
#include "Send_Dlg.h"

Send_Dlg::Send_Dlg(CWnd* pParent /*=NULL*/) : CDialogEx(Send_Dlg::IDD)
{
    m_Icon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void Send_Dlg::sender()
{
    // 尋找對話框名稱為 Receive_Dlg 的對話框
    CWnd* pWnd = CWnd::FindWindowW(NULL, L"Receive_Dlg");


   // 傳送訊息
    pWnd->SendMessageW(WM_MYMESSAGE);
}

Receive_Dlg.h
#include "Send_Dlg.h"

class Receive_Dlg : public CDialogEx
{
    Receive_Dlg(CWnd* pParent = NULL);  

    // 接收訊息用的 Function
    afx_msg LRESULT receiver(WPARAM wParam, LPARAM lParam);
}

Receive_Dlg.cpp
#include "Receive_Dlg.h"

Receive_Dlg::Receive_Dlg(CWnd* pParent /*=NULL*/) : CDialogEx(Receive_Dlg::IDD)
{
    m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}


 // 在 MESSAGE MAP 中加入關聯
BEGIN_MESSAGE_MAP(Receive_Dlg, CDialogEx)
    // 以 ON_MESSAGE 將 訊息ID 和 receiver 串起來
    ON_MESSAGE(WM_MYMESSAGE, &Receive_Dlg::receiver) 
END_MESSAGE_MAP()

LRESULT Receive_Dlg::receiver(WPARAM wParam, LPARAM lParam)
{
    // 接受到訊息後的工作
    // do something

    AfxMessageBox("接收到訊息");
    return LRESULT();
}



參考:
MFC的SendMessage函数详解
http://blog.csdn.net/nupt123456789/article/details/7370463

MESSAGE_HANDLER [メッセージの送受信]
http://bcb.client.jp/tips/022_receive_postmessage.html


0 件のコメント:

コメントを投稿