Displaying Characters in a Window

┌──────────────────────────────────────────────────────────────────────┐
│PM-supplied controls are DBCS-enabled.                                │
└──────────────────────────────────────────────────────────────────────┘

ALL PM controls accept multibyte strings as their text. The related APIs to set/query the text accept multibyte strings, too. In case that the program uses wide string, the wide string must be converted before calling the PM APIs (refer toInterface between Wide-based Part and Multibyte-based Subsystems).

┌──────────────────────────────────────────────────────────────────────┐
│Do not assume font size when writing characters with GPIs.            │
└──────────────────────────────────────────────────────────────────────┘

When an application writes characters on a presentation space directly, assuming the heights/width of the font may cause overlapping of characters. The following figure shows a very common example of this mistake.

To avoid this, query the size of the current font size by GPIs.
Querying font size (XPRMMAIN.C)

...
/* device information */
long lDevCaps[4];
...
/**********************************************************************/
/* queryDevCapabilities()                                             */
/*   Queries desk top resolution and the main window's font's size in */
/*   pels.  The information is stored in lDevCaps[].                  */
/**********************************************************************/
void queryDevCapabilities( HWND hwndFrame )
{
  HPS hps;
  FONTMETRICS fm;
  ...
  /* Query main window's font size */
  hps = WinGetPS(hwndFrame);
  GpiQueryFontMetrics(hps, (LONG)sizeof(fm), &fm);
  WinReleasePS(hps);
  lDevCaps[CHAR_X] = fm.lAveCharWidth;
  lDevCaps[CHAR_Y] = fm.lMaxBaselineExt+fm.lExternalLeading;
}

The lAveCharWidth of FONTMETRICS is the average width of SBCS characters in the font. In general, the width of DBCS characters are fixed even if it is a proportional font. Thus, if the width of a DBCS character is required, use GpiQueryTextBox() with DBCS white space.

Note: The code point of the DBCS white space are different among code pages. Externalize the data to the string table in a resource file.