Windows Schriftgrösse lesen und setzen



  • Hallo.

    Ich habe eine DirectDraw (Vollbild) Anwendung und gebe da bissle TextOut aus.
    Jetzt passiert es aber das so mancher Nutzer die Windows Schriftgrösse verändert hat und es im Programm zu unschönen Verschiebungen kommt.

    Kann man diese für das Programm auf Standard setzen und beim beenden zu dem vom Benutzer eingestellten Wert zurück?

    Über Hilfe würde ich mich freuen. Danke.



  • Du kannst dir auch die gewünschte Schrift mit CreateFont erstellen und dann in deinen DC selektieren...



  • Das werde ich mal ausprobieren. Danke!



  • Ich habe grad nix zu tun und mal in die alte Quelle geschaut.

    //---------------------------------------------------------------------------
    void DirectDrawClass::DrawText(int startx, int starty, int ax, int ay, char *string,
    							   int Height, bool Bold, bool Italic, bool Underline,
    							   COLORREF TextColor, char *FontName, LPDIRECTDRAWSURFACE7 lpDDSurf)
    {
    	HDC hDC;
    	HFONT font;
    
        // DC für die Oberfläche anfordern
        if(FAILED(lpDDSurf->GetDC(&hDC)))
    	{
    		Error("DC(Text) ist nicht verfügbar");
    		return ;
    	}
    
    	// Texthintergrund = TRANSPARENT
    	SetBkMode(hDC, TRANSPARENT);
    
    	// Textfarbe
    	SetTextColor(hDC, TextColor);
    
    	// Text linksbündig ausrichten
    	SetTextAlign(hDC, TA_LEFT);
    
    	font=CreateFont(-MulDiv(Height, GetDeviceCaps(hDC, LOGPIXELSY), 72), 0, 0, 0, FW_NORMAL, FALSE, FALSE, 0, SYMBOL_CHARSET, 
    	 			    OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH,
    					FontName);
    
    	SelectObject(hDC,font);
    
    	// Text ausgeben
    	TextOut(hDC,(startx+ax) * ASCIIbreite, (starty+ay) * ASCIIhoehe, string, strlen(string));
    
    	// Oberfläche wieder freigeben
    	lpDDSurf->ReleaseDC(hDC);
    	DeleteObject(font);
    }
    //---------------------------------------------------------------------------
    

    Was genau müsste ich den nun machen, das die Windows DPI Schriftgrösse nicht genommen wird, sondern die Standard 96dpi.... wenn du sagst es geht auch so.



  • Ich habe noch nen Beispiel ausm Internet probiert was leider auch nix brachte.

    //---------------------------------------------------------------------------
    // Text GDI (mit Winkel)
    void DirectDrawClass::DrawText(int startx, int starty, int ax, int ay, char *string,
    							   int Height, bool Bold, bool Italic, bool Underline,
    							   COLORREF TextColor, char *FontName, LPDIRECTDRAWSURFACE7 lpDDSurf)
    {
    	HDC hDC;
    	HFONT hFont;
    	HBITMAP hBmp;
    	RECT rctTemp;
    
        // DC für die Oberfläche anfordern
        if(FAILED(lpDDSurf->GetDC(&hDC)))
        {
            Error("DC(Text) ist nicht verfügbar");
    		return ;
        }
    
    	// Texthintergrund = TRANSPARENT
        SetBkMode(hDC, TRANSPARENT);
    
    	// Textfarbe
        SetTextColor(hDC, TextColor);
    
    	// Text linksbündig ausrichten
        SetTextAlign(hDC, TA_LEFT);
    
    	SetMapMode(hDC, MM_TEXT);
    	int nXDpi=GetDeviceCaps(hDC, LOGPIXELSX);
    	int nYDpi=GetDeviceCaps(hDC, LOGPIXELSY);
    	int nWidth=(int)(8.5*(float)nXDpi);
    	int nHeight=11*nYDpi;
    	hBmp=CreateCompatibleBitmap(hDC, nWidth, nHeight);
    
    	SelectObject(hDC, hBmp);
    	SetRect(&rctTemp, 0, 0, nWidth, nHeight);
    	FillRect(hDC, &rctTemp, (HBRUSH)GetStockObject(WHITE_BRUSH));
    
    	hFont=CreateFont(-MulDiv(12, nYDpi, 72), 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, ANSI_CHARSET, OUT_STRING_PRECIS, CLIP_STROKE_PRECIS, PROOF_QUALITY, DEFAULT_PITCH, FontName);
    
    	SelectObject(hDC, hFont);
    	SetRect(&rctTemp, (int)((float)nXDpi*0.5), (int)((float)nYDpi*0.5), nWidth-(int)((float)nXDpi*0.5), nHeight-(int)((float)nYDpi*0.5));
    
    	::DrawText(hDC, string, -1, &rctTemp, DT_LEFT|DT_TOP|DT_WORDBREAK);
    
    	DeleteObject(hBmp);
    	DeleteObject(hFont);
    	DeleteDC(hDC);
    
    	// Oberfläche wieder freigeben
        lpDDSurf->ReleaseDC(hDC);
    }
    //---------------------------------------------------------------------------
    

    Irgendeiner der weiss wie man es konstant bekommt?


Anmelden zum Antworten