【wxWidgets】剪贴板和拖放操作

【wxWidgets】剪贴板和拖放操作

使用剪贴板传输数据时应用程序间的一种交互方式
剪贴板和拖放操作在wxWidgets中共享了一些类来实现数据的传输

数据对象

wxDataObject类时剪贴板操作和拖放操作的核心,该类实例代表了拖放操作中鼠标拖拽的事物和剪贴板中拷贝和粘贴的事物
通过GetFormatCount函数GetAllFormats函数能知道可支持的格式
实现SetData函数可以从外部接受不同格式的数据
wxDataFormate标准的数据格式:
在这里插入图片描述

数据源的职责

数据源负责创建要传输的数据对象,创建对象后通过SetData函数将其传递给剪贴板,或者在拖放操作中用DoDragDrop函数将其传递给一个wxDropSource对象
剪贴和拖放最大的不同:

  • 剪贴板传输数据需要使用new在堆上创建对象,在其不被需要时释放
  • 拖放数据对象只需要在DoDragDrop执行期间存在,执行结束即可释放

数据目标的职责

要接收数据应该先创建一个想要的数据格式wxDataObject的派生类,以便传递给wxClipboard::GetData函数,返回失败则剪贴板上没有目标类型数据

使用剪贴板

剪贴板主要调用wxTheClipboard的成员函数,在进行拷贝和粘贴之前先通过wxClipborad::Open获得剪贴板的控制权,调用wxClipboard::SetData来将数据拷贝到剪贴板上,或者调用wxClipboard::GetData获取数据,最后调用wxClipboard::Close释放控制权
wxClipboardLocker类可以在其构造函数获得剪贴板的控制权,在其析构函数释放剪贴板控制权
下面演示剪贴板上的文本操作:
在这里插入图片描述
下面演示剪贴板上的图片操作:
在这里插入图片描述
使用剪贴板可能需要及时更新界面,通过wxWidgets界面更新机制来完成,向程序发送wxUpdateUIEvent事件,在系统空闲的时候根据剪贴板的数据更新界面
在某些控件比如wxTextCtrl已经实现了自动更新

实现拖放操作

实现拖放源

提供用户用于拖放操作的数据需要使用一个wxDropSource类实例
一个拖放源需要采取的动作包括下面几步:

  1. 准备工作:先创建和初始化一个将被拖动的数据对象
    在这里插入图片描述
  2. 开始拖动:最典型的方式是相应鼠标单击事件,创建一个wxDropSource对象,调用wxDropSource::DoDragDrop函数
    在这里插入图片描述
    以下为DoDragDrop函数参数
    在这里插入图片描述
    当创建wxDropSource对象可以指定发起拖动操作的窗口,可以选择拖动使用的光标,可选范围包括拷贝,移动以及不能释放等,这些光标在GTK+上是图标,而在别的平台上是光标,因此需要hi使用wxDROP_ICON来屏蔽这种区别
  3. 拖动过程:对DoDragDrop函数的调用将会阻止应用程序进行其他处理,直到用户释放鼠标按钮(除非重载了GiveFeedback函数以便实现其他特殊操作)当鼠标在应用程序的窗口上移动时,如果这个窗口可以识别这个拖动操作协议,对应的wxDropTarget函数就会被调用
  4. 处理拖放结果:DoDragDrop函数返回一个拖放操作的结果,返回值类型为wxDragResult,枚举值如下
    在这里插入图片描述
    程序可以针对不同的返回值进行操作,如果返回值是wxDragMove,通常需要删除绑定在数据源中的数据,然后更新屏幕显示。而如果返回值wxDragNone,则表示拖动操作已经被取消了
    在这里插入图片描述

下面演示了实现一个文本数据拖放源,DnDWindow包含一个m_strText成员变量,当鼠标左键按下时,针对m_strText拖放操作开始,拖放操作的结果通过一个消息框显示,另外拖放操作将会在鼠标已经拖动了一小段距离后才会开始,因此单机鼠标动作并不会导致一个拖放操作
在这里插入图片描述
在这里插入图片描述

实现一个拖放目的

要实现拖放目的,接受用户拖动的数据,需要使用wxWindow::SetDropTarget函数,将某个窗口和一个wxDropTarget绑定在一起,需要实现一个wxDropTarget的派生类,并且重载虚函数
还需要重载OnDragOver函数,以便返回一个wxDragResult类型的返回码,以说明当鼠标指针移过窗口时光标怎样显示,并且重载OnData函数来实现放置操作,可以通过继承wxTexTDropTarget或者wxFileDropTarget,或者重载它们的OnDropText或者OnDropFiles函数来实现拖放

  1. 初始化:wxWindow::SetDropTarget函数在窗口创建期间被调用,以便将其和一个拖放目的对象绑定,在窗口创建或者应用程序的其他某个部分,通过函数wxDropTarget::SetDataObject,拖放目的对象和某一种数据类型绑定,这种数据类型将用来作为拖放源和播放目的进行协商的依据
  2. 拖动:当鼠标在拖放目的上以拖动的方式移动时,wxDropTarget::OnEnter,wxDropTarget::OnDragOver和wxDroptarget::OnLeave函数将在适当的时候被调用,它们都将返回一个对应的wxDragResult值,以便施放操作可以对其进行合适的用户界面反馈
  3. 放置:当用户释放鼠标按钮的时候,wxWidgets通过调用函数wxDataObject::GetALLFormats询问窗口绑定的wxDropTarget对象是否接受正在拖动的数据,如果数据类型是可接受的,那么wxDropTarget::OnData将被调用。拖放对象绑定的wxDataObject对象将进行对应的数据填充动作,wxDropTarget::OnData函数将返回一个wxDragResult类型的值,作为wxDropSource::DoDragDrop函数的返回值

使用标准的拖放目的对象

to be continued…

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/7721.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Stephen Wolfram:一次只添加一个词

It’s Just Adding One Word at a Time 一次只添加一个词 That ChatGPT can automatically generate something that reads even superficially like human-written text is remarkable, and unexpected. But how does it do it? And why does it work? My purpose here is t…

mysql进阶1——proxysql中间件

文章目录 一、基本了解二、安装部署三、proxysql管理配置3.1 内置库3.1.1 main库表3.1.2 stats库表3.1.3 monitor库 3.2 常用管理变量3.2.1 添加管理用户3.2.2 添加普通用户3.2.3 修改监听套接字 四、多层配置系统4.1 系统结构4.2 修改变量加载配置4.3 启动加载流程 一、基本了…

单机和集群以及分布式的浅析

假设一个大系统分为A、B、C、D、E五个模块,也可以认为是五个基本的服务,该系统靠这五个模块协同工作,共同为用户提供服务。 单机 单机:显然,单机表名该系统完完全全的部署在该台机器上,拥有完整的服务&am…

集成学习——Boosting算法:Adaboost、GBDT、XGBOOST和lightGBM的简要原理和区别

1、Boosting算法 Boosting算法是通过串联的方式,将一组弱学习器提升为强学习器算法。它的工作机制如下: (1)用初始训练集训练出一个基学习器; (2)依据基学习器的表现对训练样本分布进行调整&…

opencv 图像距离变换 distanceTransform

图像距离变换:计算图像中每一个非零点距离离自己最近的零点的距离,然后通过二值化0与非0绘制图像。 #include "iostream" #include "opencv2/opencv.hpp" using namespace std; using namespace cv;int main() {Mat img, dst, dst…

洛必达法则和分部积分的应用之计算数学期望EX--概率论浙大版填坑记

如下图所示,概率论与数理统计浙大第四版有如下例题: 简单说就是:已知两个相互独立工作电子装置寿命的概率密度函数,将二者串联成整机,求整机寿命的数学期望。 这个题目解答中的微积分部分可谓是相当的坑爹,…

vue/cli 自定义配置

vue/cli 自定义配置 1、更改默认的端口号8080 只需要更改vue.config.js文件 1、更改默认的端口号8080 只需要更改vue.config.js文件

脑电信号处理与特征提取——4.脑电信号的预处理及数据分析要点(彭微微)

目录 四、脑电信号的预处理及数据分析要点 4.1 脑电基础知识回顾 4.2 伪迹 4.3 EEG预处理 4.3.1 滤波 4.3.2 重参考 4.3.3 分段和基线校正 4.3.4 坏段剔除 4.3.5 坏导剔除/插值 4.3.6 独立成分分析ICA 4.4 事件相关电位(ERPs) 4.4.1 如何获…

什么是UE像素流送,像素流推流是什么原理?

游戏开发者通常在运行游戏逻辑时会将游戏渲染到屏幕的同一台设备上来运行虚幻引擎应用,多人联网游戏可能会在应用程序的多个实例之间分发部分游戏逻辑,但每个单独的实例仍然会为自己的玩家在本地渲染游戏。即使是使用 HTML5 部署选项创建可以在 Web 浏览…

解决@Scope(“prototype“)不生效的问题

目录 Scope(“prototype“)不生效Scope(“prototype“)正确用法——解决Bean多例问题 1.问题,Spring管理的某个Bean需要使用多例2.问题升级3. Spring给出的解决问题的办法(解决Bean链中某个Bean需要多例的问题) Scope(“prototype“)不生效 …

【ribbon】Ribbon的使用与原理

负载均衡介绍 负载均衡(Load Balance),其含义就是指将负载(工作任务)进行平衡、分摊到多个操作单元上进行运行,例如FTP服务器、Web服务器、企业核心应用服务器和其它主要任务服务器等,从而协同…

【《Go编程进阶实战:开发命令行应用、HTTP应用和gRPC应用》——指导你使用Go语言构建健壮的、生产级别的应用程序】

谷歌在2009年发布了Go编程语言,并于2012年发布了1.0版。Go语言具有强大的兼容性,一直用于编写可扩展的重量级程序(命令行应用程序、关键基础设施工具乃至大规模分布式系统)。凭借简单性、丰富的标准库和蓬勃发展的第三方软件包生态系统,Go语言…

工程安全监测无线振弦采集仪在建筑物中的应用

工程安全监测无线振弦采集仪在建筑物中的应用 工程安全监测无线振弦采集仪是一种用于建筑物结构安全监测的设备,它采用了无线传输技术,具有实时性强、数据精度高等优点,被广泛应用于建筑物结构的实时监测和预警。下面将从设备的特点、应用场…

FPGA中RAM的结构理解

FPGA中RAM的结构理解 看代码的过程中对RAM的结构不是很理解,搞脑子一片浆糊,反复推算,好不容易理清了思路,记录下来,防止忘记。开辟的RAM总容量为128bytes,数据的位宽为32位(即一个单元有32bit…

Linux の shell 基本语法

变量 shell中变量比较特殊,变量名和等号之间不能有空格。其它的跟常见的变成语言类似 命名规则: 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。 中间不能有空格,可以使用下划线 _。 不能使用标点符号。…

Flask 创建文件目录,删除文件目录

项目结构 app.py from flask import Flask, render_template, request, redirect, url_for import osapp Flask(__name__) BASE_DIR os.path.abspath(os.path.dirname(__file__)) FILE_DIR os.path.join(BASE_DIR, testfile)app.route(/, methods[GET, POST]) def index():…

jenkins

Gitlab添加钩子 测试钩子 添加完成后,下面会出现钩子选择。点击test中的,push event。 出现successful,既添加成功。 如果添加失败,报错,更改Network

JMerter安装配置以及使用(笔记记录)

JMerter安装配置以及使用(笔记记录) 安装JDK安装JMeterJMeter使用元件执行的顺序参数详解参数配置之CSV数据文件设置断言响应断言JSON断言 数据提取XPath提取器JSON提取器 JMeter属性JMeter录制脚本JMeter直连数据库逻辑控制器如果(IF&#x…

数据库概述和DDL语句(学会并使用数据库day1)

数据库概述和DDL语句(day1) 一、数据库概述概念数据库的集中式控制有什么优点数据库分类mysql数据库mysql简介基本术语数据表的组成 数据库管理系统数据库管理系统、数据库和表的关系 二、SQL的概念三、SQL语句分类1、SQL语句被分为四大类2、MySQL的语法…

Databend 开源周报第 103 期

Databend 是一款现代云数仓。专为弹性和高效设计,为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务:https://app.databend.cn 。 Whats On In Databend 探索 Databend 本周新进展,遇到更贴近你心意的 Databend 。 创建网络策略 …