说明

wxwidgets为不少的非常重要的windows事件定义一个事件宏(例如EVT_PAINT),但是例如WM_NCHITTEST等消息没有定义宏。为了处理某些特殊的窗口消息,需要在wxWindow的派生类中重写(也叫覆盖override)基类的虚函数MSWWindowProc(),通过判断nMsg的参数值看看是否需要进行处理,否则看看是否需要调用基类的虚函数进行处理

使用

在前面的文章中描述到,对于WM_NCLBUTTONDOWN,WM_NCMOUSEMOVE这些消息没有定义相关的EVT事件,所以如果需要对这些消息进行处理,就必须覆盖掉基类的消息处理,当然在处理完成相应的事件,之后也可以调用父类的函数,将消息传递下去

例子

class CDownLinkDataPlayBack:public wxPanel

{

protected:

virtual WXLRESULT MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam);

}

WXLRESULT CDownLinkDataPlayBack::MSWWindowProc( WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam )

{

if ( nMsg == WM_NCLBUTTONDOWN )

{

wxPoint pos = GetPosition();

m_orignalRectHeight = pos.y;

wxSize size = GetSize();

wxPoint pt = ClientToScreen(GetPosition());

m_ncMouseDownX = pt.x;

m_ncMouseDownY = pt.y;

m_curWindowStartX = pt.x - size.x;

m_curWindowStartY = pt.y - size.y;

}

if (nMsg == WM_NCMOUSEMOVE)

{

wxPoint pt = ClientToScreen(GetPosition());

m_ncMouseMoveX = pt.x;

m_ncMouseMoveY = pt.y;

wxScreenDC dc;

dc.SetPen(wxPen(*wxBLACK, 2, wxSOLID));

//dc.SetBrush(*wxTRANSPARENT_BRUSH);

dc.SetBrush(wxBrush(*wxBLACK));

wxSize size(30, m_orignalRectHeight);

wxPoint p(m_ncMouseDownX, m_ncMouseDownY);

//wxRect rect(wxPoint(m_curWindowStartX, m_curWindowStartY), size);

wxRect rect(wxPoint(0, 0), wxSize(300, 1400));

dc.DrawRectangle(rect);

WXHWND hwd = GetHWND();

RECT rect2;

wxRect rect3 = GetClientRect();

rect2.left = rect3.GetLeft();

rect2.top  = rect3.GetTop();

rect2.right = rect3.GetRight();

rect2.bottom = rect3.GetBottom();

ValidateRect(hwd, &rect2);

}

return wxPanel::MSWWindowProc(nMsg, wParam, lParam);

}

一些基本的事件宏定义说明

为一个窗口定义一系列的特定情况的事件列表,例如定时器,渲染,空闲处理等等

例子

#include "wx/event.h"

类添加声明事件列表宏

private:

DECLARE_EVENT_TABLE()

类外添加事件列表定义宏

BEGIN_EVENT_TABLE(CFlightInstrumentPanel, wxPanel)

EVT_MOTION(CFlightInstrumentPanel::OnMotion)

EVT_PAINT(CFlightInstrumentPanel::OnPaint)

EVT_TIMER(TIMER_ID, CFlightInstrumentPanel::OnTimer)

EVT_IDLE(CFlightInstrumentPanel::OnIdle)

END_EVENT_TABLE()

说明:CFlightInstrumentPanel继承wxPanel,至于添加的事件函数的具体内容,稍后进行描述

wxIdleEvent 空闲事件处理说明

当没有消息需要处理的情况下,可以通过定义OnIdle事件处理消息函数,来达到充分利用CPU的目的。当用户鼠标按下,执行大量的渲染,可能会出现屏幕的卡顿,如果让OnIdle函数处理,就可以避免出现这个问题

例子

#include "wx/event.h"

void OnIdle(wxIdleEvent& event);

EVT_IDLE(CFlightInstrumentPanel::OnIdle)

void CFlightInstrumentPanel::OnIdle( wxIdleEvent& event )

{

static int x = 0;

if (x<1000)

{

wxClientDC dc(this);

wxPen pen(*wxRED,1);

dc.SetPen(pen);

dc.DrawRectangle(x, 0, 200, 300);

dc.SetPen(wxNullPen);

x=x+100;

}

event.Skip();

}

缺点:不是一个定时器,而且只是在消息循环体中没有任何消息的情况下,执行该事件

本文转自fengyuzaitu 51CTO博客,原文链接:http://blog.51cto.com/fengyuzaitu/1954786,如需转载请自行联系原作者

wxWidgets第三课 MSWWindowProc处理窗口消息相关推荐

  1. 第三课 大数据技术之Fink1.13的实战学习-时间和窗口

    第三课 大数据技术之Fink1.13的实战学习-时间和窗口 文章目录 第三课 大数据技术之Fink1.13的实战学习-时间和窗口 第一节 时间定义 1.1 Flink中的时间语义 1.2 两种时间语义 ...

  2. pyqt5+qt desiger实例教程(1)创建含有三个按钮的窗口,点击按钮2输出消息、按钮3可退出

    pyqt5+qt desiger实例教程(1)创建含有三个按钮的窗口,点击按钮三可退出 目标:设计一个含有三个按钮的窗口,点击按钮2弹出消息,点击按钮3退出 如果是使用的anacoda那么自带qtde ...

  3. VC6系统托盘类|崩溃自动重建图标|HOOK窗口消息|气泡效果更新SDK

    解决制作托盘气泡提示中遇到的'NIF_INFO' : undeclared identifier VC6下实现托盘气泡提示的关键是要更新SDK,实际上应该就是要更新SHELLAPI.h,SHELL32 ...

  4. 三大运营商借5G消息围攻微信,就问张小龙怕不怕

    雷刚 晓查 发自 凹非寺  量子位 报道 | 公众号 QbitAI 谁会把11亿人都在用的微信视为仇敌? 移动.联通,中国电信,三大运营商,有一个算一个. 2011年微信崛起以来,运营商的新业务&qu ...

  5. 窗口消息——Windows核心编程学习手札之二十六

    窗口消息 --Windows核心编程学习手札之二十六 Windows允许一个进程至多建立10000个不同类型的用户对象(user object):图符.光标.窗口类.菜单.加速键表等,当一个线程调用一 ...

  6. 0.0 目录-深度学习第三课《结构化机器学习项目》-Stanford吴恩达教授

    文章目录 第五课 第四课 第三课 第二课 第一课 第五课 <序列模型> 笔记列表 Week 1 循环序列模型 Week 1 传送门 -> 1.1 为什么选择序列模型 1.2 数学符号 ...

  7. 【C语言探索之旅】第三部分第三课:SDL开发游戏之显示图像

    内容简介 1.第三部分第三课: SDL开发游戏之显示图像 2.第三部分第四课预告: SDL开发游戏之事件处理 第三部分第三课:SDL开发游戏之显示图像 上一课中,我们学习了如何加载SDL库(SDL_I ...

  8. [vb]一些窗口消息的详解

    代码: Public Const WM_NULL = &H0 '空消息 Public Const WM_NCCREATE = &H81 '当窗口第一次被创建时,此消息在WM_CREAT ...

  9. 《迅雷链精品课》第三课:区块链主流框架分析

    上一节课我们学习了区块链的技术架构,系统地分析了区块链平台的6个层次:数据层.网络层.共识层.合约层.应用层.接口层.这节课我们将结合实际看看现在主流区块链项目的技术架构:思考我们在设计具体的业务架构 ...

最新文章

  1. SqlTransaction——事务详解
  2. /root/.bashrc与/etc/profile的异同
  3. OSChina 周四乱弹 ——程序员怎么撩外国妹子攻略
  4. 投资银行对Java进行的二十大核心面试问答
  5. 菱形继承和虚继承、对象模型和虚基表
  6. process_进程池
  7. POJ 1655:Balancing Act
  8. 【恋上数据结构】归并排序 + LeetCode真题
  9. Java从零开始(4)——入门项目
  10. python突破反爬虫_【Python3爬虫】突破反爬之应对前端反调试手段
  11. oracle 分组统计行数,求助分组之后进行统计行数
  12. Linux C 信号量
  13. 聚合物电容作用原理与基础
  14. WEB应用log4j1.x升级到log4j2.17.1
  15. Mac下使用Eclipse读java源码
  16. 3D游戏引擎入门课程——场景管理
  17. 三跨考研浙江大学计算机,“三跨”考研的焦虑 你能承受多少
  18. Android自定义的下拉列表框控件
  19. 使用Unity进行Android游戏开发
  20. Python [Leetcode 345]Reverse Vowels of a String

热门文章

  1. 运用Java对微信公众平台二次开发技术——开发者模式接入
  2. GCD 和 NSOperationQueue 的差别
  3. (转)Java初始化顺序
  4. MySQL之增删改查(以查为主)
  5. oracle+连接数sessionn,Oracle进程连接数过多时的Statspack分析报告
  6. redis 了 什么地方用到_细节拉满!美团首推“百万级”Redis进阶笔记究竟有什么魅力...
  7. stata 倾向得分匹配(二)偏差校正匹配估计量
  8. 0基础可以学Web前端吗?如何快速掌握前端开发技能?
  9. 12 个实用的前端开发技巧总结
  10. wdatepicker不展示秒_华为电源键只能开关机?其实还隐藏了这5个作用,一般人不知道...