我正在使用wxWidgets开发一个Windows程序。我正在尝试实现一个打印功能,它将打印wxPanel(或wxWindow)。 wxWidgets有一个非常方便的类,如果你画成DC,那就可以做到这一点。
有没有办法让wxWidgets在DC中绘制wxPanel或wxWindow? 我尝试使用HandlePrintClient(响应WM_PRINTCLIENT)函数,但这只是绘制背景。 我还尝试创建一个打印机DC,并通过与HandlePrint类似的功能发送它,但wxWidget的东西似乎与BeginPrint紧密结合。
有什么办法可以做我想做的事吗?也许已经编写了一个类来解决wxScrolledWindow并将其发送到打印机?该窗口将有其他控件和窗口,如上面的wxGrid。
答案 0 :(得分:1)
最后,可能更容易将您想要的内容绘制到printDC中。但是,小心谨慎,您可以使用BLIT将面板中显示的内容复制到PrintDC中,而无需重新绘制所有内容。
因此,在你对wxPrintout :: OnPrintPage的覆盖中你可以这样写:
wxClientDC frameDC( wxGetApp().GetTopWindow() );
GetDC()->StretchBlit(0,0,5000,5000,
&frameDC, 0, 0, 500,500 );
这会将应用程序顶级wondow中显示的所有内容复制到printerDC中。
障碍是打印预览窗口弹出时会弹出顶级框架内容。如果您有一个大显示器和一个小应用程序窗口,您可以安排事情,使它们不重叠
void MyFrame::OnPrint(wxCommandEvent& )
{
wxPrintPreview *preview = new wxPrintPreview(new MyPrintout(this), new MyPrintout(this));
wxPreviewFrame *frame = new wxPreviewFrame(preview, this,
"Demo Print Preview",
wxPoint(600, 100), // move preview window out of the way
wxSize(500, 500));
//frame->Centre(wxBOTH);
frame->Initialize();
frame->Show(true);
更好的方法是在弹出打印预览之前将帧显示器BLIT到memoryDC,然后从MemoryDC BLIT到打印机DC。
这些方面的东西:
void MyFrame::OnPrint(wxCommandEvent& )
{
// save the display before it is clobbered by the print preview
static wxMemoryDC memDC;
static wxBitmap bitmap(500,500);
memDC.SelectObject( bitmap );
wxClientDC frameDC( wxGetApp().GetTopWindow() );
memDC.Blit(0,0,5000,5000,
&frameDC, 0, 0 );
wxPrintPreview *preview = new wxPrintPreview(new MyPrintout(memDC), new MyPrintout(memDC));
wxPreviewFrame *frame = new wxPreviewFrame(preview, this,
"Demo Print Preview",
wxPoint(600, 100), // move preview window out of the way
wxSize(500, 500));
frame->Centre(wxBOTH);
frame->Initialize();
frame->Show(true);
}
然后
class MyPrintout : public wxPrintout
{
wxMemoryDC & myMemDC;
public:
MyPrintout( wxMemoryDC & memDC)
: myMemDC( memDC )
{
}
bool OnPrintPage( int PageNum )
{
// copy saved dispay to printer DC
GetDC()->StretchBlit(0,0,5000,5000,
&myMemDC, 0, 0, 500,500 );
return true;
}
};