wxWidgets第三课 MSWWindowProc处理窗口消息

简介:

说明

    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,如需转载请自行联系原作者



相关文章
|
3天前
|
编解码 C++
Qt第一课 第一个ui界面
Qt第一课 第一个ui界面
10 2
|
3天前
|
前端开发 iOS开发 MacOS
vscode自动跟随Mac或window系统系统切换主题色-白天用亮色主题、晚上用暗黑主题
vscode自动跟随Mac或window系统系统切换主题色-白天用亮色主题、晚上用暗黑主题
135 0
|
6月前
|
C++
《QT从基础到进阶·二十五》界面假死处理
《QT从基础到进阶·二十五》界面假死处理
62 0
《QT从基础到进阶·二十五》界面假死处理
|
8月前
|
Linux C# iOS开发
C#之十八 GUI用户界面编程
C#之十八 GUI用户界面编程
152 0
|
9月前
|
缓存 API C++
客户端在线更新-QT
最近在做客户端的时候,需要将客户端在线更新,所以整理一下在线更新的思路,希望对你有帮助。 首先在线更新是利用了文件解压之后会自动替换的原理,因此具体需要做的就是从服务器上下载到在线更新的压缩包,之后在对下载到的压缩包进行解压缩替换现有程序内的文件即可。
102 0
|
JavaScript 前端开发 Linux
客户端开发(Electron)认识窗口
客户端开发(Electron)认识窗口
459 0
客户端开发(Electron)认识窗口
|
JavaScript 前端开发 Linux
客户端开发(Electron)认识窗口2
客户端开发(Electron)认识窗口2
271 0
客户端开发(Electron)认识窗口2
|
JSON 数据格式
APICloud 入门教程窗口篇
什么是窗口,窗口可以理解为一屏幕内容的一个基本载体,里面可以放导航,图片,视频,文字等组成一屏幕内容。
279 0
APICloud 入门教程窗口篇
|
图形学 Windows
Unity 之 实用技巧更换编辑器主题
你的编辑器还在用灰色主题吗?还在羡慕别人的深色主题吗?教你一步修改Unity编辑器主题,赶快来看看吧 ~
1071 0
Unity 之 实用技巧更换编辑器主题