We help IT Professionals succeed at work.

We've partnered with Certified Experts, Carl Webster and Richard Faulkner, to bring you a podcast all about Citrix Workspace, moving to the cloud, and analytics & intelligence. Episode 2 coming soon!Listen Now

x

read Windows Font Size

mosi
mosi asked
on
Medium Priority
420 Views
Last Modified: 2013-12-02
In a Delphi program I display text from a textfile, with
a specifiable font size on a window.
The problem off course is, that when someone on the network
has changed his
Start->Settings->Control Panel->Display->Setting->Font Size
setting to Large fonts, he can't read all of the text.

My question is:

  How can I determiner this setting in delphi (remember
  a Windows APi call, but I can get the use of parameters
  right, so please give a example procedure).

  How can I map these large fonts to small fonts
  ,calculate the font size to use (
  I mean I want the person with the large fonts settings
  to see the same size of the text in my programwindow,
  he would see if you used the small fonts settings).
  Can I just divide a certain font size by half?
  Is this a constant?

 
Comment
Watch Question

Can't you use TFont.size property for calculating You'r display ?
When text is (in example) in TMemo then user can use ScrollBars so tell more what happened and what you need because i can't understand.

Commented:
You want the text metrics for the font.

VAR
  DC: HDC;
  SaveFont: HFont;
  Metrics: TTextMetric;
 

DC := GetDC(0);
SaveFont := SelectObject( DC, Font.Handle);
GetTextMetrics(DC, Metrics );
SelectObject(DC, SaveFont);
ReleaseDC(0, DC);

Now, you have use of the metrics, like:

MyHeight := Metrics.tmHeight + 3;

Hope this helps.

Ian C.

Author

Commented:

Thanx ICAMPBEL, but I rejected your answer, althrough it probably contains part of the answer, but it is not so complete that I can use it. Please clarify!

I tried your code, and when Windows 95 on this PC  is using The large font setting, I get a Metrics.tmHeight value of 16. When it is using
The small font setting, I get a Metrics.tmHeight value of 13.
Will this always be the case, on all PC's, not depending on other
settings such as resolution e.g. 1024*768 in stead of 800 * 600, or other videodrivers?

I explain again what I what to do (simplified):

I display a window on the screen which always has a width of 600 pixels.
In this window is a label. The program reads the text to display on this
label and it fontsize from the commandline.
Suppose, I have a text to display which exactly fits into that window,
when I'm using the Use small fonts setting in Windows 95, only
a part will be visible when I'm using the Use large fonts settings.
(I do not want  use scrolling),

Therefore I need a function like this;

FontSizeFromCommandline (integer) is known, e.g. 14

FontSizeToUse:= CalculateFontSizeToUse(FontSizeFromCommandline);

CalculatieFontSizeToUse must do 2 things.

 1) Detect whether the Windows 95/NT setting of the fonts to use
    is Use Large Fonts or Use Small Fonts

 2a) When the setting is Use Small Fonts: return     FontSizeFromCommandline
    (in fact: do nothing, this value is already known).
   
 2b) When the setting is Use Large Fonts: calculate a fontsize,
    depending on FontSizeFromCommandline, such that exactly the
    same text will fit onto (the same line on) the window, as if the
    setting would be Use Small Fonts.













 

Author

Commented:
Adjusted points to 110
Use the GetSysFont function from the following unit to determine the 6 designated system font:

{ ------------------------------------------------------------------------- }
{ Description:                                                              }
{    Retrieves fonts assigned to the system screen elements.                }
{                                                                           }
{ Declaration:                                                              }
{    Function GetSysFont(FontParam: TSysFont; var ResFont: TFont): Boolean; }
{                                                                           }
{ Parameters:                                                               }
{    FontParam - Enumerated type that specifies the system font to          }
{    retrieve. This is one of the following values: sfCaptionFont,          }
{    sfSmCaptionFont, sfMenuFont, sfStatusFont, sfMessageFont, sfIconFont.  }
{                                                                           }
{    ResFont - A TFont variable that can be used to store the resulting     }
{    TFont object.                                                          }
{ ------------------------------------------------------------------------- }
unit SysFont;

interface

Uses
      SysUtils, Windows, Graphics;

type
       TSysFont = (sfCaptionFont, sfSmCaptionFont, sfMenuFont,
                  sfStatusFont, sfMessageFont, sfIconFont);


Function GetSysFont(FontParam: TSysFont; var ResFont: TFont): Boolean;
procedure TFontFromLogFont(const LogFont: TLogFont; var NewFont: TFont);

implementation

{ Gets the System font setting of the passed TSysFont parameter }
Function GetSysFont(FontParam: TSysFont; var ResFont: TFont): Boolean;
var
      TempNonClientMetrics: TNonClientMetrics;
      TempLogFont: TLogFont;
      ret: boolean;
begin
      Result := false;
      If FontParam = sfIconFont then
            { The IconFont is retreived with a different method
                  than all the other system fonts }
            ret := SystemParametersInfo(SPI_GETICONTITLELOGFONT,
                        SizeOf(TempLogFont), @TempLogFont, 0)
      else
            begin
                  TempNonClientMetrics.cbSize := SizeOf(TempNonClientMetrics);
                  ret := SystemParametersInfo(SPI_GETNONCLIENTMETRICS, 0,
                              @TempNonClientMetrics, 0);
            end;

      { If call to SystemParametersInfo() not successful then exit}
      If not ret then exit;

      { Load appropriate TempNonClientMetrics field into TempLogFont }
      case FontParam of
            sfCaptionFont:
                  TempLogFont := TempNonClientMetrics.lfCaptionFont;
            sfSmCaptionFont:
                  TempLogFont := TempNonClientMetrics.lfSmCaptionFont;
            sfMenuFont:
                  TempLogFont := TempNonClientMetrics.lfMenuFont;
            sfStatusFont:
                  TempLogFont := TempNonClientMetrics.lfStatusFont;
            sfMessageFont:
                  TempLogFont := TempNonClientMetrics.lfMessageFont;
      end;

      { Convert TempLogFont into a TFont }
      TFontFromLogFont(TempLogFont, ResFont);
      Result := true;
end;

{ Converts a LogFont structure to a Delphi TFont }
procedure TFontFromLogFont(const LogFont: TLogFont; var NewFont: TFont);
var
      Style: TFontStyles;
begin
      with LogFont do
      begin
            NewFont.Name := lfFaceName;
            NewFont.Height := lfHeight;
            Style := [];

            if lfWeight > FW_REGULAR then Include(Style, fsBold);
            if lfItalic <> 0 then Include(Style, fsItalic);
            if lfUnderline <> 0 then Include(Style, fsUnderline);
            if lfStrikeOut <> 0 then Include(Style, fsStrikeOut);

            NewFont.Style := Style;
      end;
end;

end.

Not the solution you were looking for? Getting a personalized solution is easy.

Ask the Experts

Author

Commented:
Thanx.
I accept your answer, although I guess I still have to
work out some things.
Access more of Experts Exchange with a free account
Thanks for using Experts Exchange.

Create a free account to continue.

Limited access with a free account allows you to:

  • View three pieces of content (articles, solutions, posts, and videos)
  • Ask the experts questions (counted toward content limit)
  • Customize your dashboard and profile

*This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

OR

Please enter a first name

Please enter a last name

8+ characters (letters, numbers, and a symbol)

By clicking, you agree to the Terms of Use and Privacy Policy.