自定义wxWidgets打印预览窗口的按钮
时间:2011-03-27 来源:Kevin.h
wxWidgets提供了默认的打印与预览框架,这使得打印文档相对比较简单了。但是默认的打印预览窗口功能有限,如果需要更多一点儿的功能就需要扩展打印预览窗口。比如在打印文档时候增加输出PDF格式文件的功能或者打印报表时候输出报表到Excel文件等。如果增加上述两个功能就需要扩展原有的打印控制栏并增加相应的按钮及功能,这里先把如何在标准打印预览窗口的控制栏上增加按钮及响应事件记录下来,省的忘记了。实现的效果如下图:
需要做的工作:
1、重载wxPreviewControlBar,主要的工作在CreateButtons以及新增加的按钮事件处理上。
2、定义增加的两个按钮的相关数据及事件
//ButtonFlags of new buttons#define wxPREVIEW_TOEXCEL 128
#define wxPREVIEW_TOPDF 256
//ButtonID of new buttons
#define wxID_PREVIEW_TOEXCEL 11
#define wxID_PREVIEW_TOPDF 12
//Bitmap(ICO) of new buttons
#define wxART_CONV_TO_EXCEL wxART_MAKE_ART_ID(wxART_CONV_TO_EXCEL)
#define wxART_CONV_TO_PDF wxART_MAKE_ART_ID(wxART_CONV_TO_PDF)
3、添加相应的按钮处理事件
public:void OnToExcel();
void OnToPDF();
//绑定响应事件到按钮
void OnToExcelButton(wxCommandEvent& WXUNUSED(event)){ OnToExcel(); }
void OnToPDFButton(wxCommandEvent & WXUNUSED(event)) { OnToPDF(); }
//更新状态(可用或不可用)
void OnUpdateToExcelButton(wxUpdateUIEvent& event)
{ event.Enable(IsToExcelEnabled()); }
void OnUpdateToPDFButton(wxUpdateUIEvent& event)
{ event.Enable(IsToPDFEnabled()); }
private:
bool IsToExcelEnabled() const;
bool IsToPDFEnabled() const;
//绑定事件
BEGIN_EVENT_TABLE(wxMyPreviewControlBar, wxPanel)
EVT_BUTTON(wxID_PREVIEW_TOEXCEL, wxHuiPreviewControlBar::OnToExcelButton)
EVT_BUTTON(wxID_PREVIEW_TOPDF, wxHuiPreviewControlBar::OnToPDFButton)
EVT_UPDATE_UI(wxID_PREVIEW_TOEXCEL, wxMyPreviewControlBar::OnUpdateToExcelButton)
EVT_UPDATE_UI(wxID_PREVIEW_TOPDF, wxMyPreviewControlBar::OnUpdateToPDFButton)
END_EVENT_TABLE()
4、在CreateButtons中创建新增加的按钮。wxWidgets使用了一个辅助类SizerWithButtons来处理按钮的创建,具体增加按钮的工作由这个类的AddButton函数来完成,所以我也复制了一个自己的这样的类。在增加按钮的时候如果不是系统定义的wxArtID,那就是我定义的,这个时候我需要使用自己的图片(我用的XPM)来创建新的按钮。
void AddButton(wxWindowID btnId,
const wxArtID& artId,
const wxString& tooltip)
{
// We don't use (smaller) images inside a button with a text label but
// rather toolbar-like bitmap buttons hence use wxART_TOOLBAR and not
// wxART_BUTTON here.
wxBitmap bmp = wxNullBitmap;
if((artId == wxART_CONV_TO_EXCEL) || (artId == wxART_CONV_TO_PDF))
{
if(artId == wxART_CONV_TO_EXCEL)
bmp = wxBitmap(excel_xpm);
else
bmp = wxBitmap(pdf_xpm);
}
else
{
bmp = wxArtProvider::GetBitmap(artId, wxART_TOOLBAR);
}
wxBitmapButton * const btn = new wxBitmapButton(m_parent, btnId, bmp);
btn->SetToolTip(tooltip);
Add(btn);
}
在CreateButtons中创建控制栏按钮的顺序是从左到右一次创建的。
if (m_buttonFlags & wxPREVIEW_TOEXCEL){
sizer.AddButton(wxID_PREVIEW_TOEXCEL, wxART_CONV_TO_EXCEL, _T("输出Excel格式文档"));
}
if (m_buttonFlags & wxPREVIEW_TOPDF)
{
sizer.AddButton(wxID_PREVIEW_TOPDF, wxART_CONV_TO_PDF, _T("输出PDF格式文档"));
sizer.EndOfGroup();
}
5、最后在用的时候继承一个wxPreviewFrame,重写一下CreateControlBar事件
void MyPreviewFrame::CreateControlBar(){
long buttons = wxPREVIEW_DEFAULT | wxPREVIEW_TOEXCEL | wxPREVIEW_TOPDF;
if (m_printPreview->GetPrintoutForPrinting())
buttons |= wxPREVIEW_PRINT;
m_controlBar = new wxMyPreviewControlBar(m_printPreview, buttons, this);
m_controlBar->CreateButtons();
}
//wxPREVIEW_TOEXCEL | wxPREVIEW_TOPDF 这两个就是开始时候定义的ButtonFlags
6、最后就可以用带有新按钮的打印预览窗口了。总觉我的办法比较麻烦不知道有没有省事儿点儿途径,如果哪位前辈看到了请指点我一下。刚学wxWidgets不久,苦于没有资料(我说的是中文的,其实E文的资料也不算多)郁闷……