你能在wxWidgets中打印一个wxWindow吗?

时间:2012-05-01 11:20:24

标签: printing wxwidgets

我正在使用wxWidgets开发一个Windows程序。我正在尝试实现一个打印功能,它将打印wxPanel(或wxWindow)。 wxWidgets有一个非常方便的类,如果你画成DC,那就可以做到这一点。

有没有办法让wxWidgets在DC中绘制wxPanel或wxWindow? 我尝试使用HandlePrintClient(响应WM_PRINTCLIENT)函数,但这只是绘制背景。 我还尝试创建一个打印机DC,并通过与HandlePrint类似的功能发送它,但wxWidget的东西似乎与BeginPrint紧密结合。

有什么办法可以做我想做的事吗?也许已经编写了一个类来解决wxScrolledWindow并将其发送到打印机?该窗口将有其他控件和窗口,如上面的wxGrid。

1 个答案:

答案 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;
    }

};