FIRST: make your stack huge (>32K) It is sparsely allocated and you only use what you need. Here's some code:
FONTDLG fontdlg ;
FONTMETRICS fm ;
CHAR szBuf [200] ;
CHAR szFamily [CCHMAXPATH] ;
static CHAR szTitle [] = "Fonts Dialog" ;
static CHAR szMsgBoxTitle [] = "Result from 'WinFontDlg ()'" ;
static CHAR szPreview [] = "We hold these truths to be self-evident ..." ;
// Here, get an HPS and then do a WinQueryFontMetrics.
// Continuing ...
memset ((void *) &fontdlg, 0, sizeof (FONTDLG)) ;
fontdlg.cbSize = sizeof (FONTDLG) ;
fontdlg.hpsScreen = WinGetScreenPS (HWND_DESKTOP) ;
fontdlg.hpsPrinter = NULLHANDLE ;
fontdlg.pszTitle = szTitle ;
fontdlg.pszPreview = szPreview ;
fontdlg.pfnDlgProc = NULL ;
strcpy (szFamily, fm.szFamilyname) ;
fontdlg.pszFamilyname = szFamily ;
fontdlg.usFamilyBufLen = sizeof (szFamily) ;
fontdlg.fxPointSize = MAKEFIXED (fm.sNominalPointSize / 10, 0) ;
fontdlg.fl = FNTS_CENTER | FNTS_HELPBUTTON |
FNTS_INITFROMFATTRS | FNTS_NOSYNTHESIZEDFONTS |
FNTS_RESETBUTTON ;
fontdlg.sNominalPointSize = fm.sNominalPointSize ;
fontdlg.flType = (LONG) fm.fsType ;
fontdlg.clrFore = CLR_NEUTRAL ;
fontdlg.clrBack = CLR_BACKGROUND ;
fontdlg.usWeight = fm.usWeightClass ;
fontdlg.usWidth = fm.usWidthClass ;
hwndDlg = WinFontDlg (HWND_DESKTOP, hwnd, &fontdlg) ;
Credit: Wayne Kovsky