Verschieden Grösse bei unterschiedlichen Druckern



  • Moin, moin,

    hab ein Problem mit unten stehender Druckfunktion (stark vereinfacht auf das wesentliche).
    Auf meinem System druckt er einwandfrei in der Grösse die ich gern hätte, als ich es aber auf einem anderen Rechner mit Canon-Drucker probierte druckte er es nur auf halber Grösse, quasi als wäre Papiereinstellung DinA5 eingestellt. Auf einem weiteren Rechner wars OK und wieder ein anderer druckte es nur auf A6-Format aus.....
    Zusammengefasst:
    Win2k-System mit HP Deskjet 930 kein Problem
    Win98-System mit Canon BJC 3000 Druck auf A5-Grösse
    Win2k-System mit HP Deskjet 8210 (oder sowas, bin net 100% sicher) kein Problem
    Win2k-System mit HP PSC 1210 (auch net ganz sicher bei der Nummer) Druck auf A6-Grösse

    Druckertreiber sind alle auf A4 eingestellt und andere Programme haben keine Probleme, sprich also: wo ist mein Fehler oder wie schaff ich es das alle auf der gleichen Grösse drucken?

    void CDrucken::OnOK() 
    {
    	CDC pDC;
    
    	hilfsZaehler = 0;
    
    	CPrintDialog pd(FALSE,PD_ALLPAGES | PD_USEDEVMODECOPIES | PD_NOPAGENUMS | PD_HIDEPRINTTOFILE | PD_NOSELECTION, this);
    
    	if(pd.DoModal()==IDOK) {
    
    		pDC.Attach(pd.GetPrinterDC());
    
    		UpdateData(true);
    
    		DOCINFO Job;
    		Job.cbSize = sizeof(Job);
    		Job.lpszDocName = "Urkunde";
    		Job.lpszOutput = NULL;
    		Job.lpszDatatype = NULL;
    		Job.fwType = NULL;
    
    		pDC.StartDoc(&Job);
    
    		CFont fNormalFont;
    
    		fNormalFont.CreateFont(110,0,0,0,FW_REGULAR,0,0,0,DEFAULT_CHARSET,OUT_CHARACTER_PRECIS,CLIP_CHARACTER_PRECIS,DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, "Times");
    
    		pDC.StartPage();
    
    		pDC.SelectObject(&fNormalFont);
    
    		pDC.TextOut(m_dRandlinks+25, m_dRandoben-120,m_uTitel);
    
    		pDC.EndPage();
    
    		pDC.EndDoc();
    		pDC.DeleteDC(); 
    	}
    
    	CDialog::OnOK();
    }
    


  • Hi!
    Kann es sein, dass Du vielleicht die unterschiedlichen Auflösungen der Drucker nicht berücksichtigt hast?
    Eine Darstellung die bei 600 dpi formatfüllend ist, wird bei 1200 dpi entsprechend kleiner...
    Den bedruckbaren Bereich in Pixeln holen:

    int nPrnWidth	= m_dc.GetDeviceCaps(HORZRES);
    int nPrnHeight	= m_dc.GetDeviceCaps(VERTRES);
    ...
    

    Die Schriftgröße an die aktuelle Auflösung anpassen:

    LOGFONT LogFont;
    LogFont.lfHeight	= -MulDiv(10, GetDeviceCaps(m_dc,LOGPIXELSY), 72);
    ...
    

    Gruss T. 🙂



  • Hmmm, hast Recht, hab gerade bei meinem Drucker die Auflösung hochgestellt und prompt wurde es kleiner gedruckt....

    Nun stürzt er aber immer ab wenn ich drucken will, ich denke mal das die Verknüpfung des Logfonts mit dem TextOut net funktioniert... weiss jemand wie ich den Text dann stattdessen ausgeben muss oder was ich sonst falsch mache?

    int nPrnWidth    = pDC.GetDeviceCaps(HORZRES); 
    		int nPrnHeight    = pDC.GetDeviceCaps(VERTRES);
    
    		LOGFONT LogFont;
    
    		LogFont.lfHeight    = -MulDiv(10, GetDeviceCaps(pDC,LOGPIXELSY), 72);
    		LogFont.lfWidth = 0; 
    		LogFont.lfEscapement = 0; 
    		LogFont.lfOrientation = 0; 
    		LogFont.lfWeight = 0; 
    		LogFont.lfItalic = false; 
    		LogFont.lfUnderline = 0; 
    		LogFont.lfStrikeOut = 0; 
    		LogFont.lfCharSet = ANSI_CHARSET; 
    		LogFont.lfOutPrecision = OUT_TT_PRECIS; 
    		LogFont.lfClipPrecision = CLIP_DEFAULT_PRECIS; 
    		LogFont.lfQuality = DEFAULT_QUALITY; 
    		LogFont.lfPitchAndFamily = DEFAULT_PITCH | FF_SWISS; 
    		lstrcpy (LogFont.lfFaceName, "Times");
    
    		fNormalFont.CreateFontIndirect(&LogFont);
    
    		pDC.StartPage();
    
    		pDC.SelectObject(&fNormalFont);
    
    		pDC.TextOut(m_dRandlinks+25, m_dRandoben-120,m_uTitel);
    ...
    


  • Sooo, hab den Fehler gefunden, lag am

    int nPrnWidth    = pDC.GetDeviceCaps(HORZRES); 
            int nPrnHeight    = pDC.GetDeviceCaps(VERTRES);
    

    das mochte er net und hat deshalb Abstürze verursacht...
    hab aber nun eine Lösung für mein Problem gefunden:
    ich errechne das Verhältnis indem ich

    x = GetDeviceCaps(pDC,LOGPIXELSY) / 300;
    

    setze, meine Einstellungen basieren ja alle auf eine 300er Auflösung wie ich festgestellt habe....
    nun multiplizier ich alle Grössen und Randeinstellungen mit x und somit passt sich das ganze immer an die jeweilige Druckerauflösung an....
    Zumindest zeigen das meine ersten Tests, oder hab ich da was übersehen?

    Ansonsten aber so oder so: Vielen Dank Theo, ohne deine Hilfe hät ichs net gepackt 🙂


Anmelden zum Antworten