【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…

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

10分钟搭建链路追踪平台

随着项目越来越多,相互调用越来越复杂,搭建一个可视化的链路追踪平台显得尤为重要,今天给大家介绍的是zipkin,一个轻量级的零侵入的链路追踪平台,看我怎么10分钟给大家搭建出来。 1,介绍 zipkin官网&…

机器人制作开源方案 | 智能垃圾桶

1. 功能说明 智能垃圾桶是一种利用物联网技术和智能感知能力的智能设备,旨在提高垃圾分类和处理的效率。通常具备以下特点和功能: ① 智能感知:智能垃圾桶配备各种传感器,如压力传感器、红外线传感器等,可以实时感知…

FPGA开发:按键消抖

按键是FPGA开发板上的重要交互元件,因为按键的内部的结构设计,在按下和松开按键时,按键会无法避免地产生机械抖动,因此要对按键输入进行特殊处理,否则可能会因为机械抖动产生意外的重复触发。 按键消抖有很多方法&…

超详细,自动化测试allure测试报告实战(总结)

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 allure可以输出非…

python机器学习(四)线性代数回顾、多元线性回归、多项式回归、标准方程法求解、线性回归案例

回顾线性代数 矩阵 矩阵可以理解为二维数组的另一种表现形式。A矩阵为三行两列的矩阵,B矩阵为两行三列的矩阵,可以通过下标来获取矩阵的元素,下标默认都是从0开始的。 A i j : A_{ij}: Aij​:表示第 i i i行,第 j j j列的元素。…

记录--关于前端的音频可视化-Web Audio

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 背景 最近听音乐的时候,看到各种动效,突然好奇这些音频数据是如何获取并展示出来的,于是花了几天功夫去研究相关的内容,这里只是给大家一些代码实例&…

数字孪生:未来科技的新前沿

数字孪生作为一项新兴的研究方向,正逐渐成为科技界的焦点。它是将现实世界中的实体、系统或过程通过数字化手段进行建模、仿真和分析,形成与实体相对应的数字化副本。数字孪生的发展为我们带来了无限的想象空间,以及解决现实问题的新途径。 在…

如何有效跟踪你的计费时间?

对于自由职业者、小型企业和远程团队来说,时间跟踪是必需的。了解自己在单个项目或任务上投入了多少时间,可以帮助他们有效管理资源和优化工作流程。 然而,在向客户收费时,时间跟踪多了一层复杂性:不仅需要跟踪所花费…

在Win11的WSL子系统Ubuntu上安装Gnome桌面环境

目录 1. 使用 WSL 在 Win11 上安装 Linux 2. 安装Ubuntu 22.04默认Gnome桌面环境 2.1更新Ubuntu 22.04软件包 2.2 安装Ubuntu桌面环境 2.3 重启服务 2.4 重启Ubuntu 22.04系统 2.5 登录Gnome桌面环境 在Win11上安装ubuntu版linux系统并实现默认Gnome桌面环境&#xff08…

Vue中TodoList案例_总结

完整项目&#xff1a; App.vue <template><div id"root"><div class"todo-container"><div class"todo-wrap"><MyHeader :addTodo"addTodo"/><MyList :todos"todos" :checkTodo"che…

2023年一建学霸笔记

考点:单方取消或辞去委托承担的民事责任女《民法典》规定&#xff0c;因解除合同造成对方损失的&#xff0c;除不可归责于该当事人的事由外&#xff0c;无偿委托合同的解除方应当赔偿因解除时间不当造成的直接损失&#xff0c;有偿委托合同的解除方应当赔偿对方的直接损失和合同…

热备盘激活失败导致raid5阵列崩溃的服务器数据恢复案例

服务器数据恢复环境&#xff1a; 一台Linux Redhat操作系统服务器上有一组由5块硬盘组建的raid5阵列&#xff0c;包含一块热备盘。上层部署一个OA系统和Oracle数据库。 服务器故障&#xff1a; raid5阵列中的1块磁盘离线&#xff0c;硬盘离线却没有激活热备盘&#xff0c;直到…

QT构建套件(Kit)黄色感叹号问题解决

构建套件&#xff08;Kit&#xff09;黄色感叹号问题 1:看下面的图出现了黄色警告&#xff0c;此时这个构建套件 就是不允许使用的 2&#xff1a;查看一下MSVC的dedbug调试器(cdb.exe) 如果没有&#xff0c;我们需要下载cdb.exe cdb.exe下载方法 2.1首先我们可以打开我们系…

STM32CUBUMX配置FLASH(W25Q128)--保姆级教程

———————————————————————————————————— ⏩ 大家好哇&#xff01;我是小光&#xff0c;嵌入式爱好者&#xff0c;一个想要成为系统架构师的大三学生。 ⏩最近在开发一个STM32H723ZGT6的板子&#xff0c;使用STM32CUBEMX做了很多驱动&#x…

使用JMeter进行接口测试教程

安装 使用JMeter的前提需要安装JDK&#xff0c;需要JDK1.7以上版本目前在用的是JMeter5.2版本&#xff0c;大家可自行下载解压使用 运行 进入解压路径如E: \apache-jmeter-5.2\bin&#xff0c;双击jmeter.bat启动运行 启动后默认为英文版本&#xff0c;可通过Options – Ch…

【中创】区块链技术登上太空!全球首颗在轨可视化区块链卫星成功发射

作为一项突破性技术&#xff0c;区块链激发了许多技术创新者&#xff0c;区块链具备高安全、不可篡改和去中心化特征&#xff0c;能降低维护成本&#xff0c;提高可用性&#xff0c;可以为航空航天业提供更加灵活、可靠和高效的解决方案。 01航天科技之卫星导航 7月22日&#x…

(Chrome Ext)谷歌扩展程序-谷歌插件渗透测试方法记录

文章目录 前言一、本地获取谷歌插件/扩展程序源码二、工具化信息收集总结 前言 在工作岗位变更之后&#xff0c;越来越多“奇奇怪怪”的东西要去渗透和测试&#xff0c;在我之前干安服的时候&#xff0c;最多的就是测一下web&#xff0c;极少情况下测测app&#xff0c;但是现在…

【node】使用express+gitee搭建图床,并解决防盗链问题

首先创建一个gitee的项目&#xff0c;详细步骤我就不一一说明 注解&#xff1a;大家记得将这个项目开源&#xff0c;还有记得获取自己的私钥&#xff0c;私钥操作如下&#xff1a; node依赖下载&#xff1a; "axios": "cors": "express"…

opencv-16 图像去水印示例

常用的去水印方法&#xff1a; 克隆修复工具&#xff1a;使用图像处理软件&#xff08;如Photoshop&#xff09;中的克隆修复工具可以选择一个样本区域&#xff0c;然后将其复制到水印区域&#xff0c;以覆盖水印。这种方法在简单的水印上可能效果不错&#xff0c;但复杂的水印…

深度学习anaconda+pycharm+虚拟环境迁移

一、下载好anaconda和pycharm安装包。 下载anaconda:Index of /anaconda/archive/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror pycharm汉化包 二、安装anaconda 深度学习环境配置-Anaconda以及pytorch1.2.0的环境配置&#xff08;Bubbliiiing 深度学习 教程&…