DrawIconEx und Drucken



  • Hallo!

    Ich versuche ein Icon zu drucken bzw in die Vorschau zu schicken, was allerdings nicht ganz klappt:

    m_hIconTemp = (HICON) LoadImage(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_ICON_TEMP),IMAGE_ICON,16,16,0);	
    
    	if ( bDruck == true)
    	{
    		pDC->LPtoDP (&pointIcon);
    		pointIcon.x -= 8;
    		pointIcon.y -= 8;
    		int nPreMapMode = pDC->SetMapMode ( MM_TEXT );	// Vorher: MM_TWIPS
    		// Zeichnen des Icons in 16x16
    		BOOL bDraw = DrawIconEx (pDC->GetSafeHdc(),pointIcon.x,pointIcon.y,m_hIconTemp,16, 16, 0, NULL, DI_NORMAL);
    		pDC->SetMapMode ( nPreMapMode );
    	}
    

    LPtoDP liefert mir mir die richigen Koordinaten aber die Breite des Icons passt wohl nicht mehr. Sprich: Die Werte: "pointIcon.x bzw. y -= 8;" bzw "DrawIconEx (...,16,16,...)" passen nicht mehr (weil es Pixel sind). Wenn ich die per Hand erhöhe erscheint das Icon.

    Welche Faktor nutzt man da? Stehe grad auf dem Schlauch!
    Weiss jemand Rat?
    Danke!



  • Von wo aus rufst du denn diesen Code auf? Bist du dir sicher, dass pDC den Printer-DC enthält?
    Ich hatte kürzlich das Problem mit dem Skalieren von Schriften. Bei Codeproject hab ich folgendes gefunden:

    ASSERT(pDC->GetMapMode() == MM_TEXT); 
    LOGFONT  lf;
    ::ZeroMemory(&lf, sizeof(LOGFONT));
    int nPrintDpi = pDC->GetDeviceCaps(LOGPIXELSY);
    lf.lfHeight = -MulDiv(10, pDC->GetDeviceCaps(LOGPIXELSY), 72);
    
    // Convert lfHeight from print units to screen units
    // because the CFontDialog class uses Screen units
    HDC hDC = GetDC(m_pView->m_hWnd);
    int nScreenDpi = GetDeviceCaps(hDC, LOGPIXELSY);
    lf.lfHeight = MulDiv(lf.lfHeight, nScreenDpi, nPrintDpi);
    
    lstrcpy(lf.lfFaceName, _T("Arial"));    
    CFontDialog dlg(&lf, CF_PRINTERFONTS, pDC);
    if (dlg.DoModal() == IDOK)
    {    
         m_strFont = dlg.GetFaceName();    
         m_nPointSize = dlg.GetSize() / 10;
    }
    

    Dort wird der Skalierungsfaktor zwischen Screen und Printer (Zeile 11) ermittelt. Vielleicht hilft dieser Ansatz dir weiter.



  • @Andy
    Danke schon mal für den Tipp!! Ich versuche es die Tage auszuprobieren!

    Zu deiner Frage wegen dem pDC:

    Es ist das übergebene aus der Methode
    void CView::OnPrint(CDC* pDC, CPrintInfo* pInfo)

    Das pDC ist ein CPreviewDC:
    m_pfnGetBaseClass = 0x51f639e0 CPreviewDC::_GetBaseClass(void)


Log in to reply