当前位置: 首页 > news >正文

第11章 GUI Page403~405 步骤三 设置滚动范围

运行效果:

源代码:

/**************************************************************** Name:      wxMyPainterApp.h* Purpose:   Defines Application Class* Author:    yanzhenxi (3065598272@qq.com)* Created:   2023-12-21* Copyright: yanzhenxi ()* License:**************************************************************/#ifndef WXMYPAINTERAPP_H
#define WXMYPAINTERAPP_H#include <wx/app.h>class wxMyPainterApp : public wxApp
{public:virtual bool OnInit();
};#endif // WXMYPAINTERAPP_H
/**************************************************************** Name:      wxMyPainterApp.cpp* Purpose:   Code for Application Class* Author:    yanzhenxi (3065598272@qq.com)* Created:   2023-12-21* Copyright: yanzhenxi ()* License:**************************************************************/#include "wxMyPainterApp.h"//(*AppHeaders
#include "wxMyPainterMain.h"
#include <wx/image.h>
//*)IMPLEMENT_APP(wxMyPainterApp);bool wxMyPainterApp::OnInit()
{//(*AppInitializebool wxsOK = true;wxInitAllImageHandlers();if ( wxsOK ){wxMyPainterFrame* Frame = new wxMyPainterFrame(0);Frame->Show();SetTopWindow(Frame);}//*)return wxsOK;}
/**************************************************************** Name:      wxMyPainterMain.h* Purpose:   Defines Application Frame* Author:    yanzhenxi (3065598272@qq.com)* Created:   2023-12-21* Copyright: yanzhenxi ()* License:**************************************************************/#ifndef WXMYPAINTERMAIN_H
#define WXMYPAINTERMAIN_H//(*Headers(wxMyPainterFrame)
#include <wx/scrolwin.h>
#include <wx/sizer.h>
#include <wx/menu.h>
#include <wx/listbox.h>
#include <wx/frame.h>
#include <wx/statusbr.h>
//*)class wxMyPainterFrame: public wxFrame
{public:wxMyPainterFrame(wxWindow* parent,wxWindowID id = -1);virtual ~wxMyPainterFrame();private://(*Handlers(wxMyPainterFrame)void OnQuit(wxCommandEvent& event);void OnAbout(wxCommandEvent& event);void OnScrolledWindow1LeftDown(wxMouseEvent& event);void OnScrolledWindow1MouseMove(wxMouseEvent& event);void OnScrolledWindow1LeftUp(wxMouseEvent& event);void OnScrolledWindow1Paint(wxPaintEvent& event);//*)//(*Identifiers(wxMyPainterFrame)static const long ID_LISTBOX1;static const long ID_SCROLLEDWINDOW1;static const long idMenuQuit;static const long idMenuAbout;static const long ID_STATUSBAR1;//*)//(*Declarations(wxMyPainterFrame)wxScrolledWindow* ScrolledWindow1;wxStatusBar* StatusBar1;wxListBox* ListBox1;//*)private:bool _drawing; //绘图状态:真则表示正在绘图wxPoint _startPositionLogical, _currentPositionLogical; //正在画的图形的开始位置和最新位置DECLARE_EVENT_TABLE()
};#endif // WXMYPAINTERMAIN_H
/**************************************************************** Name:      wxMyPainterMain.cpp* Purpose:   Code for Application Frame* Author:    yanzhenxi (3065598272@qq.com)* Created:   2023-12-21* Copyright: yanzhenxi ()* License:**************************************************************/#include "wxMyPainterMain.h"
#include <wx/msgdlg.h>
#include <wx/dcclient.h>//(*InternalHeaders(wxMyPainterFrame)
#include <wx/settings.h>
#include <wx/intl.h>
#include <wx/string.h>
//*)//helper functions
enum wxbuildinfoformat {short_f, long_f };wxString wxbuildinfo(wxbuildinfoformat format)
{wxString wxbuild(wxVERSION_STRING);if (format == long_f ){
#if defined(__WXMSW__)wxbuild << _T("-Windows");
#elif defined(__UNIX__)wxbuild << _T("-Linux");
#endif#if wxUSE_UNICODEwxbuild << _T("-Unicode build");
#elsewxbuild << _T("-ANSI build");
#endif // wxUSE_UNICODE}return wxbuild;
}//(*IdInit(wxMyPainterFrame)
const long wxMyPainterFrame::ID_LISTBOX1 = wxNewId();
const long wxMyPainterFrame::ID_SCROLLEDWINDOW1 = wxNewId();
const long wxMyPainterFrame::idMenuQuit = wxNewId();
const long wxMyPainterFrame::idMenuAbout = wxNewId();
const long wxMyPainterFrame::ID_STATUSBAR1 = wxNewId();
//*)BEGIN_EVENT_TABLE(wxMyPainterFrame,wxFrame)//(*EventTable(wxMyPainterFrame)//*)
END_EVENT_TABLE()wxMyPainterFrame::wxMyPainterFrame(wxWindow* parent,wxWindowID id): _drawing(false), _startPositionLogical(0, 0), _currentPositionLogical(0, 0)
{//(*Initialize(wxMyPainterFrame)wxMenuItem* MenuItem2;wxMenuItem* MenuItem1;wxMenu* Menu1;wxBoxSizer* BoxSizer1;wxMenuBar* MenuBar1;wxMenu* Menu2;Create(parent, id, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxDEFAULT_FRAME_STYLE, _T("id"));SetClientSize(wxSize(208,94));BoxSizer1 = new wxBoxSizer(wxHORIZONTAL);ListBox1 = new wxListBox(this, ID_LISTBOX1, wxDefaultPosition, wxSize(168,68), 0, 0, 0, wxDefaultValidator, _T("ID_LISTBOX1"));BoxSizer1->Add(ListBox1, 0, wxALL|wxEXPAND, 5);ScrolledWindow1 = new wxScrolledWindow(this, ID_SCROLLEDWINDOW1, wxDefaultPosition, wxDefaultSize, wxVSCROLL|wxHSCROLL, _T("ID_SCROLLEDWINDOW1"));ScrolledWindow1->SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW));BoxSizer1->Add(ScrolledWindow1, 1, wxALL|wxEXPAND, 5);SetSizer(BoxSizer1);MenuBar1 = new wxMenuBar();Menu1 = new wxMenu();MenuItem1 = new wxMenuItem(Menu1, idMenuQuit, _("Quit\tAlt-F4"), _("Quit the application"), wxITEM_NORMAL);Menu1->Append(MenuItem1);MenuBar1->Append(Menu1, _("&File"));Menu2 = new wxMenu();MenuItem2 = new wxMenuItem(Menu2, idMenuAbout, _("About\tF1"), _("Show info about this application"), wxITEM_NORMAL);Menu2->Append(MenuItem2);MenuBar1->Append(Menu2, _("Help"));SetMenuBar(MenuBar1);StatusBar1 = new wxStatusBar(this, ID_STATUSBAR1, 0, _T("ID_STATUSBAR1"));int __wxStatusBarWidths_1[1] = { -1 };int __wxStatusBarStyles_1[1] = { wxSB_NORMAL };StatusBar1->SetFieldsCount(1,__wxStatusBarWidths_1);StatusBar1->SetStatusStyles(1,__wxStatusBarStyles_1);SetStatusBar(StatusBar1);SetSizer(BoxSizer1);Layout();ScrolledWindow1->Connect(wxEVT_PAINT,(wxObjectEventFunction)&wxMyPainterFrame::OnScrolledWindow1Paint,0,this);ScrolledWindow1->Connect(wxEVT_LEFT_DOWN,(wxObjectEventFunction)&wxMyPainterFrame::OnScrolledWindow1LeftDown,0,this);ScrolledWindow1->Connect(wxEVT_LEFT_UP,(wxObjectEventFunction)&wxMyPainterFrame::OnScrolledWindow1LeftUp,0,this);ScrolledWindow1->Connect(wxEVT_MOTION,(wxObjectEventFunction)&wxMyPainterFrame::OnScrolledWindow1MouseMove,0,this);Connect(idMenuQuit,wxEVT_COMMAND_MENU_SELECTED,(wxObjectEventFunction)&wxMyPainterFrame::OnQuit);Connect(idMenuAbout,wxEVT_COMMAND_MENU_SELECTED,(wxObjectEventFunction)&wxMyPainterFrame::OnAbout);//*)//设置滚动选项ScrolledWindow1->SetScrollRate(10, 10);ScrolledWindow1->SetVirtualSize(500, 480);
}wxMyPainterFrame::~wxMyPainterFrame()
{//(*Destroy(wxMyPainterFrame)//*)
}void wxMyPainterFrame::OnQuit(wxCommandEvent& event)
{Close();
}void wxMyPainterFrame::OnAbout(wxCommandEvent& event)
{wxString msg = wxbuildinfo(long_f);wxMessageBox(msg, _("Welcome to..."));
}void wxMyPainterFrame::OnScrolledWindow1LeftDown(wxMouseEvent& event)
{/*若为真,表示此时正处于绘画转态,也就没有必要设置_drawing和取画图的其实点了,这种情况对应着,在画图中,按着左键拖动过程中*/if(_drawing){return;}_drawing = true;_startPositionLogical = ScrolledWindow1->CalcUnscrolledPosition(event.GetPosition());
}void wxMyPainterFrame::OnScrolledWindow1MouseMove(wxMouseEvent& event)
{if(!_drawing)//不在绘画状态?{return;//直接退出}_currentPositionLogical = ScrolledWindow1->CalcUnscrolledPosition(event.GetPosition());ScrolledWindow1->Refresh();
}void wxMyPainterFrame::OnScrolledWindow1LeftUp(wxMouseEvent& event)
{if(!_drawing)//不在绘画状态?{return; //直接推出}_currentPositionLogical = ScrolledWindow1->CalcUnscrolledPosition(event.GetPosition());ScrolledWindow1->Refresh();_drawing = false; //结束绘画状态
}void wxMyPainterFrame::OnScrolledWindow1Paint(wxPaintEvent& event)
{wxPaintDC dc(ScrolledWindow1);wxPoint startPosition = ScrolledWindow1->CalcScrolledPosition(_startPositionLogical);wxPoint endPosition = ScrolledWindow1->CalcScrolledPosition(_currentPositionLogical);dc.DrawLine(startPosition, endPosition);
}

关键代码:

窗口增加私有成员数据并初始化

wxMyPainterFrame构造函数中,设置滚动选项

增加鼠标按下,移动,抬起函数

实现画图函数

相关文章:

第11章 GUI Page403~405 步骤三 设置滚动范围

运行效果&#xff1a; 源代码&#xff1a; /**************************************************************** Name: wxMyPainterApp.h* Purpose: Defines Application Class* Author: yanzhenxi (3065598272qq.com)* Created: 2023-12-21* Copyright: yanzhen…...

【Spring Security】打造安全无忧的Web应用--使用篇

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于Spring Security的相关操作吧 目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 一.Spring Security中的授权是…...

体验一下 CodeGPT 插件

体验一下 CodeGPT 插件 0. 背景1. CodeGPT 插件安装2. CodeGPT 插件基本配置3. (可选)CodeGPT 插件预制提示词原始配置(英文)4. CodeGPT 插件预制提示词配置(中文)5. 简单验证一下 0. 背景 看到B站Up主 “wwwzhouhui” 一个关于 CodeGPT 的视频&#xff0c;感觉挺有意思&#…...

深度学习 | 基础卷积神经网络

卷积神经网络是人脸识别、自动驾驶汽车等大多数计算机视觉应用的支柱。可以认为是一种特殊的神经网络架构&#xff0c;其中基本的矩阵乘法运算被卷积运算取代&#xff0c;专门处理具有网格状拓扑结构的数据。 1、全连接层的问题 1.1、全连接层的问题 “全连接层”的特点是每个…...

[字符编码]windwos下使用libiconv转换编码格式(二)

在http://t.csdnimg.cn/PLUuz笔记中实现了常用编码格式转换的功能,但这还是一个demo。因为代码中向libiconv库函数传递的字符串是存放在堆空间中的(我也是从网上找例子测试,是否一定要开辟堆空间存放还有待考证),如果一次性转换的字节数很巨大的话,就会导致内存空间不足,进而引…...

textile 语法

1、文字修饰 修饰行内文字 字体样式textile 语法对应的 XHTML 语法实际显示效果加强*strong*<strong>strong</strong>strong强调_emphasis_<em>emphasis</em>emphasis加粗**bold**<b>bold</b>bold斜体__italics__<i>italics</i…...

【快速开发】使用SvelteKit

自我介绍 做一个简单介绍&#xff0c;酒架年近48 &#xff0c;有20多年IT工作经历&#xff0c;目前在一家500强做企业架构&#xff0e;因为工作需要&#xff0c;另外也因为兴趣涉猎比较广&#xff0c;为了自己学习建立了三个博客&#xff0c;分别是【全球IT瞭望】&#xff0c;【…...

【docker笔记】docker常用命令

1、帮助启动类命令 1.1 启动、重启、查询当前状态、停止 systemctl start docker systemctl stop docker systemctl restart docker systemctl status docker1.2 设置开机启动 systemctl enable docker1.3 查看docker概要信息 docker info1.4 查看docker帮助文档 docker -…...

API 接口怎样设计才安全?

设计安全的API接口是确保应用程序和数据安全的重要方面之一。下面是一些设计安全的API接口的常见实践&#xff1a; 1. 身份验证和授权&#xff1a; 使用适当的身份验证机制&#xff0c;如OAuth、JWT或基本身份验证&#xff0c;以确保只有经过身份验证的用户可以访问API。实施…...

网站被CC攻击了怎么办?CC攻击有什么危害

网络爆炸性地发展&#xff0c;网络环境也日益复杂和开放&#xff0c;同时各种各样的恶意威胁和攻击日益增多&#xff0c;其中网站被CC也是常见的情况。 CC攻击有什么危害呢&#xff1f; 被CC会导致&#xff1a; 1.访问速度变慢&#xff1a;网站遭受CC攻击后&#xff0c;由于…...

Docker - 镜像 | 容器 日常开发常用指令 + 演示(一文通关)

目录 Docker 开发常用指令汇总 辅助命令 docker version docker info docker --help 镜像命令 查看镜像信息 下载镜像 搜索镜像 删除镜像 容器命令 查看运行中的容器 运行容器 停止、启动、重启、暂停、恢复容器 杀死容器 删除容器 查看容器日志 进入容器内部…...

要参加微软官方 Copilot 智能编程训练营了

GitHub Copilot 是由 GitHub、OpenAI 和 Microsoft 联合开发的生成式 AI 模型驱动的。 GitHub Copilot 分析用户正在编辑的文件及相关文件的上下文&#xff0c;并在编写代码时提供自动补全式的建议。 刚好下周要参加微软官方组织的 GitHub Copilot 工作坊-智能编程训练营&…...

Python入门学习篇(五)——列表字典

1 列表 1.1 定义 ①有序可重复的元素集合 ②可以存放不同类型的数据 ③个人理解:类似于java中的数组1.2 相关方法 1.2.1 获取列表长度 a 语法 len(列表名)b 示例代码 list2 [1, 2, "hello", 4] print(len(list2))c 运行结果 1.2.2 获取列表值 a 语法 列表名…...

React尝鲜

组件 React的组件就是一个js函数&#xff0c;函数内部return一个由jsx语法创建的html代码片段。 //MyComp.js export default function MyComp(){return (<h1>我是新组件MyComp</h1>) } 在需要引入组件的地方import导入组件&#xff0c;并放在相应位置 //App.js…...

锯齿云服务器租赁使用教程

首先登陆锯齿云账号 网盘上传数据集与代码 随后我们需要做的是将所需要的数据集与代码上传到网盘&#xff08;也可以直接在租用服务器后将数据集与代码传到服务器的硬盘上&#xff0c;但这样做会消耗大量时间&#xff0c;造成资源浪费&#xff09; 点击工作空间&#xff1a;…...

HarmonyOS和OpenHarmony的区别

1.概要 众所周知&#xff0c;鸿蒙是华为开发的一款分布式操作系统。因为开发系统&#xff0c;最重要的是集思广益&#xff0c;大家共同维护。为了在IOS和Android之间生存&#xff0c;鸿蒙的茁壮成长一定是需要开源&#xff0c;各方助力才能实现。   在这种思想上&#xff0c;…...

Redis Stream消息队列之基本语法与使用方式

前言 本文的主角是Redis Stream&#xff0c;它是Redis5.0版本新增加的数据结构&#xff0c;主要用于消息队列&#xff0c;提供了消息的持久化和主备复制功能&#xff0c;可以让任何客户端访问任何时刻的数据&#xff0c;并且能记住每一个客户端的访问位置&#xff0c;还能保证…...

制造行业定制软件解决方案——工业信息采集平台

摘要&#xff1a;针对目前企业在线检测数据信号种类繁多&#xff0c;缺乏统一监控人员和及时处置措施等问题。蓝鹏测控开发针对企业工业生产的在线数据的集中采集分析平台&#xff0c;通过该工业信息采集平台可将企业日常各种仪表设备能够得到数据进行集中分析处理存储&#xf…...

[python]用python实现对arxml文件的操作

目录 关键词平台说明一、背景二、方法2.1 库2.2 code 关键词 python、excel、DBC、openpyxl 平台说明 项目Valuepython版本3.6 一、背景 有时候需要批量处理arxml文件(ARXML 文件符合 AUTOSAR 4.0 标准)&#xff0c;但是工作量太大&#xff0c;阔以考虑用python。 二、方…...

pdf 在线编辑

https://smallpdf.com/edit-pdf#rapp 参考 https://zh.wikihow.com/%E5%B0%86%E5%9B%BE%E5%83%8F%E6%8F%92%E5%85%A5PDF...

终极Windows风扇控制解决方案:FanControl如何让你的电脑既安静又高效

终极Windows风扇控制解决方案&#xff1a;FanControl如何让你的电脑既安静又高效 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitH…...

上篇:那个隔墙听声的侦探——AI中的隐马尔可夫模型到底是什么,以及它为什么被发明出来

想象一下这样的场景&#xff1a;你被关在一间屋子里&#xff0c;隔壁房间有一个人在扔硬币。但你看不到那个房间&#xff0c;也看不到那个人&#xff0c;更看不到硬币。你唯一能做的&#xff0c;就是竖起耳朵听——每隔一段时间&#xff0c;你能听到一个声音&#xff1a;“叮”…...

RevokeMsgPatcher 2.1终极指南:一键实现微信QQ防撤回的完整教程

RevokeMsgPatcher 2.1终极指南&#xff1a;一键实现微信QQ防撤回的完整教程 【免费下载链接】RevokeMsgPatcher :trollface: A hex editor for WeChat/QQ/TIM - PC版微信/QQ/TIM防撤回补丁&#xff08;我已经看到了&#xff0c;撤回也没用了&#xff09; 项目地址: https://g…...

LeetCode 热题 100(每日两题)-Day2

坚持打卡第二天&#xff01;昨天的哈希表大显神威&#xff0c;今天我们将继续探索哈希集合的妙用&#xff0c;并引入数组操作中极其重要的技巧——双指针&#xff08;快慢指针&#xff09;。一、最长连续序列LeetCode 第 128 题&#xff0c;难度中等。这道题的难点在于题目强制…...

C++实战:高精度阶乘算法的实现与优化

1. 为什么我们需要高精度阶乘算法&#xff1f; 当你第一次学习编程时&#xff0c;可能会用循环或递归来实现阶乘计算。比如用C写个简单的for循环&#xff0c;轻松计算出5! 120。但当你尝试计算20!时&#xff0c;事情就开始变得有趣了——你会发现结果完全不对&#xff0c;甚至…...

跨设备追番终极指南:3步配置Kazumi WebDAV数据同步

跨设备追番终极指南&#xff1a;3步配置Kazumi WebDAV数据同步 【免费下载链接】Kazumi 基于自定义规则的番剧采集APP&#xff0c;支持流媒体在线观看&#xff0c;支持弹幕&#xff0c;支持实时超分辨率。 项目地址: https://gitcode.com/gh_mirrors/ka/Kazumi 还在为手…...

STM32状态机按键驱动设计:支持多事件触发与动态配置

1. 为什么需要状态机按键驱动&#xff1f; 在嵌入式开发中&#xff0c;按键处理看似简单却暗藏玄机。传统while循环扫描方式就像让主程序不断询问"按键按下了吗&#xff1f;"&#xff0c;不仅效率低下&#xff0c;还会导致系统响应迟钝。我曾在一个工业控制器项目中发…...

别再死记硬背了!用Python+OpenCV动手复现计算机视觉核心算法(边缘检测/图像分割实战)

用PythonOpenCV实战复现计算机视觉核心算法&#xff1a;从理论到代码的跨越 计算机视觉作为人工智能领域最炙手可热的方向之一&#xff0c;其核心算法构成了这门学科的骨架。但很多学习者在掌握理论知识后&#xff0c;面对实际项目仍感到无从下手——公式记住了&#xff0c;原理…...

从实验室到生活场景:近红外脑成像(fNIRS)如何重塑认知研究边界

1. 从实验室到客厅&#xff1a;fNIRS如何打破认知研究的围墙 十年前我第一次接触近红外脑成像设备时&#xff0c;它还是个需要固定在三脚架上的"庞然大物"&#xff0c;被试必须像雕塑般保持静止。如今看着学生戴着LUMO设备在操场自由活动时采集数据&#xff0c;这种技…...

Tree of Thoughts终极指南:5分钟掌握思维树算法原理与实战应用

Tree of Thoughts终极指南&#xff1a;5分钟掌握思维树算法原理与实战应用 【免费下载链接】tree-of-thought-llm [NeurIPS 2023] Tree of Thoughts: Deliberate Problem Solving with Large Language Models 项目地址: https://gitcode.com/gh_mirrors/tr/tree-of-thought-l…...