wxWidgets的drag和drop

在两个不同窗口之间的drag和drop,或者是从应用程序外面传进来的drop(如从某个文件夹拖入文件到应用程序的窗口中),需要下面的知识:


接收drop的窗口:


1、接受drop的窗口在初始化的时候用SetDropTarget()方法来说明自己接受某类物体的drop;

2、SetDropTarget()的参数是一个wxDropTarget的子类,常用的有wxTextDropTarget、wxFileDropTarget,都必须包含dnd.h;

3、如果自己从wxDropTarget派生子类,可以重载OnData()来过滤自己喜欢的信息;


注意:

SetDropTarget()必须在窗口创建后再调用,如果发现按照文中的步骤做了,但是drap到目标窗口的时候,依然不能正常drop,首先需要查的就是这一点。


产生drag的窗口:


1、建立(new)一个DropSource,在wxWidgets中,就是“wxDropSource”。这个源包含了drag的信息。

2、然后程序可以用类似wxDropSource.DoDragDrop()的方式执行这个drag过程。


内部原理:


如果在释放鼠标左键的时候,window内部会检查当前鼠标在的窗口是否是一个DropTarget(),是就会调用上面的参数中的OnData()。


上面一段也说明了drag的信息,drop的源就是drag产生出的Drop source。


陷阱:


貌似最简便的方式是利用C++的继承能力,从wxTextDropTarget等继承。只要3步:


1、继承 wxTextDropTarget;

2、声明和实现父类的虚函数;

3、在创建窗口的时候,用SetDropTarget(this)设置自己成为一个接受相关drop的目标。


这样,一个对应的源,就可以被拖到我们现在的窗口了。


问题在于,wxWidgets会在某个析构的函数里面试图删除SetDropTarget()中送入的参数,因此事实上刚才的只是个美丽的设想。不能实现。






### 如何在 Code::Blocks 中配置和使用 wxWidgets 进行 GUI 开发 #### 1. 安装必要的软件包 为了能够在 Code::Blocks 中顺利地使用 wxWidgets 创建图形用户界面 (GUI),需要先安装好相应的工具链。对于 Linux 用户来说,在 Ubuntu 或其他 Debian 衍生发行版上可以通过命令行安装所需的依赖项,包括编译器 GCC 和 wxWidgets 库本身[^2]。 ```bash sudo apt-get update sudo apt-get install build-essential libwxgtk3.0-gtk3-dev ``` #### 2. 下载并安装 Code::Blocks IDE 确保下载的是最新稳定版本的 Code::Blocks,并按照官方指南完成安装过程。如果已经安装了旧版本,则建议升级到较新的版本以获得更好的兼容性和功能支持[^4]。 #### 3. 设置 wxWidgets 路径 启动 Code::Blocks 后进入全局变量设置页面,添加一个新的全局变量用于指向本地 wxWidgets 的安装位置。这一步骤是为了让项目能够找到正确的头文件和库文件路径[^5]。 #### 4. 创建新工程 通过菜单栏中的 "File -> New -> Project..." 来创建一个新的 wxWidgets 工程模板。选择合适的向导选项继续下一步直到完成整个项目的初始化工作[^3]。 #### 5. 配置工程属性 针对所选类型的 wxWidgets 构建模式(静态链接或动态链接),调整对应的编译参数以及连接时使用的库名称。这些设置可以在 “Build options” 对话框内的各个标签页下找到并修改。 #### 6. 编写代码与调试 现在就可以开始编写自己的应用程序逻辑部分了。利用所提供的 API 函数实现窗口组件布局设计等功能特性;同时也可以借助于内置的调试工具来帮助定位可能出现的问题所在之处[^1]。 ```cpp #include <wx/wx.h> class MyApp : public wxApp { public: virtual bool OnInit(); }; IMPLEMENT_APP(MyApp) bool MyApp::OnInit() { wxFrame *frame = new wxFrame(NULL, wxID_ANY, "Hello World"); frame->Show(true); return true; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值