Bitmap unabhängig vom Druckertyp in bestimmter Größe drucken



  • Aus meiner Anwendung heraus soll Bitmap gedruckt werden. Diese Bitmap liegt als Datei (nicht als Ressource) vor. Jetzt soll die Bitmap nur halb so groß wie im Origial (also Breite/2 und Höhe/2) ausgedruckt werden. Mein Code dazu sieht wie folgt aus:

    void CDrucken2View::OnDraw(CDC* pDC)
    {
    	CDrucken2Doc* pDoc = GetDocument();
    	ASSERT_VALID(pDoc);
    	if (!pDoc)
    		return;
    
    	// TODO: Code zum Zeichnen der systemeigenen Daten hinzufügen
    
    	// Metrischen Abbildungsmodus einstellen
    	pDC->SetMapMode(MM_LOMETRIC);
    
    	// Client-Rechteck deklarieren
    	CRect rcClient;
    
    	// Gerätekontext auf Druckermodus testen
    	if (pDC->IsPrinting())
    	{
    		// Drucken, also Druckerrechteck verwenden
    		rcClient = m_rcPrintRect; //->M_rcPrintRect wind in der OnPrint mittels if (pInfo) m_rcPrintRect = pInfo->m_rectDraw;  geholt
    	}
    	else
    	{
    		// Kein Drucken, also genügt Client-Rechteck
    		GetClientRect(&rcClient);
    	}
    	// In logische Einheiten konvertieren
    	pDC->DPtoLP(&rcClient); 
    
        CDC memDC;
    	memDC.CreateCompatibleDC(pDC);
    	CBitmap* oldBitmap;
    	HBITMAP hBmp = (HBITMAP)::LoadImage(NULL,_T("Einstellungen\\BMP\\Logo_RGB.bmp"),IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);
    	CBitmap Logo;
    	Logo.Attach(hBmp);
    
    	oldBitmap = memDC.SelectObject(&Logo);
    
    	BITMAP bi;
    	Logo.GetBitmap(&bi);
    
    	pDC->StretchBlt(rcClient.left,rcClient.top,bi.bmWidth/2,bi.bmHeight/2,&memDC,0,0,bi.bmWidth,bi.bmHeight,SRCCOPY);	 
    	memDC.SelectObject(oldBitmap);
    }
    

    Mein Problem ist jetzt, dass dies nur im MM_TEXT-Modus klappt. Im MM_LOMETRIC ist es viel zu klein. Jetzt bin ich mir nicht ganz klar wie ich die Parameter von StretchBlt setzen muss bzw. wie ich die Bildgröße umrechnen muss.
    In einem 2. Schritt soll das Bild unabhängig vom Drucker immer in der gleichen Höhe (Breite müsste dann unter Wahrung des Seitenverhältnisses berechnet werden) gedruckt werden. Wie geht sowas?


  • Mod

    Dann musst Du auch angeben wie groß Dein Zielbereich sein soll.
    Und die Frage kann Dir wohl keiner vonuns beantworten, weil wir nicht wissen was es für eine Bitmap ist.
    So wie Du es machst wird 1 Pixel eben 0,1mm, d.h. 100pixel = 1cm.

    Deine Angabe: Halb so groß wie das Original verstehe ich darum auch nicht. Wie groß ist denn ein Pixel bei Dir? Mein Monitor steht auf 120DPI d.h. ein Pixel auf meinem Bildschirm ist. In meinem Fall auf dem Monitor etsprich ein Pixel also "virtuellen" 0,212mm.



  • Martin Richter schrieb:

    Dann musst Du auch angeben wie groß Dein Zielbereich sein soll.
    Und die Frage kann Dir wohl keiner vonuns beantworten, weil wir nicht wissen was es für eine Bitmap ist.
    So wie Du es machst wird 1 Pixel eben 0,1mm, d.h. 100pixel = 1cm.

    Deine Angabe: Halb so groß wie das Original verstehe ich darum auch nicht. Wie groß ist denn ein Pixel bei Dir? Mein Monitor steht auf 120DPI d.h. ein Pixel auf meinem Bildschirm ist. In meinem Fall auf dem Monitor etsprich ein Pixel also "virtuellen" 0,212mm.

    Mein Abbildungsmodus habe ich ja mit MM_LOMETRIC festgelegt. Hier entspricht eine logische Einheit etwa 0.1 mm. Wird eine Linie mit 10 logischen Einheiten gezeichnet, so wird auf dem Ausgabegerät die Linie etwa 1 mm lang. Meine Vorgabe ist jetzt, das Logo jetzt unabhängig vom Ausgabedevice 1,5 cm hoch darzustellen.
    Ich habe jetzt folgende Anpassung vorgenommen (hab ich aus dem Beispiel hier):

    BITMAP bi;
    Logo.GetBitmap(&bi);
    ptSize.cx=bi.bmWidth;
    ptSize.cy=bi.bmHeight;
    pDC->DPtoLP(&ptSize);
    int iNewHeight=150;
    int iNewWidth=iNewHeight*ptSize.cx/ptSize.cy;	//Skalieren
    ptOrg.cx=0;
    ptOrg.cy=0;
    memDC.DPtoLP(&ptOrg);
    
    pDC->StretchBlt(rcClient.right-iNewWidth,rcClient.top,iNewWidth,-iNewHeight,&memDC,ptOrg.cx,ptOrg.cy,bi.bmWidth,bi.bmHeight,SRCCOPY);	//Darstellung in der linken oberen Ecke
    

    Damit scheint es zu funktionieren. Was mir jetzt aber noch unklar ist: in dem Beispiel haben die noch memDC.SetMapMode(pDC->GetMapMode()) den Abbildungsmodus des Speicherkontextes gestellt. Allerdings funktioniert dann mein Beispiel nicht mehr. Ich dachte immer memDC.CreateCompatibleDC(pDC) würde auch der Abbildungsmodus mit übernommen, allerdings hat memDC immer noch MM_TEXT.
    Dann hab ich noch eine letzte Frage: wie kann man Tabstops in Zeichenketten ausgaben? Ich habs sowohl mit TextOut wie auch mit DrawText versucht...


Log in to reply