Printing 您可以在wxWidgets中打印wxWindow吗?

Printing 您可以在wxWidgets中打印wxWindow吗?,printing,wxwidgets,Printing,Wxwidgets,我正在使用wxWidgets为windows开发一个程序。我正在尝试实现一个打印功能,将wxPanel(或wxWindow)打印到打印机上。wxWidgets有一个很好的方便类,如果您将其引入DC,它可以实现这一点 有没有办法让wxWidgets在DC中绘制wxPanel或wxWindow? 我尝试使用HandlePrintClient(响应WM_PRINTCLIENT)函数,但这只是绘制背景。 我还尝试创建一个打印机DC,并通过与HandlePrint类似的函数发送它,但wxWidget似乎与

我正在使用wxWidgets为windows开发一个程序。我正在尝试实现一个打印功能,将wxPanel(或wxWindow)打印到打印机上。wxWidgets有一个很好的方便类,如果您将其引入DC,它可以实现这一点

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


有什么方法可以做我想做的事吗?也许已经编写了一个类,该类将固定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),绘制我不能利用的代码似乎很遗憾。