Bildschirmbreite in Druckerbreite umrechnen



  • Hallo!

    Ich habe ein Listcontrol, dessen Inhalt ich drucken will.
    Da der User die Spalten schon so einstellen wird, dass man alles Lesen kann, will ich die aktuelle Spaltenbreite nehmen.

    Das ist aber zu schmal. 😞

    Was habe ich vergessen?

    // Die Listcontrolzeile ausgeben
    		int x = nOffset;
    		for (int nSpalte = 0; nSpalte < 4; nSpalte++)
    		{
    			dc.TextOut(x, y, m_lscArtikel.GetItemText(i, nSpalte));
    			x += m_lscArtikel.GetColumnWidth(nSpalte);
    		}
    


  • Ein Bildschirm hat in der Regel nur 72 dbi
    Ein Drucker aber sehr viel mehr.



  • Und nun?

    Muss ich das jetzt per Dreisatz umrechnen oder wie? Muss ja nicht superexakt sein, aber so halbwegs passen.
    Ich dachte es reicht, den MapMode zu ändern. 😞



  • Das ist etwas komplexer als du denkst. Es gibt aber bereits fertige klassen dafür.



  • Danke für das Stichwort - der Ausdruck lag oben auf meinem Monitor: CPrintListCtrl 😃

    Das kann aber zu viel, außerdem kriege ich das "Klassenzusammenführen" irgendwie nicht hin.

    Habe die Funktion gefunden und auf meine Klasse angepasst:

    int CKasseView::ScreenToPrinterWidth(int f_nBreit, CDC& f_dcDrucker)
    {
    	CDC* hDc = GetDC();
    
    	if (!hDc)
    	{
    		return -1;
    	}
    
    	int nDruckerBreite = (f_nBreit * GetDeviceCaps(f_dcDrucker.m_hDC, LOGPIXELSX)) / GetDeviceCaps(hDc->m_hDC, LOGPIXELSX);
    
    	ReleaseDC(hDc);
    	return nDruckerBreite;
    }
    

    Edit: Fehler gefunden... 🙂



  • So, ich habe das jetzt mit Hilfe des Vorschau-Druckers schön gemacht, so wie es sein soll.
    Es passte auf Din-A4 Hochformat und alles war lesbar.

    Nun habe ich das auf dem echten Drucker (Ricoh Ap206) gedruckt und es ist zu breit. 😡
    Was ist da falsch? 😞

    Ideen? Suchansätze? Andere Lösungen?

    PS: (Edit) Im Debugger habe ich jetzt herausgefunden, dass der Vorschaudrucker 360 DPI hat und der echte 600. Das dürfte der Fehler sein.
    Also ist die Formel für mich untauglich, denn ich muss unabhängig von den Dpi sein und auch von der Seitenbreite. Denn das soll wohl auch auf Bondruckern gedruckt werden, das habe ich aber erst nach dem Beitrag von oben erfahren.

    Naja, ich versuche jetzt mal, irgendwie mit dem Verhältnis "Breite Listcontrol" - Seitenbreite glücklich zu werden.

    Bin aber weiter für Lösungen offen! 🙂

    So, erster Versuch mit der neuen Umrechnung und schon geht es nicht mal mehr auf dem Vorschaudrucker. 😞

    int CKasseView::ScreenToPrinterWidth(int f_nBreit, CDC& f_dcDrucker)
    {
    	// Breite des Listcontrol
    	CRect rectHelp;
    	m_lscArtikel.GetWindowRect(rectHelp);
    	const int nListCtrl = rectHelp.right - rectHelp.left;
    	// Seitenbreite
    	const int nSeitenbreite = f_dcDrucker.GetDeviceCaps(HORZRES);
    
    	int nDruckerBreite = (f_nBreit * nSeitenbreite) / nListCtrl;
    	return nDruckerBreite;
    }
    


  • So, habe es hinbekommen! 🙂

    int CKasseView::ScreenToPrinterWidth(int f_nBreit, CDC& f_dcDrucker)
    {
    	// Breite des Listcontrol
    	CRect rectHelp;
    	m_lscArtikel.GetWindowRect(rectHelp);
    	const int nListCtrl = rectHelp.right - rectHelp.left;
    
    	// Seitenbreite
    	const int nSeitenbreite = f_dcDrucker.GetWindowExt().cx;
    
    	int nDruckerBreite = (f_nBreit * nSeitenbreite) / nListCtrl;
    
    	return nDruckerBreite;
    }
    

    @Unix-Tom: Es ist doch ein einfacher Dreisatz. :p
    Am längsten habe ich suchen müssen, wie ich an die Seitenbreite komme.

    Die zugrunde liegende Formel ist ganz einfach:
    (Druckerbreite / Monitorbreite) = (Seitenbreite / Listctrlbreite) 🙂


Anmelden zum Antworten