0

wxWidgets を使用して Windows 用のプログラムを開発しています。wxPanel (または wxWindow) をプリンターに出力する印刷機能を実装しようとしています。wxWidgets には、DC に描画する場合にこれを行う便利なクラスがあります。

wxWidgets で DC に wxPanel または wxWindow を描画する方法はありますか? (WM_PRINTCLIENT に応答して) HandlePrintClient 関数を使用しようとしましたが、これは背景を描画するだけです。また、プリンター DC を作成し、HandlePrint と同様の関数を介して送信しようとしましたが、wxWidget は BeginPrint と密接に結合しているようです。

私がやりたいことをする方法はありますか?おそらく、wxScrolledWindow をタックしてプリンターに送信するクラスが既に作成されているのでしょうか? ウィンドウには、wxGrid のような他のコントロールとウィンドウがあります。

4

1 に答える 1

1

最後に、必要なものを printDC に描画する方がおそらく簡単です。ただし、注意が必要な場合は、BLIT を使用して、すべてを再描画することなく、パネルに表示されているものを PrintDC にコピーできます。

したがって、wxPrintout::OnPrintPage のオーバーライドでは、次のように記述できます。

    wxClientDC frameDC( wxGetApp().GetTopWindow() );
    GetDC()->StretchBlit(0,0,5000,5000,
        &frameDC, 0, 0, 500,500 );

これにより、アプリケーションの最上位ウィンドウに表示されるすべてが 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 に BLIT し、次に MemoryDC から printerDC に BLIT することです。

これらの行に沿ったもの:

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

};
于 2012-05-01T19:57:16.290 に答える