课前问题
本课是上一节课《在窗口上跟踪输出鼠标坐标-Win32》的跨平台版,在学习之前,请首先检测上一节课的学习要点:
- Win32版本中,消息通过什么回调函数派发?
- 为区分不同消息,使用了 C/C++ 什么流程结构?
- 鼠标位置 xPos、yPos 为什么是全局变量?
- InvalidateRect() 函数的作用是什么?其最后一个入参的作用又是什么?
如能正确回答上述四点,请带着以下新问题,继续学习:
- “事件宏”以及它的作用是什么?
- 鼠标移动事件和绘图事件对应的事件类各自是什么?
- wxWidgets 通过哪个类的哪个成员函数,实现通知窗口指定区域失效?
- 指定区域失效时,负责指明是否自动擦除背景的入参,在哪个平台下有效,哪个平台下无效?
- 对比原生的 Win32 和 跨平台的 wxWidgets库,它们各自获取鼠标事件中的鼠标坐标的方法,你比较喜欢一个?为什么?
- 说出一个 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);
}