Ausdrucken von Steuerelementen



  • Hallo!

    Ich habe in längerer Arbeit es endlich geschafft, dass die Oberfläche eines ActiveX-Elements gedruckt wird. Jetzt hab ich aber noch ein Problem. Er druckt zwar genauso groß wie die Fläche ist, allerdings druckt er auch alle anderen Objekte, die vor dieser FLäche sind. Liegt die Fläche außerhalb des Fensters, so wird der Teil schwarz dargestellt beim Drucken! D.h. er arbeitet mit Screenshots, allerdings würde ich gerne immer den Inhalt dieser Fläche ausdrucken, egal ob was davor liegt oder es außerhalb des Sichtbaren angeordnet ist.

    Kann mir da jemand helfen? Ich würde mich freuen! 🙂

    Weiter unten ist der Quelltext zu finden!

    Vielen Dank!

    LRESULT CMainDlg::printDiagramm()
    {
    HRESULT hr;
    DOCINFO di;
    DWORD dwError;
    HWND hWnd = wDiag;
    CPrintDialog tmp_CPD(FALSE, PD_PAGENUMS | PD_USEDEVMODECOPIES);
    tmp_CPD.GetDefaults();
    DEVMODE* dm=(DEVMODE*) GlobalLock(tmp_CPD.m_pd.hDevMode);
    dm->dmFields|=DM_ORIENTATION;
    dm->dmOrientation=DMORIENT_LANDSCAPE;
    tmp_CPD.m_pd.Flags &= ~PD_RETURNDEFAULT;
    GlobalUnlock(tmp_CPD.m_pd.hDevMode);
    
    if (tmp_CPD.DoModal() != IDOK)
    {	  
    return -1;
    }
    
    CDC printerDC = tmp_CPD.GetPrinterDC(); // bool GetPrinterInfo(HANDLE hPrinter)
    
    CAxWindow m_wndView = wDiag;
    ::ShowWindow(m_wndView, SW_SHOW);
    CDC screenDC = m_wndView.GetWindowDC();
    CRect screenRect;	
    m_wndView.GetClientRect(&screenRect);
    
    int iPrinterW = printerDC.GetDeviceCaps(HORZRES);
    int iPrinterH = printerDC.GetDeviceCaps(VERTRES);
    int iScreenW  = screenRect.Width();
    int iScreenH  = screenRect.Height()-33;
    
    HDC memDC = CreateCompatibleDC( printerDC );
    
    di.cbSize = sizeof(DOCINFO) ;
    bstr_t printName = "MaximusGLT";
    di.lpszDocName = printName;
    di.lpszOutput = NULL ;
    
    hr = printerDC.StartDoc(&di) ; 
    hr = printerDC.StartPage();
    screen contents
    
    hr = printerDC.StretchBlt( 0, 0, iPrinterW, iPrinterH, screenDC, 0, 0, (iScreenW), (iScreenH), SRCCOPY );
    
    dwError = GetLastError();
    hr = printerDC.EndPage();
    hr = printerDC.EndDoc();
    
    m_wndView.BringWindowToTop();
    m_wndView.FlashWindow(FALSE);
    m_wndView.Invalidate(TRUE);
    m_wndView.RedrawWindow();
    m_wndView.SetFocus();
    
    return 0;
    }
    


  • Mir würde es auch schon weiterhelfen, wenn ich wüsste wie ich von meinem kompletten Programm einen Screenshot ausdrucken könnte, aber der Screenshot müsste alles beinhalten, auch wenn ein Teil vielleicht nicht auf dem Bildschirm zu sehen ist?

    Mit der MFC wüsste ich wie es geht, aber ich muss es mit ATL, WTL bzw. der API machen!

    Vielen Dank für jeden noch so kleinen Tipp!


Log in to reply