自定义消息

创建自定义消息
下面以进度栏的创建为例
首先我们可以在CMainFrame类的头文件中,申请一个进度栏的对象:CProgessCtrl m_progess;
再者可以在Oncreate函数中创建进度栏,并将其放到状态栏上(状态指示器)代码如下:
        CRect rect;
	m_wndStatusBar.GetItemRect(5,&rect);//得到所在的距形区域的大小
	m_progess.Create(WS_CHILD|WS_VISIBLE|PBS_SMOOTH, rect , 
		&m_wndStatusBar,111);
	
	m_progess.SetPos(50);

但是这样并不能成功,根据单步调试的结果:如图:

起始rect 并没有值,但到下一个地方时,如下图:

其left 和right 坐标明显不正确
也就是说状态栏的初始化工作,也就是其相应窗格摆放位置的初始化还没有完全完成。
解决方案:我们可以在Oncreate函数执行完成之后然后再去获取状态栏上进度栏所表示
的距形区域。这就需要一个自定义消息。
我们在OnCreate函数中发送一个自定义的消息,然后在自定义的响应消息当中去获取状态
样上窗格的距形区域,国为我们消息要放在消息队列当中去,而Oncreate函数是对WM_CREATE
进行响应的函数,在这个函数报告完成之后,随后才从消息队列中取出自定义消息,并调用相应的消息函数
,这样就可以保证得到rect 的值了。
1)、定义消息:
#define UM_PROGRESS       WM_USER +2     //   用户定义的用UM  ,其中WM_USER 是一个宏,
//

The WM_USER constant is used by applications to help define private messages, usually of the form WM_USER+X, where X is an integer value.  

它是来解决我们定义的值应该是多大的,在Windows消息当中都是整形的,我们定义的消息可以与Windows消息产生冲突

也就是说用户定义的消息必须是大于WM_USER的。

2)、消息的声明:

在MainFrm.h 头文件中声明:

afx void OnProgress();

3)、消息的映射:

对消息来说用ON_MESSAGE   而对命令消息来说用ON_COMMAND

而对于这个而言,没有传参,用ON_MESSAGE_VOID(UM_PROGRESS,OnProgress)

4)、消息函数的实现:

void CMainFrame::OnProgress()
{
	CRect rect;
	m_wndStatusBar.GetItemRect(5,&rect);//得到所在的距形区域的大小
	m_progess.Create(WS_CHILD|WS_VISIBLE|PBS_SMOOTH, rect , 
		&m_wndStatusBar,111);
	
	m_progess.SetPos(50);
}


完成之后要选择怎样传递消息?

如果在Oncreate函数中用到SendMessage来传递,它的作用为:

Sends the specified message to this window. The SendMessage member function calls the window procedure directly and does not return until that window procedure has processed the message. This is in contrast to the PostMessage member function, which places the message into the window’s message queue and returns immediately.它可以来传递指定的消息,它可以直接调用Windows进程,直到Windows进程处理了这个消息,它返回。

也就是说我们以了送消息的时候,系统直接就调用消息响应函数,对我们自定义消息进行处理,当处理完成之后 ,才返回到return 0;

不符合要求。

而PostMessage是将消息放置到消息队列当中,然后按照消息摆放的须序,通过GetMessage一条条地将消息取出来 。它反消息放到消息队列

当中立即返回。

所以只需将Oncreate函数当中原来的代码注释掉,再加上PostMessage(UM_PROGRESS);即可。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值