11.2 使用剪贴板
要使用剪贴板,你主要是在调用全局指针wxTheClipboard的成员函数. 在进行拷贝或者粘贴的动作之前,你必须先通过wxClipboard::Open获得剪贴板的控制权,如果这个函数返回成功,你将已经获得了剪贴板的控制权,可以调用wxClipboard::SetData来将数据拷贝到剪贴板上,或者调用wxClipboard::GetData函数从剪贴板上获取数据.最后,你需要调用wxClipboard::Close函数来释放剪贴板的控制权.一旦你不使用剪贴板了,就应该尽快释放掉剪贴板的控制权.
wxClipboardLocker类可以在其构造函数中获得剪贴板的控制权(如果可以的话),并且在其析构函数中释放剪贴板的控制权,因此,你可以使用下面这样的代码:
wxClipboardLocker locker;
if (!locker)
{
... 报告错误然后返回 ...
}
... 使用剪贴板 ...
下边的代码演示了怎样将文本拷贝到剪贴板以及怎样从剪贴板读取文本数据:
// 拷贝一些文本到剪贴板
if (wxTheClipboard->Open())
{
// 数据对象将被剪贴板释放,
// 因此不在要你的应用程序中释放它们.
wxTheClipboard->SetData(new wxTextDataObject(wxT("Some text")));
wxTheClipboard->Close();
}
// 从剪贴板获取一些文本
if (wxTheClipboard->Open())
{
if (wxTheClipboard->IsSupported(wxDF_TEXT))
{
wxTextDataObject data;
wxTheClipboard->GetData(data);
wxMessageBox(data.GetText());
}
wxTheClipboard->Close();
}
下边是一个操作图片的例子:
// 将一副图片拷贝到剪贴板
wxImage image(wxT("splash.png"), wxBITMAP_TYPE_PNG);
wxBitmap bitmap(image.ConvertToBitmap());
if (wxTheClipboard->Open())
{
// 数据对象将被剪贴板释放,
// 因此不在要你的应用程序中释放它们.
wxTheClipboard->SetData(new wxBitmapDataObject(bitmap));
wxTheClipboard->Close();
}
// 从剪贴板读取一幅图片
if (wxTheClipboard->Open())
{
if (wxTheClipboard->IsSupported(wxDF_BITMAP))
{
wxBitmapDataObject data;
wxTheClipboard->GetData( data );
bitmap = data.GetBitmap();
}
wxTheClipboard->Close();
}
如果你使用了剪贴板操作你可能需要即时更新你的用户界面,比如在剪贴板拥有或者失去相关数据的时候,允许或者禁用相关的菜单项,工具条上的按钮以及一些普通的按钮.这个工作是通过wxWidgets的界面更新机制来完成的.在合适的时候 wxWidgets将会给你的应用程序发送wxUpdateUIEvent事件,详情请参考第九章"创建自己自定义的对话框".这个事件允许你在系统空闲的时候根据剪贴板的数据来更新你的用户界面.
某些控件,比如wxTextCtrl已经实现了用户界面的自动更新.如果你的菜单项或者工具条使用了标准的标识符wxID_CUT, wxID_COPY, 和wxID_PASTE,并且指定了命令事件将首先被活动的控件处理,那么对应的控件将会自动按照用户的预期来进行界面更新.参考第二十章"优化你的应用程序"来学习怎样通过重载wxFrame::ProcessEvent函数将命令事件传递到当前激活的控件.