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



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值