GUI03-你好,wxWidget!跨平台项目对比

使用 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 不具备的功能。

视频

GUI03-你好,wxWidget 跨平台项目对比

主要代码 (仅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);
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南郁

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值