【wxWidgets】剪贴板和拖放操作

news2024/7/6 19:38:49

【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.coloradmin.cn/o/787106.html

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

相关文章

【git学习2】多人合作中git的使用

提交代码 中间打勾:commit提交代码 最后点击向上的箭头 push到远程仓库。 团队开发中git的使用 第一步先从远程仓库中某个分支拉下来代码,比如下图只有一个分支master 新建文件夹,存放这个拉下来的项目,克隆项目地址&#xff…

JDK8版本接口的改进(heima)

JDK8版本接口的改进(heima) public class InterfaceTest1 {/*JDK8版本接口改进1.允许编写带有方法体的方法(默认方法)2.允许编写静态方法目的:解决接口的升级问题---------------------------------------注意事项&…

HDFS的设计目标和重要特性

HDFS的设计目标和重要特性 设计目标HDFS重要特性主从架构分块存储机制副本机制namespace元数据管理数据块存储 设计目标 硬件故障(Hardware Failure)是常态,HDFS可能有成百上千的服务器组成,每一个组件都有可能出现故障。因此古见检测和自动快速恢复的H…

基本数据类型和引用数据类型

数据类型的分类 java中的 变量 按照数据类型来分类: Java语言是 强 类型语言,对于每一种数据都给出了明确的数据类型,不同的数据类型也分配了不同的内存空间,所以它们表示的数据大小也是不一样的。基本数据类型(4类8种…

[Python] flask运行+wsgi切换生产环境+supervisor配置指南

文章目录 问题背景flask启动方式1(编写main函数):方式2(编译器):方式3(命令行):方法4(重命名文件法):方法5(使用flask命令…

欧盟新规,燃油噩梦?2025年起,高速公路每60公里设立一处快充站

根据外媒The Verge报道,欧洲电动汽车用户将获得更多便捷的待遇,同时还能减少有害温室气体排放,这得益于欧盟理事会最新通过的法规。 根据欧盟的法规要求,自2025年起,TEN-T高速公路系统在欧洲将需要每隔60公里设立一座高…

WEB:ics-07

背景知识 php弱类型 文件上传漏洞 一句话木马 floatval函数 题目 点击项目管理 点击查看源代码&#xff0c;发泄一个view-source.php 访问该网页 进行代码审计 <?php session_start();if (!isset($_GET[page])) {show_source(__FILE__);die(); }if (isset($_GET[page]) &…

ant design vue a-table表格中插入操作按钮(以switch开关 [a-switch]为例)

1.给columns添加列属性 columns() {sortedInfo sortedInfo || {};return [{title: "工程",dataIndex: "outputProject",width: 80},{title: "是否显示小数",dataIndex: "showDecimalsOrnot",width: 80,scopedSlots: { customRender:…

页面设计—FixedContainer固定容器组件详解

一、组件介绍 可任意拖动位置&#xff0c;脱离文档流布局&#xff0c;生成绝对定位的元素 二、如何使用 1、找到FixedContainer组件&#xff0c;拖放到页面位置。 2、设置是否拖动&#xff0c;设置高级样式&#xff0c;也可以在自定义样式里编写css样式 操作步骤如下&…

IO进程线程,标准IO函数

一、什么是IO I&#xff1a;input --->输入&#xff0c;从外部存储设备将数据输入到内存中。 O&#xff1a;output --->输出&#xff0c;数据从内存到外部存储设备。 总结&#xff1a;输入输出就是数据从外存到内存&#xff0c;内存到外存的流向。 二、IO分类 1. 文件…

Arcgis之 KML/KMZ文件转shp

一般我们在Goole Earth上勾画的区域导出后都为KML或者KMZ格式的&#xff0c;但无法在arcgis等软件上直接应用&#xff0c;故需进行一定的转换 1.打开ArcMap&#xff0c;选择ArcToolbox->Conversion Tools->From KML->KML To Layer 得到如下结果&#xff08;由于本KML…

三菱PLC 流水灯控制

方式一思路&#xff1a;每一秒让计数器 C0 的值加一&#xff0c;然后将 C0 对应的值赋值给输出灯 Y10 - Y15。 方式二思路&#xff1a;每一秒让寄存器 D0 的值向左移1位&#xff0c;然后使用组合位元件将 D0 的低八位值传送给输出灯 Y10 - Y17。 后面有更好的思路再来增加。

【Ajax】笔记-使用fetch函数发送AJAX请求

fetch()函数说明与使用方法详解 fetch()是XMLHttpRequest的升级版,用于在JavaScript脚本里面发出 HTTP请求,本文章向大家介绍fetch()的用法,主要包括fetch()的用法使用实例、应用技巧、基本知识点总结和需要注意事项&#xff0c;具有一定的参考价值&#xff0c;需要的朋友可以参…

S-NER: A Concise and Efficient Span-Based Model for NamedEntity Recognition

原文链接&#xff1a;Sensors | Free Full-Text | S-NER: A Concise and Efficient Span-Based Model for Named Entity Recognition Sensors 2022 介绍 NER中的序列标注模型使用条件随机场&#xff08;CRF&#xff09;来获取标签之间的依赖性&#xff0c;存在误差传播的问题&a…

Docker可视化管理工具Portainer多机器安装使用

一、首先得安装docker Docker安装并指定主目录:https://blog.csdn.net/wdy_2099/article/details/77367107 二、使用docker方式安装portainer 安装命令如下&#xff1a; docker run -it -d \-p 8999:9000 \--name portainer \--restart always \-v /var/run/docker.sock:/v…

@vue/cli安装

vue/cli安装 1、全局安装vue/cli包2、查看是否成功 1、全局安装vue/cli包 yarn global add vue/cli2、查看是否成功 vue -V

React Dva项目中模仿网络请求数据方法

我们都已经选择react了 那么自然是一个前后端分离的开发形式 至少我在公司中 大部分时候是前后端同时开发的 一般你在开发界面没有接口直接给你 但你可以和后端约定数据格式 然后在前端模拟数据 我们在自己的Dva项目中 在根目录下的 mock 目录下创建一个js文件 我这里叫 filmDa…

Qt 添加MySQL驱动教程 以及 操作数据库(增删查改)

前言&#xff1a; 使用MySQL数据库前我们必须添加MySQL驱动&#xff0c;有了驱动我们才能连接数据库&#xff0c;连接数据库成功后才能操作数据库&#xff08;增删查改&#xff09;。 Qt 添加MySQL驱动教程 如下&#xff08;本人亲测成功版&#xff09;&#xff1a; https://do…

【SQL语句】

目录 一、SQL语句类型 1.DDL 2.DML 3.DLL 4.DQL 二、数据库操作 1.查看 2.创建 2.1 默认字符集 2.2 指定字符集 3.进入 4.删除 5.更改 5.1 库名称 5.2 字符集 三、数据表操作 1.数据类型 1.1 数值类型&#xff08;常见&#xff0c;下同&#xff09; 1.1.1 T…

【IDEA】IDEA 中点击Download Source(下载源码)后,下载的源码存储到哪了?

【问】如上图&#xff0c;IDEA 中点击 Download Source&#xff08;下载源码&#xff09;后&#xff0c;下载的源码存储到哪了&#xff1f; 【答】 先找到此源码所属 Jar 包在哪&#xff1b;点击 Download Source&#xff08;下载源码&#xff09;后&#xff0c;会发现存储 J…