加载中...
你好!wxWidgets
第1节:在Windows桌面打个叉
第2节:在窗口上跟踪输出鼠标坐标—Win32版
第3节:你好!wxWidgets
第4节:深入分析基于框架窗口的应用
第5节:玩转主菜单
第6节:简简单单,状态栏
课文封面

使用 wxWidgets 库在 Linux 和 Windows 下实现相同的功能:在窗口上跟踪输出鼠标坐标位置。一个不错的原生与跨平台实现的对比例程,让我们有机会对二者的实现做一个对比。

课前问题

本课是上一节课《在窗口上跟踪输出鼠标坐标-Win32》的跨平台版,在学习之前,请首先检测上一节课的学习要点:

  1. Win32版本中,消息通过什么回调函数派发?
  2. 为区分不同消息,使用了 C/C++ 什么流程结构?
  3. 鼠标位置 xPos、yPos 为什么是全局变量?
  4. InvalidateRect() 函数的作用是什么?其最后一个入参的作用又是什么?

如能正确回答上述四点,请带着以下新问题,继续学习:

  1. “事件宏”以及它的作用是什么?
  2. 鼠标移动事件和绘图事件对应的事件类各自是什么?
  3. wxWidgets 通过哪个类的哪个成员函数,实现通知窗口指定区域失效?
  4. 指定区域失效时,负责指明是否自动擦除背景的入参,在哪个平台下有效,哪个平台下无效?
  5. 对比原生的 Win32 和 跨平台的 wxWidgets库,它们各自获取鼠标事件中的鼠标坐标的方法,你比较喜欢一个?为什么?
  6. 说出一个 wxString 具备而C++标准库 std::string 不具备的功能。

视频

主要代码(仅Windows平台):

  • 仅提供 HelloWxWidgetsMain.h/.cpp,未提供向导自动生成且无需修改的源代码;
  • 保持功能相同的情况下,以下源代码还做了更多简化。

HelloWxWidgetsMain.h

/*************************************************************** * Name: HelloWxWidgetsMain.h * Purpose: Defines Application Frame * Author: d2school (nanyu@d2school.com) * Created: 2023-08-05 * Copyright: d2school (www.d2school) * License: **************************************************************/ #ifndef HELLOWXWIDGETSMAIN_H #define HELLOWXWIDGETSMAIN_H #ifndef WX_PRECOMP #include <wx/wx.h> #endif #include "HelloWxWidgetsApp.h" class HelloWxWidgetsFrame: public wxFrame { public: HelloWxWidgetsFrame(wxFrame *frame, const wxString& title); ~HelloWxWidgetsFrame(); private: enum { idMenuQuit = 1000, idMenuAbout }; void OnClose(wxCloseEvent& event); void OnQuit(wxCommandEvent& event); void OnMotion(wxMouseEvent& event); // 鼠标移动事件 void OnPaint(wxPaintEvent& event); // 绘图事件 DECLARE_EVENT_TABLE() private: int xPos = 0, yPos = 0; // 鼠标位置 }; #endif // HELLOWXWIDGETSMAIN_H

HelloWxWidgetsMain.cpp

#ifdef WX_PRECOMP #include "wx_pch.h" #endif #ifdef __BORLANDC__ #pragma hdrstop #endif //__BORLANDC__ #include "HelloWxWidgetsMain.h" BEGIN_EVENT_TABLE(HelloWxWidgetsFrame, wxFrame) EVT_CLOSE(HelloWxWidgetsFrame::OnClose) EVT_MENU(idMenuQuit, HelloWxWidgetsFrame::OnQuit) EVT_MOTION(HelloWxWidgetsFrame::OnMotion) EVT_PAINT(HelloWxWidgetsFrame::OnPaint) END_EVENT_TABLE() HelloWxWidgetsFrame::HelloWxWidgetsFrame(wxFrame *frame, const wxString& title) : wxFrame(frame, -1, title) { } HelloWxWidgetsFrame::~HelloWxWidgetsFrame() { } void HelloWxWidgetsFrame::OnClose(wxCloseEvent &event) { Destroy(); } void HelloWxWidgetsFrame::OnQuit(wxCommandEvent &event) { Destroy(); } void HelloWxWidgetsFrame::OnMotion(wxMouseEvent& event) { this->xPos = event.GetPosition().x; this->yPos = event.GetPosition().y; this->Refresh(); } void HelloWxWidgetsFrame::OnPaint(wxPaintEvent& event) { wxPaintDC dc (this); wxString txt; txt << wxT("[") << xPos << wxT(" | ") << yPos << wxT("]-来自d2school (Windows)"); dc.DrawText(txt, xPos + 10, yPos + 10); }