2012-05-01 10 views
0

私はwxWidgetsを使ってウィンドウ用のプログラムを開発しています。私は、プリンタにwxPanel(またはwxWindow)を印刷する印刷機能を実装しようとしています。 wxWidgetsには、DCに描画する場合に便利なクラスがあります。wxWidgetsでwxWindowを印刷できますか?

wxWidgetsでDCにwxPanelまたはwxWindowを描画する方法はありますか? (WM_PRINTCLIENTに応答して)HandlePrintClientを使用しようとしましたが、これはバックグラウンドを描画するだけです。 私はまた、プリンタDCを作成して、それと同様の機能をHandlePrintに送信しようとしましたが、wxWidgetのものはBeginPrintと密接に結びついているようです。

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

答えて

1

最後に、あなたが望むものをprintDCに描画する方が簡単かもしれません。ただし、BLITを使用して、パネルに表示されているものをすべてを再描画することなくPrintDCにコピーすることができます。

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

これはwondow printerDCにトップレベルのアプリケーションに表示されるすべてのものをコピーします。

ので、wxPrintout ::のオーバーライドであなたはこのような何かを書くことができますOnPrintPage。

印刷プレビューウィンドウは、ポップアップするときにトップレベルのフレームの内容を消してしまう傾向があります。あなたが大規模なモニターと小さなアプリケーションのウィンドウを持っている場合、あなたは彼らが

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

}; 
+0

私はあなたが言っているのか理解が、私はしても表示されていないものを印刷できるようにしたいと思います。ドロールーチンにDCを送り、DCを満たすことができるのは素晴らしいことです。コントロールを書き直すことになるので(私は幸いなことに、これは主にwxGridsです)、私が利用できない描画コードを持つことは残念です。 – ChrisMcB

関連する問題