Q181944: HOWTO: Use API Functions to Retrieve System Font Information
Article: Q181944
Product(s): Microsoft FoxPro
Version(s):
Operating System(s):
Keyword(s): kbcode kbnokeyword kbvfp300 kbvfp500 kbvfp600
Last Modified: 09-AUG-1999
-------------------------------------------------------------------------------
The information in this article applies to:
- Microsoft Visual FoxPro for Windows, versions 3.0, 3.0b, 5.0, 5.0a, 6.0
-------------------------------------------------------------------------------
SUMMARY
=======
You can use the SystemParametersInfo() with the SPI_GETNONCLIENTMETRICS option
to obtain System font information. This is useful for getting information such
as the status bar, menu font, button caption name and size, the width of screen
borders and the scroll bar.
MORE INFORMATION
================
Copy the code given below into a program file and run the program. Running the
program produces a text file, NCMtest.txt, that contains the various font and
System information.
Here is the code:
* Example of calling SystemParametersInfo() with the
* SPI_GETNONCLIENTMETRICS option to retrieve System font information.
*
* This option requires a NONCLIENTMETRICS structure, defined as
* follows:
*
*cbSize
* Specifies the size of the structure, in bytes.
*
*iBorderWidth
*Specifies the thickness, in pixels, of the sizing border.
*
*iScrollWidth
*Specifies the width, in pixels, of a standard vertical scroll bar.
*
*iScrollHeight
*Specifies the height, in pixels, of a standard horizontal scroll bar.
*
*iCaptionWidth
*Specifies the width, in pixels, of caption buttons.
*
*iCaptionHeight
*Specifies the height, in pixels, of caption buttons.
*
*lfCaptionFont
*Contains information about the caption font.
*
*iSmCaptionWidth
*Specifies the width, in pixels, of small caption buttons.
*
*iSmCaptionHeight
*Specifies the height, in pixels, of small captions.
*
*iMenuWidth
*Specifies the width, in pixels, of menu bar buttons.
*
*iMenuHeight
*Specifies the height, in pixels, of a menu bar.
*
*lfMenuFont
*
*Contains information about the font used in menu bars.
*
*lfStatusFont
*Contains information about the font used in status bars.
*
*lfMessageFont
*Contains information about the font used in message boxes.
*
*
* Each of the 'lf' members requires a LOGFONT structure, which
* is defined as follows:
*
*lfHeight
*Specifies the height, in logical units, of the font's character cell or
*character. The character height value (also known as the em height) is
*the character cell height value minus the internal-leading value. The
*font mapper interprets the value specified in lfHeight in the following
*manner:
*
*Value Meaning:
*> 0 The font mapper transforms this value into device units and
* matches it against the cell height of the available fonts.
*0 The font mapper uses a default height value when it searches
* for a match.
*< 0 The font mapper transforms this value into device units and
* matches its absolute value against the character height of the
* available fonts.
*
*For all height comparisons, the font mapper looks for the largest font
*that does not exceed the requested size.
*This mapping occurs when the font is used for the first time.
*
*
*lfWidth
*Specifies the average width, in logical units, of characters in the
*font. If lfWidth is zero, the aspect ratio of the device is matched
*against the digitization aspect ratio of the available fonts to find
*the closest match, determined by the absolute value of the difference.
*
*lfEscapement
*Specifies the angle, in tenths of degrees, between the escapement
*vector and the x-axis of the device. The escapement vector is parallel
*to the base line of a row of text.
*
*lfOrientation
*Specifies the angle, in tenths of degrees, between each character's
*base line and the x-axis of the device.
*
*lfWeight Specifies the weight of the font in the range 0 through 1000.
*For example, 400 is normal and 700 is bold. If this value is zero, a
*default weight is used.
*The following values are defined for convenience:
*
*Value Weight
*FW_DONTCARE 0
*FW_THIN 100
*FW_EXTRALIGHT 200
*FW_ULTRALIGHT 200
*FW_LIGHT 300
*FW_NORMAL 400
*FW_REGULAR 400
*FW_MEDIUM 500
*FW_SEMIBOLD 600
*FW_DEMIBOLD 600
*FW_BOLD 700
*FW_EXTRABOLD 800
*FW_ULTRABOLD 800
*FW_HEAVY 900
*FW_BLACK 900
*
*lfItalic
*Specifies an italic font if set to TRUE.
*
*lfUnderline
*Specifies an underlined font if set to TRUE.
*
*lfStrikeOut
*Specifies a strikeout font if set to TRUE.
*
*lfCharSet
*Specifies the character set.
nHdl=FCREATE('NCMtest.txt')
CLEAR DLLS
DECLARE INTEGER SystemParametersInfo IN Win32API ;
INTEGER, INTEGER, STRING @, INTEGER
DECLARE INTEGER GetLastError IN Win32API
NCM = SPACE(340) && length of NonClientMetrics structure
NCMData = Long2Str(LEN(NCM)) + REPLICATE(CHR(0),336)
RetCode = SystemParametersInfo(41,340,@NCMData,0)
IF RetCode = 0
=MESSAGEBOX( "SystemParametersInfo call failed. Last error was: " ;
+ STR(GetLastError()))
ELSE
cbSize = str2long(SUBSTR(NCMData, 1, 4))
iBorderWidth = str2long(SUBSTR(NCMData, 5, 4))
iScrollWidth = str2long(SUBSTR(NCMData, 9, 4))
iScrollHeight = str2long(SUBSTR(NCMData, 13, 4))
iCaptionWidth = str2long(SUBSTR(NCMData, 17, 4))
iCaptionHeight = str2long(SUBSTR(NCMData, 21, 4))
=FPUTS(nHdl,"cbSize = " + STR(cbSize))
=FPUTS(nHdl,"iBorderWidth = " + STR(iBorderWidth))
=FPUTS(nHdl,"iScrollWidth = " + STR(iScrollWidth))
=FPUTS(nHdl,"iScrollHeight = " + STR(iScrollHeight))
=FPUTS(nHdl,"iCaptionWidth = " + STR(iCaptionWidth))
=FPUTS(nHdl,"iCaptionHeight = " + STR(iCaptionHeight))
CFlfHeight = str2long(SUBSTR(NCMData, 25, 4))
* Visual Foxpro does not understand signed long datatypes -
* adjust if > 7FFFFFFF
IF CFlfHeight >= (2^31)
CFlfHeight = CFlfHeight - 2^ 32
ENDIF
CFlfWidth = str2long(SUBSTR(NCMData, 29, 4))
CFlfEscapement = str2long(SUBSTR(NCMData, 33, 4))
CFlfOrientation = str2long(SUBSTR(NCMData, 37, 4))
CFlfWeight = str2long(SUBSTR(NCMData, 41, 4))
CFlfItalic = ASC(SUBSTR(NCMData,45,1))
CFlfUnderLine = ASC(SUBSTR(NCMData,46,1))
CFlfStrikeOut = ASC(SUBSTR(NCMData,47,1))
CFlfCharset = ASC(SUBSTR(NCMData,48,1))
CFlfOutPrecision = ASC(SUBSTR(NCMData,49,1))
CFlfClipPrecision = ASC(SUBSTR(NCMData,50,1))
CFlfQuality = ASC(SUBSTR(NCMData,51,1))
CFlfPitchandFamily = ASC(SUBSTR(NCMData,52,1))
CFlfFaceName = SUBSTR(NCMData, 53,32)
CFlfFaceName = LEFT(CFlfFaceName,AT(CHR(0),CFlfFaceName)-1)
=FPUTS(nHdl,"CFlfHeight= " + STR(CFlfHeight))
=FPUTS(nHdl,"CFlfWidth= " + STR(CFlfWidth))
=FPUTS(nHdl,"CFlfEscapement= " + STR(CFlfEscapement))
=FPUTS(nHdl,"CFlfOrientation= " + STR(CFlfOrientation))
=FPUTS(nHdl,"CFlfWeight= " + STR(CFlfWeight))
=FPUTS(nHdl,"CFlfItalic= " + STR(CFlfItalic))
=FPUTS(nHdl,"CFlfUnderLine= " + STR(CFlfUnderLine))
=FPUTS(nHdl,"CFlfStrikeOut= " + STR(CFlfStrikeOut))
=FPUTS(nHdl,"CFlfCharset= " + STR(CFlfCharset))
=FPUTS(nHdl,"CFlfOutPrecision= " + STR(CFlfOutPrecision))
=FPUTS(nHdl,"CFlfClipPrecision= " + STR(CFlfClipPrecision))
=FPUTS(nHdl,"CFlfQuality= " + STR(CFlfQuality))
=FPUTS(nHdl,"CFlfPitchandFamily= " + STR(CFlfPitchandFamily))
=FPUTS(nHdl,"CFlfFaceName= " + CFlfFaceName)
iSMCaptionWidth = str2long(SUBSTR(NCMData, 85, 4))
iSMCaptionHeight = str2long(SUBSTR(NCMData, 89, 4))
=FPUTS(nHdl,"iSMCaptionWidth = " + STR(iSMCaptionWidth))
=FPUTS(nHdl,"iSMCaptionHeight = " + STR(iSMCaptionHeight))
SMCFlfHeight = str2long(SUBSTR(NCMData, 93, 4))
* Visual Foxpro does not understand signed long datatypes -
* adjust if > 7FFFFFFF
IF SMCFlfHeight >= 2^31
SMCFlfHeight = SMCFlfHeight - 2^ 32
ENDIF
SMCFlfWidth = str2long(SUBSTR(NCMData, 97, 4))
SMCFlfEscapement = str2long(SUBSTR(NCMData, 101, 4))
SMCFlfOrientation = str2long(SUBSTR(NCMData, 105, 4))
SMCFlfWeight = str2long(SUBSTR(NCMData, 109, 4))
SMCFlfItalic = ASC(SUBSTR(NCMData,113,1))
SMCFlfUnderLine = ASC(SUBSTR(NCMData,114,1))
SMCFlfStrikeOut = ASC(SUBSTR(NCMData,115,1))
SMCFlfCharset = ASC(SUBSTR(NCMData,116,1))
SMCFlfOutPrecision = ASC(SUBSTR(NCMData,117,1))
SMCFlfClipPrecision = ASC(SUBSTR(NCMData,118,1))
SMCFlfQuality = ASC(SUBSTR(NCMData,119,1))
SMCFlfPitchandFamily = ASC(SUBSTR(NCMData,120,1))
SMCFlfFaceName = SUBSTR(NCMData, 121, 32)
SMCFlfFaceName = LEFT(SMCFlfFaceName,AT(CHR(0),SMCFlfFaceName)-1)
=FPUTS(nHdl,"SMCFlfHeight= " + STR(SMCFlfHeight))
=FPUTS(nHdl,"SMCFlfWidth= " + STR(SMCFlfWidth))
=FPUTS(nHdl,"SMCFlfEscapement= " + STR(SMCFlfEscapement))
=FPUTS(nHdl,"SMCFlfOrientation= " + STR(SMCFlfOrientation))
=FPUTS(nHdl,"SMCFlfWeight= " + STR(SMCFlfWeight))
=FPUTS(nHdl,"SMCFlfItalic= " + STR(SMCFlfItalic))
=FPUTS(nHdl,"SMCFlfUnderLine= " + STR(SMCFlfUnderLine))
=FPUTS(nHdl,"SMCFlfStrikeOut= " + STR(SMCFlfStrikeOut))
=FPUTS(nHdl,"SMCFlfCharset= " + STR(SMCFlfCharset))
=FPUTS(nHdl,"SMCFlfOutPrecision= " + STR(SMCFlfOutPrecision))
=FPUTS(nHdl,"SMCFlfClipPrecision= " + STR(SMCFlfClipPrecision))
=FPUTS(nHdl,"SMCFlfQuality= " + STR(SMCFlfQuality))
=FPUTS(nHdl,"SMCFlfPitchandFamily= " + STR(SMCFlfPitchandFamily))
=FPUTS(nHdl,"SMCFlfFaceName= " + SMCFlfFaceName)
iMenuWidth = str2long(SUBSTR(NCMData, 153, 4))
iMenuHeight = str2long(SUBSTR(NCMData, 157, 4))
=FPUTS(nHdl,"iMenuWidth = " + STR(iMenuWidth))
=FPUTS(nHdl,"iMenuHeight = " + STR(iMenuHeight))
MenulfHeight = str2long(SUBSTR(NCMData, 161, 4))
* Visual Foxpro does not understand signed long datatypes -
* adjust if > 7FFFFFFF
IF MenulfHeight >= 2^31
MenulfHeight = MenulfHeight - 2^ 32
ENDIF
MenulfWidth = str2long(SUBSTR(NCMData, 165, 4))
MenulfEscapement = str2long(SUBSTR(NCMData, 169, 4))
MenulfOrientation = str2long(SUBSTR(NCMData, 173, 4))
MenulfWeight = str2long(SUBSTR(NCMData, 177, 4))
MenulfItalic = ASC(SUBSTR(NCMData,181,1))
MenulfUnderLine = ASC(SUBSTR(NCMData,182,1))
MenulfStrikeOut = ASC(SUBSTR(NCMData,183,1))
MenulfCharset = ASC(SUBSTR(NCMData,184,1))
MenulfOutPrecision = ASC(SUBSTR(NCMData,185,1))
MenulfClipPrecision = ASC(SUBSTR(NCMData,186,1))
MenulfQuality = ASC(SUBSTR(NCMData,187,1))
MenulfPitchandFamily = ASC(SUBSTR(NCMData,188,1))
MenulfFaceName = SUBSTR(NCMData, 189, 32)
MenulfFaceName = LEFT(MenulfFaceName,AT(CHR(0),MenulfFaceName)-1)
=FPUTS(nHdl,"MenulfHeight= " + STR(MenulfHeight))
=FPUTS(nHdl,"MenulfWidth= " + STR(MenulfWidth))
=FPUTS(nHdl,"MenulfEscapement= " + STR(MenulfEscapement))
=FPUTS(nHdl,"MenulfOrientation= " + STR(MenulfOrientation))
=FPUTS(nHdl,"MenulfWeight= " + STR(MenulfWeight))
=FPUTS(nHdl,"MenulfItalic= " + STR(MenulfItalic))
=FPUTS(nHdl,"MenulfUnderLine= " + STR(MenulfUnderLine))
=FPUTS(nHdl,"MenulfStrikeOut= " + STR(MenulfStrikeOut))
=FPUTS(nHdl,"MenulfCharset= " + STR(MenulfCharset))
=FPUTS(nHdl,"MenulfOutPrecision= " + STR(MenulfOutPrecision))
=FPUTS(nHdl,"MenulfClipPrecision= " + STR(MenulfClipPrecision))
=FPUTS(nHdl,"MenulfQuality= " + STR(MenulfQuality))
=FPUTS(nHdl,"MenulfPitchandFamily= " + STR(MenulfPitchandFamily))
=FPUTS(nHdl,"MenulfFaceName= " + MenulfFaceName)
SFlfHeight = str2long(SUBSTR(NCMData, 221, 4))
* Visual Foxpro does not understand signed long datatypes -
* adjust if > 7FFFFFFF
IF SFlfHeight >= 2^31
SFlfHeight = SFlfHeight - 2^ 32
ENDIF
SFlfWidth = str2long(SUBSTR(NCMData, 225, 4))
SFlfEscapement = str2long(SUBSTR(NCMData, 229, 4))
SFlfOrientation = str2long(SUBSTR(NCMData, 233, 4))
SFlfWeight = str2long(SUBSTR(NCMData, 237, 4))
SFlfItalic = ASC(SUBSTR(NCMData,241,1))
SFlfUnderLine = ASC(SUBSTR(NCMData,242,1))
SFlfStrikeOut = ASC(SUBSTR(NCMData,243,1))
SFlfCharset = ASC(SUBSTR(NCMData,244,1))
SFlfOutPrecision = ASC(SUBSTR(NCMData,245,1))
SFlfClipPrecision = ASC(SUBSTR(NCMData,246,1))
SFlfQuality = ASC(SUBSTR(NCMData,247,1))
SFlfPitchandFamily = ASC(SUBSTR(NCMData,248,1))
SFlfFaceName = SUBSTR(NCMData, 249, 32)
SFlfFaceName = LEFT(SFlfFaceName,AT(CHR(0),SFlfFaceName)-1)
=FPUTS(nHdl,"SFlfHeight= " + STR(SFlfHeight))
=FPUTS(nHdl,"SFlfWidth= " + STR(SFlfWidth))
=FPUTS(nHdl,"SFlfEscapement= " + STR(SFlfEscapement))
=FPUTS(nHdl,"SFlfOrientation= " + STR(SFlfOrientation))
=FPUTS(nHdl,"SFlfWeight= " + STR(SFlfWeight))
=FPUTS(nHdl,"SFlfItalic= " + STR(SFlfItalic))
=FPUTS(nHdl,"SFlfUnderLine= " + STR(SFlfUnderLine))
=FPUTS(nHdl,"SFlfStrikeOut= " + STR(SFlfStrikeOut))
=FPUTS(nHdl,"SFlfCharset= " + STR(SFlfCharset))
=FPUTS(nHdl,"SFlfOutPrecision= " + STR(SFlfOutPrecision))
=FPUTS(nHdl,"SFlfClipPrecision= " + STR(SFlfClipPrecision))
=FPUTS(nHdl,"SFlfQuality= " + STR(SFlfQuality))
=FPUTS(nHdl,"SFlfPitchandFamily= " + STR(SFlfPitchandFamily))
=FPUTS(nHdl,"SFlfFaceName= " + SFlfFaceName)
MGlfHeight = str2long(SUBSTR(NCMData, 281, 4))
* Visual Foxpro does not understand signed long datatypes -
* adjust if > 7FFFFFFF
IF MGlfHeight >= 2^31
MGlfHeight = MGlfHeight - 2^ 32
ENDIF
MGlfWidth = str2long(SUBSTR(NCMData, 285, 4))
MGlfEscapement = str2long(SUBSTR(NCMData, 289, 4))
MGlfOrientation = str2long(SUBSTR(NCMData, 293, 4))
MGlfWeight = str2long(SUBSTR(NCMData, 297, 4))
MGlfItalic = ASC(SUBSTR(NCMData,301,1))
MGlfUnderLine = ASC(SUBSTR(NCMData,302,1))
MGlfStrikeOut = ASC(SUBSTR(NCMData,303,1))
MGlfCharset = ASC(SUBSTR(NCMData,304,1))
MGlfOutPrecision = ASC(SUBSTR(NCMData,305,1))
MGlfClipPrecision = ASC(SUBSTR(NCMData,306,1))
MGlfQuality = ASC(SUBSTR(NCMData,307,1))
MGlfPitchandFamily = ASC(SUBSTR(NCMData,308,1))
MGlfFaceName = SUBSTR(NCMData, 309, 32)
MGlfFaceName = LEFT(MGlfFaceName,AT(CHR(0),MGlfFaceName)-1)
=FPUTS(nHdl,"MGlfHeight= " + STR(MGlfHeight))
=FPUTS(nHdl,"MGlfWidth= " + STR(MGlfWidth))
=FPUTS(nHdl,"MGlfEscapement= " + STR(MGlfEscapement))
=FPUTS(nHdl,"MGlfOrientation= " + STR(MGlfOrientation))
=FPUTS(nHdl,"MGlfWeight= " + STR(MGlfWeight))
=FPUTS(nHdl,"MGlfItalic= " + STR(MGlfItalic))
=FPUTS(nHdl,"MGlfUnderLine= " + STR(MGlfUnderLine))
=FPUTS(nHdl,"MGlfStrikeOut= " + STR(MGlfStrikeOut))
=FPUTS(nHdl,"MGlfCharset= " + STR(MGlfCharset))
=FPUTS(nHdl,"MGlfOutPrecision= " + STR(MGlfOutPrecision))
=FPUTS(nHdl,"MGlfClipPrecision= " + STR(MGlfClipPrecision))
=FPUTS(nHdl,"MGlfQuality= " + STR(MGlfQuality))
=FPUTS(nHdl,"MGlfPitchandFamily= " + STR(MGlfPitchandFamily))
=FPUTS(nHdl,"MGlfFaceName= " + MGlfFaceName)
ENDIF
=FFLUSH(nHdl)
=FCLOSE(nHdl)
MODI FILE NCMtest.txt
*********************************************************
FUNCTION Long2Str
*********************************************************
* Accepts long integer, translates it to low-high format in
* a character string variable.
PARAMETERS m.longval
PRIVATE i, m.retstr
m.retstr = ""
FOR i = 24 TO 0 STEP -8
m.retstr = CHR(INT(m.longval/(2^i))) + m.retstr
m.longval = MOD(m.longval, (2^i))
NEXT
RETURN m.retstr
*********************************************************
FUNCTION str2long
*********************************************************
* Accepts character string representation of long integer,
* returns that long integer.
PARAMETERS m.longstr
PRIVATE i, m.retval
m.retval = 0
FOR i = 0 TO 24 STEP 8
m.retval = m.retval + (ASC(m.longstr) * (2^i))
m.longstr = RIGHT(m.longstr, LEN(m.longstr) - 1)
NEXT
RETURN m.retval
Additional query words:
======================================================================
Keywords : kbcode kbnokeyword kbvfp300 kbvfp500 kbvfp600
Technology : kbVFPsearch kbAudDeveloper kbVFP300 kbVFP300b kbVFP500 kbVFP600 kbVFP500a
Issue type : kbhowto
=============================================================================
THE INFORMATION PROVIDED IN THE MICROSOFT KNOWLEDGE BASE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. MICROSOFT DISCLAIMS ALL WARRANTIES, EITHER EXPRESS OR IMPLIED, INCLUDING THE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL MICROSOFT CORPORATION OR ITS SUPPLIERS BE LIABLE FOR ANY DAMAGES WHATSOEVER INCLUDING DIRECT, INDIRECT, INCIDENTAL, CONSEQUENTIAL, LOSS OF BUSINESS PROFITS OR SPECIAL DAMAGES, EVEN IF MICROSOFT CORPORATION OR ITS SUPPLIERS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. SOME STATES DO NOT ALLOW THE EXCLUSION OR LIMITATION OF LIABILITY FOR CONSEQUENTIAL OR INCIDENTAL DAMAGES SO THE FOREGOING LIMITATION MAY NOT APPLY.
Copyright Microsoft Corporation 1986-2002.