自定义消息

创建自定义消息
下面以进度栏的创建为例
首先我们可以在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);即可。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Qt中,您可以通过自定义消息响应来处理特定的消息事件。以下是一些实现自定义消息响应的步骤: 1. 定义自定义消息类型:在您的代码中,使用QEvent和QEvent::Type来定义一个新的消息类型。例如: ```cpp class MyCustomEvent : public QEvent { public: static const QEvent::Type eventType = static_cast<QEvent::Type>(QEvent::registerEventType()); MyCustomEvent() : QEvent(eventType) { } }; ``` 2. 创建消息接收者:创建一个继承自QObject的类,为接收特定消息的对象。例如: ```cpp class MessageReceiver : public QObject { Q_OBJECT public: explicit MessageReceiver(QObject *parent = nullptr) : QObject(parent) { } protected: bool event(QEvent *event) override { if (event->type() == MyCustomEvent::eventType) { // 处理自定义消息 handleCustomMessage(); return true; } return QObject::event(event); } private: void handleCustomMessage() { // 处理自定义消息的逻辑 qDebug() << "Received custom message!"; } }; ``` 3. 发送自定义消息:在需要发送自定义消息的地方,创建并发送自定义事件。例如: ```cpp void sendMessage() { MessageReceiver receiver; QCoreApplication::postEvent(&receiver, new MyCustomEvent()); } ``` 这样,当调用`sendMessage`函数时,将会触发`MessageReceiver`对象中的`event`函数,并且通过判断事件类型来处理自定义消息。 请注意,为了确保自定义消息能够被正确地分发和处理,您可能需要确保`MessageReceiver`对象的生命周期和消息发送的方式适合您的应用程序需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值