read Windows Font Size

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?

 
LVL 1
mosiAsked:
Who is Participating?

[Product update] Infrastructure Analysis Tool is now available with Business Accounts.Learn More

x
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

mirek071497Commented:
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.
icampbe1Commented:
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.

mosiAuthor 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.













 
CompTIA Cloud+

The CompTIA Cloud+ Basic training course will teach you about cloud concepts and models, data storage, networking, and network infrastructure.

mosiAuthor Commented:
Adjusted points to 110
jackb022197Commented:
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.

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
mosiAuthor Commented:
Thanx.
I accept your answer, although I guess I still have to
work out some things.
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
Fonts Typography

From novice to tech pro — start learning today.