从主窗口向子窗口发送消息,可以在子窗口中添加自定义的消息,然后在主窗口中需要地方呼叫该消息。
呼叫方法:
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