從主視窗向子視窗發送訊息,可以在子視窗中添加自訂的訊息,然後在主視窗中需要地方呼叫該訊息。
來電者法:
1.將子視窗添加為主視窗的成員變數;
2.主視窗呼叫該訊息,成員變數名.SendMessage(UM_PROGRESS);
子視窗添加自訂訊息步驟如下:
1、定義訊息。
在Windows中,所有的訊息都用一個特定的整數值來表示,為了避免自訂訊息與已存在的其他訊息發生衝突,應該利用Windows提供的一個常量:WM_USER,小於這個常量的是系統保留的。即使用者自訂的訊息至少為WM_USER+1,注意最後表示的訊息的數值不要超過0x7FFF。在開發Windows95應用程式時,Microsoft推薦使用者自訂訊息至少是WM_USER+100,因為很多新控制項也要使用WM_USER訊息。
#define UM_PROGRESS WM_USER + 100
將上句添加到子視窗類的標頭檔(.h)中。
2、在子視窗類標頭檔的AFX_MSG塊中聲明訊息處理函數:
class CMainFrame:public CFrameWnd{
protected:
//{{AFX_MSG(CMainFrame)
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
afx_msg void OnTimer(UINT nIDEvent);
afx_msg LRESULT OnProgress(WPARAM wParam, LPARAM lParam);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
3、在子視窗類的實現檔案(.cpp)中,使用ON_MESSAGE巨集指令將訊息映射到訊息處理表中。
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
//{{AFX_MSG_MAP(CMainFrame)
ON_WM_CREATE()
ON_WM_TIMER()
ON_MESSAGE(UM_PROGRESS, OnProgress)//注意這條語句的後面沒有分號
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
4、實現訊息處理函數。該函數使用WPRAM和LPARAM參數並返回LPESULT。
LRESULT CMainFrame::OnProgress(WPARAM wParam,LPARAM lParam){
CRect rect;
m_wndStatusBar.GetItemRect(2,&rect); //獲得窗格地區
//建立進度列,注意第三個參數為CWnd* pParentWnd,根據情況選擇父表單
m_progress.Create(WS_CHILD|WS_VISIBLE|PBS_VERTICAL,rect,this,123);
m_progress.SetPos(50);
return 0;
}
5、在適當的時候發送自訂訊息,進行訊息處理。需要注意使用SendMessage還是PostMessage進行處理:SendMessage是訊息處理完畢後再返回;而PostMessage則是把訊息放到訊息佇列後立即返回。
SendMessage(UM_PROGRESS);
PostMessage(UM_PROGRESS);
如果使用者需要整個系統唯一的訊息,可以調用SDK函數RegisterWindowMessage並使用ON_REGISTER_MESSAGE巨集指令取代ON_MESSAGE巨集指令,其餘步驟同上。
轉自:http://blog.sina.com.cn/s/blog_6bd15b910100nc00.html