Printing 您可以在wxWidgets中打印wxWindow吗?
我正在使用wxWidgets为windows开发一个程序。我正在尝试实现一个打印功能,将wxPanel(或wxWindow)打印到打印机上。wxWidgets有一个很好的方便类,如果您将其引入DC,它可以实现这一点 有没有办法让wxWidgets在DC中绘制wxPanel或wxWindow? 我尝试使用HandlePrintClient(响应WM_PRINTCLIENT)函数,但这只是绘制背景。 我还尝试创建一个打印机DC,并通过与HandlePrint类似的函数发送它,但wxWidget似乎与BeginPrint紧密结合Printing 您可以在wxWidgets中打印wxWindow吗?,printing,wxwidgets,Printing,Wxwidgets,我正在使用wxWidgets为windows开发一个程序。我正在尝试实现一个打印功能,将wxPanel(或wxWindow)打印到打印机上。wxWidgets有一个很好的方便类,如果您将其引入DC,它可以实现这一点 有没有办法让wxWidgets在DC中绘制wxPanel或wxWindow? 我尝试使用HandlePrintClient(响应WM_PRINTCLIENT)函数,但这只是绘制背景。 我还尝试创建一个打印机DC,并通过与HandlePrint类似的函数发送它,但wxWidget似乎与
有什么方法可以做我想做的事吗?也许已经编写了一个类,该类将固定wxScrolledWindow并将其发送到打印机?该窗口将具有其他控件和窗口,例如其上的wxGrid。最后,可能更容易将所需内容绘制到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);
一个更好的方法是在弹出打印预览之前将帧显示点显到memoryDC中,然后从memoryDC点显到printerDC
大致如下:
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;
}
};
我明白你的意思,但我希望能够打印出甚至没有显示的东西。它将是伟大的,能够发送一个DC到绘图例程,并让它填补DC。我不想自己绘制,因为这样我会重写控件(幸运的是,在这个例子中,它主要是wxGrids),绘制我不能利用的代码似乎很遗憾。