wxWidgets第三课MSWWindowProc处理窗口消息-创新互联

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

创新互联是一家集做网站、网站设计、网站页面设计、网站优化SEO优化为一体的专业网站建设公司,已为成都等多地近百家企业提供网站建设服务。追求良好的浏览体验,以探求精品塑造与理念升华,设计最适合用户的网站页面。 合作只是第一步,服务才是根本,我们始终坚持讲诚信,负责任的原则,为您进行细心、贴心、认真的服务,与众多客户在蓬勃发展的市场环境中,互促共生。

使用
    在前面的文章中描述到,对于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();
}

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

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


网站名称:wxWidgets第三课MSWWindowProc处理窗口消息-创新互联
网页路径:http://azwzsj.com/article/dpoepe.html