home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Windows Gam…ming Gurus (2nd Edition) / Disc2.iso / msdn_vcb / samples / vc98 / sdk / winui / cmddlg / cdtest / font.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-06-17  |  40.1 KB  |  1,599 lines

  1. /************************************************************************
  2.  
  3.   File: font.c
  4.  
  5.   Purpose:
  6.  
  7.     Contains all functions pertinent to CDTEST's Font dialog.
  8.  
  9.   Functions:
  10.  
  11.      DoFontDlg()          -- Creates CDTEST's font dialog.
  12.  
  13.      FontProc()           -- Callback for CDTEST's font dialog.
  14.  
  15.      InitFontStruct()     -- Fills a CHOOSEFONT structure with some defaults.
  16.  
  17.      FillFontDlg()        -- Fills CDTEST's font dialog with the contents
  18.                              of a CHOOSEFONT structure.
  19.  
  20.      GetFontDlg()         -- Retrieves the contents of CDTEST's font dialog
  21.                              and fills a CHOOSEFONT structure with them.
  22.  
  23.      GetHdc()             -- Creates and returns an HDC
  24.  
  25.      LogFontProc()        -- Callback function for the logfont dlg.
  26.  
  27.      InitLogFontStruct()  -- Fills a LOGFONT structure with some defaults.
  28.  
  29.      FillLogFontDlg()     -- Fills the LOGFONT dlg with the values in
  30.                              a LOGFONT structure.
  31.  
  32.      GetLogFontDlg()      -- Retrieves the user's edits in the LogFont dlg
  33.                              and puts them in a LOGFONT structure.
  34.  
  35.      FontHookProc()       -- Callback function for CHOOSEFONT->lpfnHook
  36.  
  37.      GetFontDlgHandle()   -- Creates a handle to the custom template and
  38.                              returns a handle to it.
  39.  
  40.      EnumFontsProc()      -- Callback function for EnumFontFamilies()
  41.  
  42.      FillFontsBox()       -- Fills CDTEST's font list box with requested fonts
  43.  
  44.      ResetCheckBoxes()    -- handles the font choices check box manipulations
  45.  
  46.      HandleFontCheckBox() -- Handles the WM_COMMAND messages from the font
  47.                              choices check boxes.
  48.  
  49.      DoChooseFontStuff()  -- Calls the ChooseFont() function.
  50.  
  51.      FontThreadProc1()    -- Starting address for the first thread.
  52.  
  53.      FontThreadProc2()    -- Starting address for the second thread.
  54.  
  55.      MultiThreadFontDlg() -- Creates two threads which each create a
  56.                              ChooseFont() dialog.
  57.  
  58.      FontEnableButtons()  -- Enables or disables CDTEST's font dialog buttons.
  59.                              Necessary for multithreading part of this app.
  60.  
  61. ************************************************************************/
  62.  
  63.  
  64. #include <windows.h>
  65. #include <commdlg.h>
  66. #include <stdlib.h>
  67. #include <winnls.h>
  68. #include "cdtest.h"
  69. #include "font.h"
  70. #include "logfont.h"
  71.  
  72.  
  73.  
  74. /* some definitions that will help us tell the difference between
  75.    screen and printer fonts */
  76.  
  77. #define FONT_TYPE_WYSIWYG 1
  78. BOOL bScreen ;
  79.  
  80.  
  81.  
  82. /* function prototypes and general variables */
  83.  
  84. void InitFontStruct(HWND, LPCHOOSEFONT) ;
  85. void FillFontDlg(HWND, LPCHOOSEFONT) ;
  86. void GetFontDlg(HWND, LPCHOOSEFONT) ;
  87. HDC  GetHdc(HWND, int) ;
  88. void InitLogFontStruct(HWND, LPLOGFONT) ;
  89. void FillLogFontDlg(HWND, LPLOGFONT) ;
  90. void GetLogFontDlg(HWND, LPLOGFONT) ;
  91. BOOL APIENTRY LogFontProc(HWND, UINT, UINT, LONG) ;
  92. UINT APIENTRY FontHookProc(HWND, UINT, UINT, LONG) ;
  93. int  CALLBACK EnumFontsProc(LPLOGFONT, LPTEXTMETRIC, DWORD, LONG) ;
  94. void FillFontsBox(HWND, DWORD) ;
  95. void ResetCheckBoxes(HWND) ;
  96. void HandleFontCheckBox(HWND, int) ;
  97. void DoChooseFontStuff(HWND, LPCHOOSEFONT) ;
  98.  
  99.  
  100.  
  101. /* Global variables and some external variables and functions */
  102.  
  103. DWORD dwFontFlag ;
  104. PRINTDLG pfd ;
  105. BOOL bLogFontParam ;
  106. LOGFONT lfWM_CF_LF ;                 //for the WM_CHOOSEFONT_GETLOGFONT message
  107. extern UINT uMode ;
  108. extern LONG MyAtol(LPTSTR, BOOL, LPBOOL) ;
  109. HANDLE hResFont, hDialogFont ;
  110. HANDLE GetFontDlgHandle(void) ;
  111. CHOOSEFONT cf ;
  112. LOGFONT lf ;
  113. HDC hdc ;
  114. TCHAR szFaceName[50] ;
  115. TCHAR szFontTemplate[50] ;
  116. TCHAR szFontStyle[50] ;
  117. #define HDCSCREEN 1
  118. #define HDCPRINTER 2
  119. #define HDCNULL 3
  120. #define HDCINVALID 4
  121. INT nHdcType ;
  122.  
  123.  
  124.  
  125. /* Multithreading stuff */
  126.  
  127. HANDLE hFontThread1 ;
  128. HANDLE hFontThread2 ;
  129. DWORD  dwFontThreadID1 ;
  130. DWORD  dwFontThreadID2 ;
  131. DWORD  dwFontThreadParm1 ;
  132. DWORD  dwFontThreadParm2 ;
  133. DWORD  FontThreadProc1(LPDWORD) ;
  134. DWORD  FontThreadProc2(LPDWORD) ;
  135. HANDLE hwndMainFont ;
  136. int    nOpenFontDialogCount ;
  137. CHOOSEFONT cfThread1 ;
  138. CHOOSEFONT cfThread2 ;
  139. void MultiThreadFontDlg(void) ;
  140. void EnableFontButtons(HWND, BOOL) ;
  141.  
  142.  
  143.  
  144.  
  145. /************************************************************************
  146.  
  147.   Function: DoFontDlg(HWND)
  148.  
  149.   Purpose:
  150.  
  151.     To create the CDTEST's font dialog
  152.  
  153.   Returns: Nothing.
  154.  
  155.   Comments:
  156.  
  157.  
  158. ************************************************************************/
  159.  
  160. void DoFontDialog(HWND hwnd)
  161. {
  162.  
  163.  
  164.   DialogBox(hInst, MAKEINTRESOURCE(ID_FONTDIALOG),
  165.             hwnd, FontProc) ;
  166.  
  167. }
  168.  
  169.  
  170.  
  171.  
  172.  
  173.  
  174.  
  175. /************************************************************************
  176.  
  177.   Function: FontProc(HWND, UINT, UINT, LONG)
  178.  
  179.   Purpose:
  180.  
  181.     Callback function for CDTEST's font dialog.
  182.  
  183.   Returns: TRUE or FALSE depending on the situation.
  184.  
  185.   Comments:
  186.  
  187.  
  188. ************************************************************************/
  189.  
  190.  
  191. BOOL APIENTRY FontProc(HWND hwnd, UINT msg, UINT wParam, LONG lParam)
  192. {
  193.   BOOL b ;
  194.   TCHAR szNum[30] ;
  195.  
  196.   switch (msg)
  197.   {
  198.     case WM_INITDIALOG:
  199.  
  200.         InitLogFontStruct(hwnd, &lf) ;   //fill (struct lf) so the choosefont
  201.         InitFontStruct(hwnd, &cf) ;      //struct can use it
  202.         FillFontDlg(hwnd, &cf) ;
  203.  
  204.         CheckRadioButton(hwnd, ID_HDCSCREEN, ID_HDCPRINTER, ID_HDCSCREEN) ;
  205.         nHdcType = HDCSCREEN ;
  206.  
  207.         dwFontFlag = cf.Flags ;
  208.  
  209.         FillFontsBox(hwnd, dwFontFlag) ;
  210.  
  211.         ResetCheckBoxes(hwnd) ;
  212.  
  213.         *(&cfThread1) = *(&cfThread2) = *(&cf) ;
  214.  
  215.         hwndMainFont = hwnd ;
  216.         nOpenFontDialogCount = 0 ;
  217.  
  218.         SetFocus(GetDlgItem(hwnd, ID_STRUCTSIZEF)) ;
  219.  
  220.         break ;
  221.  
  222.  
  223.     case UMSG_DECREMENTDLGCOUNT:  // user defined message.  This is send by
  224.                                   // the functions that are executing when
  225.                                   // a new thread is created.  When these
  226.                                   // Thread functions end, they should send
  227.                                   // this message.
  228.  
  229.       nOpenFontDialogCount-- ;
  230.  
  231.       if (nOpenFontDialogCount == 0)
  232.         EnableFontButtons(hwnd, TRUE) ;
  233.  
  234.       break ;
  235.  
  236.  
  237.     case WM_CF_LF:
  238.  
  239.        /* If this message comes in, we know that the user clicked the
  240.           button that tells the ChooseFont() dialog to tell the parent
  241.           to send the WM_CHOOSEFONT_GETLOGFONT message.  So what we will
  242.           do is send the message and then show the user what was in the
  243.           logfont by calling creating the Logfont dialog box */
  244.  
  245.  
  246.        SendMessage((HWND) lParam, WM_CHOOSEFONT_GETLOGFONT,
  247.                    0, (LPARAM) &lfWM_CF_LF) ;
  248.  
  249.        bLogFontParam = TRUE ; //tells us if we are doing normal logfont
  250.                               //processing or answering the WM_CF_LF message.
  251.  
  252.        DialogBoxParam(hInst, MAKEINTRESOURCE(ID_LOGFONTDIALOG),
  253.                       (HWND) lParam, LogFontProc, (LPARAM) &lf) ;
  254.  
  255.        bLogFontParam = FALSE ;
  256.  
  257.        break ;
  258.  
  259.  
  260.     case WM_COMMAND:
  261.     {
  262.         switch (LOWORD(wParam))
  263.         {
  264.           case IDOK:
  265.             DoChooseFontStuff(hwnd, &cf) ;  //create the dialog.
  266.             break ;
  267.  
  268.           case IDCANCEL:
  269.             EndDialog(hwnd, FALSE) ;
  270.             break ;
  271.  
  272.           case ID_RESETFONT:
  273.  
  274.             InitLogFontStruct(hwnd, &lf) ;  //reset all the structures.
  275.             InitFontStruct(hwnd, &cf) ;
  276.             FillFontDlg(hwnd, &cf) ;        //refill the dialog.
  277.  
  278.             CheckRadioButton(hwnd, ID_HDCSCREEN, ID_HDCPRINTER, ID_HDCSCREEN) ;
  279.             nHdcType = HDCSCREEN ;
  280.  
  281.             SendDlgItemMessage(hwnd, ID_NULLSTRUCTFONT, BM_SETCHECK, (WPARAM) 0, (LPARAM)0) ;
  282.             SendDlgItemMessage(hwnd, ID_PRELOADEDFONT,  BM_SETCHECK, (WPARAM) 0, (LPARAM)0) ;
  283.  
  284.             dwFontFlag = cf.Flags ;
  285.             FillFontsBox(hwnd, dwFontFlag) ;
  286.             ResetCheckBoxes(hwnd) ;
  287.  
  288.             SetFocus(GetDlgItem(hwnd, ID_STRUCTSIZEF)) ;
  289.  
  290.             break ;
  291.  
  292.  
  293.           case ID_HDCSCREEN:
  294.             nHdcType = HDCSCREEN ;
  295.             break ;
  296.  
  297.           case ID_HDCPRINTER:
  298.             nHdcType = HDCPRINTER ;
  299.             break ;
  300.  
  301.           case ID_HDCNULL:
  302.             nHdcType = HDCNULL ;
  303.             break ;
  304.  
  305.           case ID_HDCINVALID:
  306.             nHdcType = HDCINVALID ;
  307.             break ;
  308.  
  309.           case ID_EDITLOGFONT:
  310.  
  311.             /* Get the address of the logfont and then show the user what
  312.                is in it with the Logfont dialog box */
  313.  
  314.             GetDlgItemText(hwnd, ID_LOGFONTF, szNum, 30) ;
  315.             cf.lpLogFont = (LPLOGFONT) MyAtol(szNum, uMode==IDM_HEXMODE, &b) ;
  316.  
  317.             DialogBox(hInst, MAKEINTRESOURCE(ID_LOGFONTDIALOG),
  318.                       hwnd, LogFontProc) ;
  319.             break ;
  320.  
  321.  
  322.           case F_TTONLY:
  323.           case F_ANSIONLY:
  324.           case F_PRINTERFONTS:
  325.           case F_SCREENFONTS:
  326.           case F_FIXEDPITCHONLY:
  327.           case F_NOOEMFONTS:
  328.           case F_NOVECTORFONTS:
  329.           case F_SCALABLEONLY:
  330.           case F_WYSIWYG:
  331.             HandleFontCheckBox(hwnd, LOWORD(wParam)) ;
  332.             break ;
  333.  
  334.  
  335.           case ID_MULTITHREADFONT:
  336.  
  337.             /* Set the dialog count to 2, disable the buttons in CDTEST's font
  338.                dialog so the user can't do anything until last dialog has
  339.                been terminated */
  340.  
  341.             nOpenFontDialogCount = 2 ;
  342.  
  343.             EnableFontButtons(hwndMainFont, FALSE) ;
  344.  
  345.             /* And then do the multithreading */
  346.  
  347.             MultiThreadFontDlg() ;
  348.  
  349.             break ;
  350.  
  351.  
  352.           default: break ;
  353.         }
  354.     }
  355.  
  356.     default:
  357.  
  358.       /*
  359.          If the help button is pressed in the ChooseFont()
  360.          dialog, it will send a message Registered with RegisterWindowMessage()
  361.          to the parent window.  The message nHelpMessage was registered
  362.          at application startup
  363.  
  364.          It must be detected with an IF statement because the value
  365.          returned by RegisterWindowMessage() is not a constant
  366.       */
  367.  
  368.       if (msg == nHelpMessage)
  369.         MessageBox(GetForegroundWindow(), TEXT("Hello from the help button"),
  370.                    TEXT("Font Help Button"), MB_OK | MB_APPLMODAL) ;
  371.       break ;
  372.   }
  373.  
  374.   return FALSE ;
  375. }
  376.  
  377.  
  378.  
  379.  
  380.  
  381.  
  382.  
  383.  
  384. /************************************************************************
  385.  
  386.   Function: InitFontStruct(HWND, LPCHOOSEFONT)
  387.  
  388.   Purpose:
  389.  
  390.     Fill the CHOOSEFONT structure passed as the second parameter with
  391.     some default values.
  392.  
  393.   Returns: Nothing.
  394.  
  395.   Comments:
  396.  
  397.  
  398. ************************************************************************/
  399.  
  400. void InitFontStruct(HWND hwnd, LPCHOOSEFONT pcf)
  401. {
  402.   pcf->lStructSize = sizeof(CHOOSEFONT) ;
  403.   pcf->hwndOwner = hwnd ;
  404.   pcf->hDC = (HDC) 0 ;
  405.   pcf->lpLogFont = &lf ;
  406.   pcf->iPointSize = 24 ;
  407.   pcf->Flags = CF_EFFECTS | CF_SCREENFONTS | CF_INITTOLOGFONTSTRUCT | CF_SHOWHELP | CF_APPLY ;
  408.   pcf->rgbColors = RGB(0, 255, 0) ;
  409.   pcf->lCustData = 0L ;
  410.   pcf->lpfnHook = FontHookProc ;
  411.  
  412.   lstrcpy(szFontTemplate, TEXT("fonttemp")) ;
  413.   pcf->lpTemplateName = szFontTemplate ;
  414.  
  415.   pcf->hInstance = (HANDLE) hInst ;
  416.  
  417.   lstrcpy(szFontStyle, TEXT("Bold")) ;
  418.   pcf->lpszStyle = szFontStyle ;
  419.  
  420.   pcf->nFontType = SCREEN_FONTTYPE ;
  421.  
  422.   pcf->nSizeMin = 8 ;
  423.   pcf->nSizeMax = 50 ;
  424. }
  425.  
  426.  
  427.  
  428.  
  429.  
  430.  
  431.  
  432.  
  433.  
  434.  
  435. /************************************************************************
  436.  
  437.   Function: FillFontDlg(HWND, LPCHOOSEFONT)
  438.  
  439.   Purpose:
  440.  
  441.     Fill CDTEST's font dialog with the values in the CHOOSEFONT structure
  442.     passed via the second parameter.
  443.  
  444.   Returns: Nothing.
  445.  
  446.   Comments:
  447.  
  448.  
  449. ************************************************************************/
  450.  
  451. void FillFontDlg(HWND hwnd, LPCHOOSEFONT pcf)
  452. {
  453.   wsprintf(szTemp, szLongFilter, pcf->lStructSize) ;
  454.   SetDlgItemText(hwnd, ID_STRUCTSIZEF, szTemp) ;
  455.  
  456.   wsprintf(szTemp, szLongFilter, (DWORD) pcf->hwndOwner) ;
  457.   SetDlgItemText(hwnd, ID_HWNDOWNERF, szTemp) ;
  458.  
  459.   wsprintf(szTemp, szLongFilter, (DWORD) pcf->hDC) ;
  460.   SetDlgItemText(hwnd, ID_HDCF, szTemp) ;
  461.  
  462.   wsprintf(szTemp, szLongFilter, (DWORD) pcf->hDC) ;
  463.   SetDlgItemText(hwnd, ID_HDCF, szTemp) ;
  464.  
  465.   wsprintf(szTemp, szLongFilter, (DWORD) pcf->lpLogFont) ;
  466.   SetDlgItemText(hwnd, ID_LOGFONTF, szTemp) ;
  467.  
  468.   wsprintf(szTemp, szLongFilter, (DWORD) pcf->iPointSize) ;
  469.   SetDlgItemText(hwnd, ID_POINTSIZEF, szTemp) ;
  470.  
  471.   wsprintf(szTemp, szLongFilter, pcf->Flags) ;
  472.   SetDlgItemText(hwnd, ID_FLAGSF, szTemp) ;
  473.  
  474.   wsprintf(szTemp, szLongFilter, pcf->rgbColors) ;
  475.   SetDlgItemText(hwnd, ID_RGBCOLORSF, szTemp) ;
  476.  
  477.   wsprintf(szTemp, szLongFilter, pcf->lCustData) ;
  478.   SetDlgItemText(hwnd, ID_CUSTDATAF, szTemp) ;
  479.  
  480.   wsprintf(szTemp, szLongFilter, (DWORD) pcf->lpfnHook) ;
  481.   SetDlgItemText(hwnd, ID_HOOKF, szTemp) ;
  482.  
  483.   SetDlgItemText(hwnd, ID_TEMPLATEF, pcf->lpTemplateName) ;
  484.  
  485.   wsprintf(szTemp, szLongFilter, (DWORD) pcf->hInstance) ;
  486.   SetDlgItemText(hwnd, ID_HINSTANCEF, szTemp) ;
  487.  
  488.   SetDlgItemText(hwnd, ID_STYLEF, pcf->lpszStyle) ;
  489.  
  490.   wsprintf(szTemp, szLongFilter, (int) pcf->nFontType) ;
  491.   SetDlgItemText(hwnd, ID_FONTTYPEF, szTemp) ;
  492.  
  493.   wsprintf(szTemp, szLongFilter, (int) pcf->nSizeMin) ;
  494.   SetDlgItemText(hwnd, ID_SIZEMINF, szTemp) ;
  495.  
  496.   wsprintf(szTemp, szLongFilter, (int) pcf->nSizeMax) ;
  497.   SetDlgItemText(hwnd, ID_SIZEMAXF, szTemp) ;
  498.  
  499. }
  500.  
  501.  
  502.  
  503.  
  504.  
  505.  
  506.  
  507. /************************************************************************
  508.  
  509.   Function: GetFontDlg(HWND, LPCHOOSEFONT)
  510.  
  511.   Purpose:
  512.  
  513.     Retrieve the users edits from CDTEST's font dialog and put them
  514.     in the CHOOSEFONT structure passed in as the second parameter
  515.  
  516.   Returns: Nothing.
  517.  
  518.   Comments:
  519.  
  520.  
  521. ************************************************************************/
  522.  
  523. void GetFontDlg(HWND hwnd, LPCHOOSEFONT pcf)
  524. {
  525.   BOOL b ;
  526.   TCHAR szNum[30] ;
  527.  
  528. #define WSIZEFO 30
  529.  
  530.   GetDlgItemText(hwnd, ID_STRUCTSIZEF, szNum, WSIZEFO) ;
  531.   pcf->lStructSize = MyAtol(szNum, uMode == IDM_HEXMODE, &b) ;
  532.  
  533.   GetDlgItemText(hwnd, ID_HWNDOWNERF, szNum, WSIZEFO) ;
  534.   pcf->hwndOwner = (HWND) MyAtol(szNum, uMode == IDM_HEXMODE, &b) ;
  535.  
  536.   GetDlgItemText(hwnd, ID_LOGFONTF, szNum, WSIZEFO) ;
  537.   pcf->lpLogFont = (LPLOGFONT) MyAtol(szNum, uMode == IDM_HEXMODE, &b) ;
  538.  
  539.   GetDlgItemText(hwnd, ID_POINTSIZEF, szNum, WSIZEFO) ;
  540.   pcf->iPointSize = (int) MyAtol(szNum, uMode == IDM_HEXMODE, &b) ;
  541.  
  542.   GetDlgItemText(hwnd, ID_FLAGSF, szNum, WSIZEFO) ;
  543.   pcf->Flags = MyAtol(szNum, uMode == IDM_HEXMODE, &b) ;
  544.  
  545.   GetDlgItemText(hwnd, ID_RGBCOLORSF, szNum, WSIZEFO) ;
  546.   pcf->rgbColors = MyAtol(szNum, uMode == IDM_HEXMODE, &b) ;
  547.  
  548.   GetDlgItemText(hwnd, ID_CUSTDATAF, szNum, WSIZEFO) ;
  549.   pcf->lCustData = MyAtol(szNum, uMode == IDM_HEXMODE, &b) ;
  550.  
  551.   GetDlgItemText(hwnd, ID_HOOKF, szNum, WSIZEFO) ;
  552.   pcf->lpfnHook = (LPCFHOOKPROC) MyAtol(szNum, uMode == IDM_HEXMODE, &b) ;
  553.  
  554.   GetDlgItemText(hwnd, ID_TEMPLATEF, szFontTemplate, 50) ;
  555.  
  556.   GetDlgItemText(hwnd, ID_HINSTANCEF, szNum, WSIZEFO) ;
  557.   pcf->hInstance = (HANDLE) MyAtol(szNum, uMode == IDM_HEXMODE, &b) ;
  558.  
  559.   GetDlgItemText(hwnd, ID_STYLEF, szFontStyle, 50) ;
  560.  
  561.   GetDlgItemText(hwnd, ID_FONTTYPEF, szNum, WSIZEFO) ;
  562.   pcf->nFontType = (int) MyAtol(szNum, uMode == IDM_HEXMODE, &b) ;
  563.  
  564.   GetDlgItemText(hwnd, ID_SIZEMINF, szNum, WSIZEFO) ;
  565.   pcf->nSizeMin = (int) MyAtol(szNum, uMode == IDM_HEXMODE, &b) ;
  566.  
  567.   GetDlgItemText(hwnd, ID_SIZEMAXF, szNum, WSIZEFO) ;
  568.   pcf->nSizeMax = (int) MyAtol(szNum, uMode == IDM_HEXMODE, &b) ;
  569. }
  570.  
  571.  
  572.  
  573.  
  574.  
  575.  
  576.  
  577. /************************************************************************
  578.  
  579.   Function: GetHdc(HWND, int)
  580.  
  581.   Purpose:
  582.  
  583.     Creates and returns an HDC of the type specified.
  584.  
  585.  
  586.   Returns: The HDC that it creates.
  587.  
  588.  
  589.   Comments:
  590.  
  591.     The NULL and INVALID HDCs are only useful to test if the common dialogs
  592.     handle an HDC that is not useful, but this function is also necessary
  593.     in that the HDC must be a printer HDC if ChooseFont() is called
  594.     with the CF_PRINTERFONTS flag bit set.
  595.  
  596.     To tell ChooseFont() to list only printer fonts:
  597.  
  598.     1.  Set the HDC in CDTEST's font dialog to "Printer"
  599.  
  600.     2.  Set the "Flags" edit box CF_PRINTERFONTS
  601.  
  602.  
  603. ************************************************************************/
  604.  
  605.  
  606.  
  607. HDC GetHdc(HWND hwnd, int nType)
  608. {
  609.   switch (nType)
  610.   {
  611.     case HDCSCREEN:
  612.         return GetDC(hwnd) ;
  613.         break ;
  614.  
  615.     case HDCNULL:
  616.         return (HDC) 0 ;
  617.         break ;
  618.  
  619.     case HDCINVALID:
  620.         return (HDC) 999 ;
  621.         break ;
  622.  
  623.     case HDCPRINTER:
  624.  
  625.         /* To get the HDC of the current printer, fill out a PRINTDLG
  626.            structure, and set it's flags to (PD_RETURNDC | PD_RETURNDEFAULT).
  627.            This will tell PrintDlg() to create you an HDC but not show
  628.            the Print dialog box. */
  629.  
  630.         pfd.lStructSize = sizeof(PRINTDLG) ;
  631.         pfd.hwndOwner = hwnd ;
  632.         pfd.hDevMode = (HANDLE) 0 ;
  633.         pfd.hDevNames = (HANDLE) 0 ;
  634.         pfd.Flags = PD_RETURNDC | PD_RETURNDEFAULT ;   //just get default printer
  635.         pfd.nFromPage = 0 ;
  636.         pfd.nToPage = 0 ;
  637.         pfd.nMinPage = 0 ;
  638.         pfd.nMaxPage = 0 ;
  639.         pfd.nCopies = 0 ;
  640.         pfd.hInstance = (HANDLE) hInst ;
  641.  
  642.         if (PrintDlg(&pfd) == 0)
  643.             MessageBox(hwnd, TEXT("Error: Could not create a printer DC!"),
  644.                        (LPTSTR) NULL, MB_OK | MB_ICONEXCLAMATION | MB_APPLMODAL) ;
  645.         else
  646.            return pfd.hDC ;
  647.  
  648.         break ;
  649.  
  650.     default:
  651.         break ;
  652.   }
  653.   return (HDC) 0 ;
  654. }
  655.  
  656.  
  657.  
  658.  
  659.  
  660.  
  661.  
  662.  
  663.  
  664. /************************************************************************
  665.  
  666.   Function: LogFontProc(HWND, int)
  667.  
  668.   Purpose:
  669.  
  670.     The callback proc for the LogFont dialog box
  671.  
  672.  
  673.   Returns: BOOL -- depending on the situation.
  674.  
  675.  
  676.   Comments:
  677.  
  678. ************************************************************************/
  679.  
  680.  
  681. BOOL APIENTRY LogFontProc(HWND hwnd, UINT msg, UINT wParam, LONG lParam)
  682. {
  683.   switch (msg)
  684.   {
  685.     case WM_INITDIALOG:
  686.         FillLogFontDlg(hwnd, cf.lpLogFont) ;  //start off with the one that
  687.                                               //is returned from ChooseFont()
  688.         break ;
  689.  
  690.     case WM_COMMAND:
  691.         switch(LOWORD(wParam))
  692.         {
  693.           case IDOK:
  694.  
  695.             GetLogFontDlg(hwnd, &lf) ;
  696.  
  697.             cf.lpLogFont = &lf ;
  698.  
  699.             EndDialog(hwnd, TRUE) ;
  700.  
  701.             break ;
  702.  
  703.  
  704.  
  705.           case ID_RESETLF:
  706.  
  707.             SetFocus(GetDlgItem(hwnd, ID_LFHEIGHT)) ;
  708.  
  709.             InitLogFontStruct(hwnd, &lf) ;
  710.  
  711.             FillLogFontDlg(hwnd, &lf) ;
  712.  
  713.             break ;
  714.  
  715.  
  716.           case IDCANCEL:
  717.  
  718.             EndDialog(hwnd, FALSE) ;
  719.  
  720.             break ;
  721.  
  722.  
  723.           default:
  724.             break ;
  725.         }
  726.  
  727.     default: break ;
  728.   }
  729.  
  730.  
  731.   return FALSE ;
  732. }
  733.  
  734.  
  735.  
  736.  
  737.  
  738.  
  739.  
  740. /************************************************************************
  741.  
  742.   Function: InitLogFontStruct(HWND, LPLOGFONT)
  743.  
  744.   Purpose:
  745.  
  746.     Fills the LOGFONT structure passed in as the second parameter with
  747.     some default values.
  748.  
  749.   Returns: Nothing.
  750.  
  751.   Comments:
  752.  
  753. ************************************************************************/
  754.  
  755. void InitLogFontStruct(HWND hwnd, LPLOGFONT plf)
  756. {
  757.   plf->lfHeight = 24 ;
  758.   plf->lfWidth  = 20 ;
  759.   plf->lfEscapement = 0 ;
  760.   plf->lfOrientation = 10 ;
  761.   plf->lfWeight = 400 ;
  762.   plf->lfItalic = FALSE ;
  763.   plf->lfUnderline = FALSE ;
  764.   plf->lfStrikeOut = FALSE ;
  765.   plf->lfCharSet = ANSI_CHARSET ;
  766.   plf->lfOutPrecision = OUT_DEFAULT_PRECIS ;
  767.   plf->lfClipPrecision = CLIP_DEFAULT_PRECIS ;
  768.   plf->lfQuality = DEFAULT_QUALITY ;
  769.   plf->lfPitchAndFamily = DEFAULT_PITCH | FF_DONTCARE ;
  770.  
  771.   szFaceName[0] = (TCHAR) 0 ;
  772.   lstrcpy(plf->lfFaceName, szFaceName) ;
  773. }
  774.  
  775.  
  776.  
  777.  
  778.  
  779.  
  780. /************************************************************************
  781.  
  782.   Function: FillLogFontDlg(HWND, LPLOGFONT)
  783.  
  784.   Purpose:
  785.  
  786.     Fills CDTEST's logfont dialog with the values in the logfont that
  787.     is passed in as the second parameter.
  788.  
  789.   Returns: Nothing.
  790.  
  791.   Comments:
  792.  
  793. ************************************************************************/
  794.  
  795. void FillLogFontDlg(HWND hwnd, LPLOGFONT plf)
  796. {
  797.   TCHAR szTemp[50] ;
  798.  
  799.   LPLOGFONT pl = plf ;
  800.  
  801.   if (bLogFontParam)    //Are creating this dialog in response to the
  802.     pl = &lfWM_CF_LF ;  //WM_CHOOSEFONT_GETLOGFONT message ?
  803.  
  804.   if (!pl)              //Avert a ghastly exception error
  805.     return ;
  806.  
  807.   wsprintf(szTemp, szLongFilter, pl->lfHeight) ;
  808.   SetDlgItemText(hwnd, ID_LFHEIGHT, szTemp) ;
  809.  
  810.   wsprintf(szTemp, szLongFilter, pl->lfWidth) ;
  811.   SetDlgItemText(hwnd, ID_LFWIDTH, szTemp) ;
  812.  
  813.   wsprintf(szTemp, szLongFilter, pl->lfEscapement) ;
  814.   SetDlgItemText(hwnd, ID_LFESCAPEMENT, szTemp) ;
  815.  
  816.   wsprintf(szTemp, szLongFilter, pl->lfOrientation) ;
  817.   SetDlgItemText(hwnd, ID_LFORIENTATION, szTemp) ;
  818.  
  819.   wsprintf(szTemp, szLongFilter, pl->lfWeight) ;
  820.   SetDlgItemText(hwnd, ID_LFWEIGHT, szTemp) ;
  821.  
  822.   wsprintf(szTemp, szShortFilter, pl->lfItalic) ;
  823.   SetDlgItemText(hwnd, ID_LFITALIC, szTemp) ;
  824.  
  825.   wsprintf(szTemp, szShortFilter, pl->lfUnderline) ;
  826.   SetDlgItemText(hwnd, ID_LFUNDERLINE, szTemp) ;
  827.  
  828.   wsprintf(szTemp, szShortFilter, pl->lfStrikeOut) ;
  829.   SetDlgItemText(hwnd, ID_LFSTRIKEOUT, szTemp) ;
  830.  
  831.   wsprintf(szTemp, szShortFilter, pl->lfCharSet) ;
  832.   SetDlgItemText(hwnd, ID_LFCHARSET, szTemp) ;
  833.  
  834.   wsprintf(szTemp, szShortFilter, pl->lfOutPrecision) ;
  835.   SetDlgItemText(hwnd, ID_LFOUTP, szTemp) ;
  836.  
  837.   wsprintf(szTemp, szShortFilter, pl->lfClipPrecision) ;
  838.   SetDlgItemText(hwnd, ID_LFCLIPP, szTemp) ;
  839.  
  840.   wsprintf(szTemp, szShortFilter, pl->lfQuality) ;
  841.   SetDlgItemText(hwnd, ID_LFQUALITY, szTemp) ;
  842.  
  843.   wsprintf(szTemp, szShortFilter, pl->lfPitchAndFamily) ;
  844.   SetDlgItemText(hwnd, ID_LFPITCHANDFAM, szTemp) ;
  845.  
  846.   SetDlgItemText(hwnd, ID_LFFACENAME, (LPTSTR) pl->lfFaceName) ;
  847. }
  848.  
  849.  
  850.  
  851.  
  852.  
  853.  
  854. /************************************************************************
  855.  
  856.   Function: GetLogFontDlg(HWND, LPLOGFONT)
  857.  
  858.   Purpose:
  859.  
  860.     Retrieves the users edits in CDTEST's Logfont dialog and puts them
  861.     into the LOGFONT struct that is passed as the second parameter.
  862.  
  863.   Returns: Nothing.
  864.  
  865.   Comments:
  866.  
  867. ************************************************************************/
  868.  
  869. void GetLogFontDlg(HWND hwnd, LPLOGFONT plf)
  870. {
  871.   BOOL b ;
  872.   TCHAR szNum[30] ;
  873.  
  874.   if (bLogFontParam)  //if we are just viewing the logfont because we sent a
  875.     return ;          //WM_CHOOSEFONT_GETLOGFONT message, don't change the Logfont Struct
  876.                       //that ChooseFont() gives us...
  877.  
  878.   #define LFSIZE 30
  879.  
  880.   GetDlgItemText(hwnd, ID_LFHEIGHT, szNum, LFSIZE) ;
  881.   plf->lfHeight = MyAtol(szNum, uMode == IDM_HEXMODE, &b) ;
  882.  
  883.   GetDlgItemText(hwnd, ID_LFWIDTH, szNum, LFSIZE) ;
  884.   plf->lfWidth = MyAtol(szNum, uMode == IDM_HEXMODE, &b) ;
  885.  
  886.   GetDlgItemText(hwnd, ID_LFESCAPEMENT, szNum, LFSIZE) ;
  887.   plf->lfEscapement = MyAtol(szNum, uMode == IDM_HEXMODE, &b) ;
  888.  
  889.   GetDlgItemText(hwnd, ID_LFORIENTATION, szNum, LFSIZE) ;
  890.   plf->lfOrientation = MyAtol(szNum, uMode == IDM_HEXMODE, &b) ;
  891.  
  892.   GetDlgItemText(hwnd, ID_LFWEIGHT, szNum, LFSIZE) ;
  893.   plf->lfWeight = MyAtol(szNum, uMode == IDM_HEXMODE, &b) ;
  894.  
  895.   GetDlgItemText(hwnd, ID_LFITALIC, szNum, LFSIZE) ;
  896.   plf->lfItalic = (BYTE) MyAtol(szNum, uMode == IDM_HEXMODE, &b) ;
  897.  
  898.   GetDlgItemText(hwnd, ID_LFUNDERLINE, szNum, LFSIZE) ;
  899.   plf->lfUnderline = (BYTE) MyAtol(szNum, uMode == IDM_HEXMODE, &b) ;
  900.  
  901.   GetDlgItemText(hwnd, ID_LFSTRIKEOUT, szNum, LFSIZE) ;
  902.   plf->lfStrikeOut = (BYTE) MyAtol(szNum, uMode == IDM_HEXMODE, &b) ;
  903.  
  904.   GetDlgItemText(hwnd, ID_LFCHARSET, szNum, LFSIZE) ;
  905.   plf->lfCharSet = (BYTE) MyAtol(szNum, uMode == IDM_HEXMODE, &b) ;
  906.  
  907.   GetDlgItemText(hwnd, ID_LFOUTP, szNum, LFSIZE) ;
  908.   plf->lfOutPrecision = (BYTE) MyAtol(szNum, uMode == IDM_HEXMODE, &b) ;
  909.  
  910.   GetDlgItemText(hwnd, ID_LFCLIPP, szNum, LFSIZE) ;
  911.   plf->lfClipPrecision = (BYTE) MyAtol(szNum, uMode == IDM_HEXMODE, &b) ;
  912.  
  913.   GetDlgItemText(hwnd, ID_LFQUALITY, szNum, LFSIZE) ;
  914.   plf->lfQuality = (BYTE) MyAtol(szNum, uMode == IDM_HEXMODE, &b) ;
  915.  
  916.   GetDlgItemText(hwnd, ID_LFPITCHANDFAM, szNum, LFSIZE) ;
  917.   plf->lfPitchAndFamily = (BYTE) MyAtol(szNum, uMode == IDM_HEXMODE, &b) ;
  918.  
  919.   GetDlgItemText(hwnd, ID_LFFACENAME, (LPTSTR) plf->lfFaceName, 32) ;
  920. }
  921.  
  922.  
  923.  
  924.  
  925.  
  926.  
  927.  
  928.  
  929. /************************************************************************
  930.  
  931.   Function: FontHookProc(HWND, UINT, UINT, LONG)
  932.  
  933.   Purpose: The callback function that acts as the hook proc for
  934.            the ChooseFont() dialog.
  935.  
  936.  
  937.   Returns: TRUE to discard the message.  FALSE to send the message on
  938.            to the normal dialog processing done by the ChooseFont()
  939.            function.
  940.  
  941.   Comments:
  942.  
  943. ************************************************************************/
  944.  
  945. UINT APIENTRY FontHookProc(HWND hwnd, UINT msg, UINT wParam, LONG lParam)
  946. {
  947.   LPCHOOSEFONT pCf ;
  948.   TCHAR szMsg[50] ;
  949.  
  950.   switch(msg)
  951.   {
  952.     case WM_INITDIALOG:
  953.  
  954.       pCf = (LPCHOOSEFONT) lParam ;
  955.  
  956.       if (pCf->lCustData != 0L)
  957.       {
  958.         wsprintf(szMsg, TEXT("CHOOSEFONT->lCustData is: %ld"), pCf->lCustData) ;
  959.         MessageBox(hwnd, szMsg, TEXT("lCustData Sent!"), MB_OK) ;
  960.       }
  961.  
  962.       SetWindowText(hwnd, TEXT("Font Hook Proc Dialog")) ;
  963.  
  964.       break ;
  965.  
  966.     case WM_COMMAND:
  967.  
  968.         /* NOTE: This button will only be available if the user creates the
  969.            ChooseFont() dialog with the CF_ENABLETEMPLATE or CF_ENABLETEMPLATEHANDLE
  970.            flag.
  971.  
  972.            This button will only work if the ChooseFont() dialog is created
  973.            with the CF_ENABLEHOOK flag.  So, to get full functionality from
  974.            this button:
  975.  
  976.            1.  Enter (CF_ENABLEHOOK | CF_ENABLETEMPLATE | CF_SCREENFONTS)
  977.                in the "Flags" edit box of CDTEST'S Font dialog.
  978.  
  979.            2.  Click OK
  980.         */
  981.  
  982.  
  983.  
  984.         /* The parent will send the WM_CHOOSEFONT_GETLOGFONT message and
  985.            display it's findings in a LogFont dialog if it gets this message */
  986.  
  987.         if (LOWORD(wParam) == ID_SEND_WM_CF_LF_MSG)
  988.           SendMessage(GetParent(hwnd), WM_CF_LF, 0, (LPARAM) hwnd) ;
  989.  
  990.         break ;
  991.  
  992.  
  993.     default:
  994.       break ;
  995.   }
  996.  
  997.   return FALSE ;   //send msg to the common dialog code
  998. }
  999.  
  1000.  
  1001.  
  1002.  
  1003.  
  1004.  
  1005.  
  1006.  
  1007.  
  1008. /************************************************************************
  1009.  
  1010.   Function: GetFontDlgHandle(void)
  1011.  
  1012.   Purpose:  Finds and loads the custom template resource and returns a
  1013.             handle to it.
  1014.  
  1015.  
  1016.   Returns: A handle to the custom template resource.
  1017.  
  1018.   Comments:
  1019.  
  1020. ************************************************************************/
  1021.  
  1022. HANDLE GetFontDlgHandle(void)
  1023. {
  1024.  
  1025.   hResFont = FindResource(hInst, TEXT("fonttemp"), RT_DIALOG) ;
  1026.  
  1027.   hDialogFont = LoadResource(hInst, hResFont) ;
  1028.  
  1029.  
  1030.   return hDialogFont ;
  1031. }
  1032.  
  1033.  
  1034.  
  1035.  
  1036.  
  1037.  
  1038.  
  1039.  
  1040. /************************************************************************
  1041.  
  1042.   Function: EnumFontsProc(LPLOGFONT, LPTEXTMETRIC, DWORD, LONG)
  1043.  
  1044.   Purpose: Acts as a callback function for the EnumFontFamilies()
  1045.            function.
  1046.  
  1047.   Returns: 0 if the font enumeration should stop.  1 to ask for the
  1048.            next font.
  1049.  
  1050.   Comments:
  1051.  
  1052.     EnumFontFamilies will find the fonts on the system and call this
  1053.     function each time it finds a font.  Pointers to the LOGFONT and
  1054.     TEXTMETRIC structures the describe the font are passed as the first
  1055.     and second arguments, so we can determine if the fonts we get
  1056.     meet the specs we want.  If they do, we can add them to the font
  1057.     list box in CDTEST's Font dialog.
  1058.  
  1059.     NOTE:
  1060.  
  1061.     None of this affects the performance of ChooseFont().  This serves
  1062.     only to illustrate how ChooseFont() finds the fonts you request based
  1063.     on the flags you pass to the ChooseFont() function.
  1064.  
  1065.     The fonts found with this function should be the same as the ones
  1066.     found by ChooseFont() for any flag combination.
  1067.  
  1068.  
  1069. ************************************************************************/
  1070.  
  1071.  
  1072. int CALLBACK EnumFontsProc(LPLOGFONT lplf, LPTEXTMETRIC lptm,
  1073.                            DWORD dwStyle, LONG lParam)
  1074. {
  1075.   UINT i ;
  1076.  
  1077.   /* check to see if the font is already there right off the bat
  1078.      and just continue the enumeration if it is...        */
  1079.  
  1080.  
  1081.   i = SendDlgItemMessage((HWND) lParam, ID_FONTLIST, LB_FINDSTRINGEXACT, (WPARAM) 0,
  1082.                          (LONG) (LPTSTR) lplf->lfFaceName) ;
  1083.  
  1084.   if (i != LB_ERR)
  1085.   {
  1086.     if (bScreen)     //if we are adding it for the first time
  1087.       return 1 ;
  1088.  
  1089.     //else, we are adding printer fonts, so if we find one that is already there
  1090.     //it must be available for both the printer and the screen...
  1091.  
  1092.     else
  1093.     {
  1094.       SendDlgItemMessage((HWND) lParam, ID_FONTLIST, LB_SETITEMDATA, i,
  1095.                           FONT_TYPE_WYSIWYG) ;
  1096.       return 1 ;
  1097.     }
  1098.   }
  1099.  
  1100.  
  1101.   //Get rid of any fonts that we don't want...
  1102.  
  1103.   if ((dwFontFlag & CF_TTONLY) && (!(dwStyle & TRUETYPE_FONTTYPE)))
  1104.     return 1 ;
  1105.  
  1106.   if ((dwFontFlag & CF_SCALABLEONLY) && (dwStyle & RASTER_FONTTYPE))
  1107.     return 1 ;
  1108.  
  1109.   if ((dwFontFlag & CF_ANSIONLY) && (lplf->lfCharSet != ANSI_CHARSET))
  1110.     return 1 ;
  1111.  
  1112.   if ((dwFontFlag & CF_FIXEDPITCHONLY) && (lplf->lfPitchAndFamily & VARIABLE_PITCH))
  1113.     return 1 ;
  1114.  
  1115.   if ((dwFontFlag & CF_NOVECTORFONTS) && (lplf->lfCharSet == OEM_CHARSET))
  1116.     return 1 ;
  1117.  
  1118.  
  1119.   //if there is a font to be added, add it.
  1120.  
  1121.   if (*(lplf->lfFaceName))
  1122.     SendDlgItemMessage((HWND) lParam, ID_FONTLIST, LB_ADDSTRING,
  1123.                      (WPARAM) 0, (LONG) (LPTSTR) lplf->lfFaceName) ;
  1124.  
  1125.   return 1 ;
  1126. }
  1127.  
  1128.  
  1129.  
  1130.  
  1131.  
  1132.  
  1133.  
  1134.  
  1135. /************************************************************************
  1136.  
  1137.   Function: FillFontsBox(HWND, DWORD)
  1138.  
  1139.   Purpose: Enumerates all fonts on the system and sends the ones that
  1140.            meet the criteria of the dwFlags parameter (CF_SCREENFONTS,
  1141.            CF_SCALABLEONLY, etc).
  1142.  
  1143.   Returns: Nothing.
  1144.  
  1145.   Comments:
  1146.  
  1147.  
  1148. ************************************************************************/
  1149.  
  1150. void FillFontsBox(HWND hwnd, DWORD dwFlags)
  1151. {
  1152.   HDC hdc ;
  1153.   HWND hwndControl ;
  1154.   DWORD dwData ;
  1155.   int nItemCount ;
  1156.  
  1157.  
  1158.   /* Empty the list box, and turn of the redraw because we may need
  1159.      to remove some fonts after they are added if the user calls this
  1160.      function with the CF_WYSIWYG flag bit set. */
  1161.  
  1162.   SendDlgItemMessage(hwnd, ID_FONTLIST, LB_RESETCONTENT, (WPARAM)0, (LPARAM) 0) ;
  1163.  
  1164.   hwndControl = GetDlgItem(hwnd, ID_FONTLIST) ;
  1165.  
  1166.   SendMessage(hwndControl, WM_SETREDRAW, FALSE, 0L) ;
  1167.  
  1168.  
  1169.   /* Now call EnumFontFamilies() for each type of HDC requested */
  1170.  
  1171.   if (dwFlags & CF_SCREENFONTS)
  1172.   {
  1173.     bScreen = TRUE ;
  1174.     hdc = GetHdc(hwnd, HDCSCREEN) ;
  1175.     EnumFontFamilies(hdc, (LPTSTR) NULL, (FONTENUMPROC) EnumFontsProc, (LONG) hwnd) ;
  1176.     ReleaseDC(hwnd, hdc) ;
  1177.   }
  1178.  
  1179.   if (dwFlags & CF_PRINTERFONTS)
  1180.   {
  1181.     bScreen = FALSE ;
  1182.     hdc = GetHdc(hwnd, HDCPRINTER) ;
  1183.     EnumFontFamilies(hdc, (LPTSTR) NULL, (FONTENUMPROC) EnumFontsProc, (LONG) hwnd) ;
  1184.     ReleaseDC(hwnd, hdc) ;
  1185.   }
  1186.  
  1187.  
  1188.   /* Special case:  If the CF_WYSIWYG flag is used, we have to enumerate
  1189.      the fonts in both HDCs and then remove all the ones that are not
  1190.      both printer fonts and screen fonts. */
  1191.  
  1192.   if (dwFontFlag & CF_WYSIWYG)
  1193.   {
  1194.     nItemCount = SendDlgItemMessage(hwnd, ID_FONTLIST, LB_GETCOUNT, 0, 0L) ;
  1195.  
  1196.     nItemCount-- ;   //the list is zero based
  1197.  
  1198.     while (nItemCount >= 0)
  1199.     {
  1200.       dwData = SendDlgItemMessage(hwnd, ID_FONTLIST, LB_GETITEMDATA, nItemCount, 0L) ;
  1201.  
  1202.       if (dwData != FONT_TYPE_WYSIWYG)
  1203.       {
  1204.         SendDlgItemMessage(hwnd, ID_FONTLIST, LB_DELETESTRING, nItemCount, 0L) ;
  1205.       }
  1206.  
  1207.       nItemCount-- ;
  1208.     }
  1209.   }
  1210.  
  1211.  
  1212.   /* Now redraw the font list */
  1213.  
  1214.   SendMessage(hwndControl, WM_SETREDRAW, TRUE, 0L) ;
  1215.   InvalidateRect(hwndControl, NULL, FALSE) ;
  1216.  
  1217.   return ;
  1218. }
  1219.  
  1220.  
  1221.  
  1222.  
  1223.  
  1224.  
  1225. /************************************************************************
  1226.  
  1227.   Function: ResetCheckBoxes(HWND)
  1228.  
  1229.   Purpose: Checks the checkboxes that control what fonts are listed in
  1230.            CDTEST's font list box.
  1231.  
  1232.   Returns: Nothing.
  1233.  
  1234.   Comments:
  1235.  
  1236.  
  1237. ************************************************************************/
  1238.  
  1239. void ResetCheckBoxes(HWND hwnd)
  1240. {
  1241.  
  1242.   SendDlgItemMessage(hwnd, F_TTONLY,          BM_SETCHECK, dwFontFlag & CF_TTONLY         ? 1 : 0, (LPARAM)0) ;
  1243.   SendDlgItemMessage(hwnd, F_ANSIONLY,        BM_SETCHECK, dwFontFlag & CF_ANSIONLY       ? 1 : 0, (LPARAM)0) ;
  1244.   SendDlgItemMessage(hwnd, F_SCREENFONTS,     BM_SETCHECK, dwFontFlag & CF_SCREENFONTS    ? 1 : 0, (LPARAM)0) ;
  1245.   SendDlgItemMessage(hwnd, F_PRINTERFONTS,    BM_SETCHECK, dwFontFlag & CF_PRINTERFONTS   ? 1 : 0, (LPARAM)0) ;
  1246.   SendDlgItemMessage(hwnd, F_NOOEMFONTS,      BM_SETCHECK, dwFontFlag & CF_NOOEMFONTS     ? 1 : 0, (LPARAM)0) ;
  1247.   SendDlgItemMessage(hwnd, F_NOVECTORFONTS,   BM_SETCHECK, dwFontFlag & CF_NOVECTORFONTS  ? 1 : 0, (LPARAM)0) ;
  1248.   SendDlgItemMessage(hwnd, F_SCALABLEONLY,    BM_SETCHECK, dwFontFlag & CF_SCALABLEONLY   ? 1 : 0, (LPARAM)0) ;
  1249.   SendDlgItemMessage(hwnd, F_WYSIWYG,         BM_SETCHECK, dwFontFlag & CF_WYSIWYG        ? 1 : 0, (LPARAM)0) ;
  1250.   SendDlgItemMessage(hwnd, F_FIXEDPITCHONLY,  BM_SETCHECK, dwFontFlag & CF_FIXEDPITCHONLY ? 1 : 0, (LPARAM)0) ;
  1251.  
  1252. }
  1253.  
  1254.  
  1255.  
  1256.  
  1257.  
  1258.  
  1259. /************************************************************************
  1260.  
  1261.   Function: HandleFontCheckBox(HWND)
  1262.  
  1263.   Purpose: If the user clicks one of the fonts in the CDTEST's list of
  1264.            valid font types, this function will check the correct boxes
  1265.            and set the correct values in the flag which keeps track of
  1266.            which fonts are to be enumerated and added to CDTEST's font
  1267.            list box.
  1268.  
  1269.  
  1270.   Returns: Nothing.
  1271.  
  1272.   Comments:
  1273.  
  1274.     CF_NOOEMFONTS and CF_NOVECTORFONTS are identical.
  1275.  
  1276.  
  1277. ************************************************************************/
  1278.  
  1279. void HandleFontCheckBox(HWND hwnd, int nID)
  1280. {
  1281.   DWORD dwTemp ;
  1282.  
  1283.   dwTemp = dwFontFlag ;
  1284.  
  1285.   switch (nID)
  1286.   {
  1287.     case F_TTONLY:
  1288.  
  1289.       /* TTONLY is a special case.  If we only want Truetype fonts,
  1290.          turn off irrelevant flags */
  1291.  
  1292.       if (!(dwFontFlag & CF_TTONLY)) //if we're turning this flag on...
  1293.       {
  1294.         dwFontFlag = 0L ;  //turn everyone off but the following:
  1295.  
  1296.         dwFontFlag |= CF_TTONLY ;
  1297.  
  1298.         if (dwTemp & CF_ANSIONLY)
  1299.           dwFontFlag |= CF_ANSIONLY ;
  1300.  
  1301.         if (dwTemp & CF_FIXEDPITCHONLY)
  1302.           dwFontFlag |= CF_FIXEDPITCHONLY ;
  1303.  
  1304.         if (dwTemp & CF_SCREENFONTS)
  1305.           dwFontFlag |= CF_SCREENFONTS ;
  1306.  
  1307.         if (dwTemp & CF_PRINTERFONTS)
  1308.           dwFontFlag |= CF_PRINTERFONTS ;
  1309.       }
  1310.       else
  1311.       {
  1312.         dwFontFlag ^= CF_TTONLY ;
  1313.       }
  1314.  
  1315.  
  1316.       break ;
  1317.  
  1318.     case F_ANSIONLY:
  1319.       dwFontFlag ^= CF_ANSIONLY ;        //otherwise toggle the bit.
  1320.       dwFontFlag &= ~CF_WYSIWYG ;
  1321.  
  1322.       break ;
  1323.  
  1324.     case F_PRINTERFONTS:
  1325.       dwFontFlag ^= CF_PRINTERFONTS ;
  1326.  
  1327.       break ;
  1328.  
  1329.     case F_SCREENFONTS:
  1330.       dwFontFlag ^= CF_SCREENFONTS ;
  1331.  
  1332.       break ;
  1333.  
  1334.     case F_FIXEDPITCHONLY:
  1335.       dwFontFlag ^= CF_FIXEDPITCHONLY ;
  1336.  
  1337.       break ;
  1338.  
  1339.     case F_NOOEMFONTS:
  1340.       dwFontFlag ^= CF_NOOEMFONTS ;
  1341.  
  1342.       break ;
  1343.  
  1344.     case F_NOVECTORFONTS:
  1345.       dwFontFlag ^= CF_NOVECTORFONTS ;
  1346.  
  1347.       break ;
  1348.  
  1349.     case F_SCALABLEONLY:
  1350.       dwFontFlag ^= CF_SCALABLEONLY ;
  1351.  
  1352.       break ;
  1353.  
  1354.     case F_WYSIWYG:                        //We want fonts for both the
  1355.                                            //screen and the printer...
  1356.       dwFontFlag ^= CF_WYSIWYG ;
  1357.  
  1358.       if (dwFontFlag & CF_WYSIWYG)
  1359.         dwFontFlag |= (CF_SCREENFONTS | CF_PRINTERFONTS | CF_SCALABLEONLY) ;
  1360.  
  1361.       break ;
  1362.  
  1363.     default: break ;
  1364.   }
  1365.  
  1366.   ResetCheckBoxes(hwnd) ;
  1367.   FillFontsBox(hwnd, dwFontFlag) ;
  1368. }
  1369.  
  1370.  
  1371.  
  1372.  
  1373.  
  1374.  
  1375.  
  1376. /************************************************************************
  1377.  
  1378.   Function: DoChooseFontStuff(HWND, LPCHOOSEFONT)
  1379.  
  1380.   Purpose:
  1381.  
  1382.     Calls the ChooseFont() function.
  1383.  
  1384.   Returns: Nothing.
  1385.  
  1386.   Comments:
  1387.  
  1388.  
  1389. ************************************************************************/
  1390.  
  1391.  
  1392. void DoChooseFontStuff(HWND hwnd, LPCHOOSEFONT pcf)
  1393. {
  1394.   BOOL bRet = FALSE ;
  1395.  
  1396.   if (IsDlgButtonChecked(hwnd, ID_PRELOADEDFONT) == 1)
  1397.   {
  1398.     pcf->hInstance = GetFontDlgHandle() ;
  1399.     wsprintf(szTemp, szLongFilter, pcf->hInstance) ;
  1400.     SetDlgItemText(hwnd, ID_HINSTANCEF, szTemp) ;
  1401.   }
  1402.  
  1403.   pcf->hDC = GetHdc(hwnd, nHdcType) ;
  1404.  
  1405.   wsprintf(szTemp, szLongFilter, pcf->hDC) ;
  1406.   SetDlgItemText(hwnd, ID_HDCF, szTemp) ;
  1407.  
  1408.  
  1409.   GetFontDlg(hwnd, pcf) ;
  1410.  
  1411.  
  1412.   if (IsDlgButtonChecked(hwnd, ID_NULLSTRUCTFONT) == 1)
  1413.     bRet = ChooseFont((LPCHOOSEFONT)NULL) ;
  1414.   else
  1415.     bRet = ChooseFont(pcf) ;
  1416.  
  1417.   wsprintf(szTemp, szLongFilter, CommDlgExtendedError()) ;
  1418.   SetDlgItemText(hwnd, ID_ERRORF, szTemp) ;
  1419.  
  1420.   if (pcf->hDC)
  1421.   {
  1422.     ReleaseDC(hwnd, pcf->hDC) ;   //free the HDC that we used if we called
  1423.     pcf->hDC = (HDC) 0 ;          //the function with a valid HDC.
  1424.   }
  1425.  
  1426.   if (hDialogFont)
  1427.   {
  1428.     FreeResource(hDialogFont) ;
  1429.     hDialogFont = (HANDLE) 0 ;
  1430.     hResFont = (HANDLE) 0 ;
  1431.   }
  1432.  
  1433.   wsprintf(szTemp, szShortFilter, bRet) ;     //fill results into the Font dlg
  1434.   SetDlgItemText(hwnd, ID_RETURNF, szTemp) ;
  1435.  
  1436.   FillFontDlg(hwnd, pcf) ;
  1437. }
  1438.  
  1439.  
  1440.  
  1441.  
  1442.  
  1443.  
  1444. /************************************************************************
  1445.  
  1446.   Function: FontThreadProc1(LPDWORD)
  1447.  
  1448.   Purpose:
  1449.  
  1450.     Acts as the starting address for thread 1
  1451.  
  1452.   Returns: Any DWORD value.
  1453.  
  1454.   Comments:
  1455.  
  1456.  
  1457. ************************************************************************/
  1458.  
  1459. DWORD FontThreadProc1(LPDWORD pdw)
  1460. {
  1461.   DoChooseFontStuff(hwndMainFont, &cfThread1) ;
  1462.  
  1463.   PostMessage(hwndMainFont, UMSG_DECREMENTDLGCOUNT, 0, 0L ) ;
  1464.  
  1465.   return 0L ;
  1466. }
  1467.  
  1468.  
  1469.  
  1470.  
  1471.  
  1472.  
  1473.  
  1474. /************************************************************************
  1475.  
  1476.   Function: FontThreadProc2(LPDWORD)
  1477.  
  1478.   Purpose:
  1479.  
  1480.     Acts as the starting address for thread 2
  1481.  
  1482.   Returns: Any DWORD value.
  1483.  
  1484.   Comments:
  1485.  
  1486.  
  1487. ************************************************************************/
  1488.  
  1489.  
  1490. DWORD FontThreadProc2(LPDWORD pdw)
  1491. {
  1492.   DoChooseFontStuff(hwndMainFont, &cfThread2) ;
  1493.  
  1494.   PostMessage(hwndMainFont, UMSG_DECREMENTDLGCOUNT, 0, 0L ) ;
  1495.  
  1496.   return 0L ;
  1497. }
  1498.  
  1499.  
  1500.  
  1501.  
  1502.  
  1503.  
  1504.  
  1505. /************************************************************************
  1506.  
  1507.   Function: MultiThreadFontDlg(void)
  1508.  
  1509.   Purpose:
  1510.  
  1511.     Create the two threads that will in turn create two ChooseFont()
  1512.     dialogs.
  1513.  
  1514.   Returns: Nothing.
  1515.  
  1516.   Comments:
  1517.  
  1518.     Multithreading note:
  1519.  
  1520.     This function will return before the common dialog functions return.
  1521.     Therefore, do not pass any parameters to this function that will be
  1522.     referenced by the common dialogs because as soon as this function
  1523.     ends those parameters will be gone.
  1524.  
  1525. ************************************************************************/
  1526.  
  1527. void MultiThreadFontDlg(void)
  1528. {
  1529.  
  1530.   dwFontThreadParm1 = dwFontThreadParm2 = 0L ;
  1531.  
  1532.   if (!(hFontThread1 = CreateThread((LPSECURITY_ATTRIBUTES) NULL, 0,
  1533.                                      (LPTHREAD_START_ROUTINE) FontThreadProc1,
  1534.                                      &dwFontThreadParm1, CREATE_SUSPENDED, &dwFontThreadID1)))
  1535.  
  1536.   {
  1537.     MessageBox(GetForegroundWindow(), TEXT("Error creating thread 1"), NULL,
  1538.                MB_OK | MB_ICONEXCLAMATION | MB_APPLMODAL) ;
  1539.  
  1540.     nOpenFontDialogCount = 0 ;
  1541.  
  1542.     EnableFontButtons(hwndMainFont, TRUE) ;
  1543.  
  1544.     return ;
  1545.   }
  1546.  
  1547.  
  1548.   if (!(hFontThread2 = CreateThread((LPSECURITY_ATTRIBUTES) NULL, 0,
  1549.                                      (LPTHREAD_START_ROUTINE) FontThreadProc2,
  1550.                                      &dwFontThreadParm2, CREATE_SUSPENDED, &dwFontThreadID2)))
  1551.   {
  1552.     MessageBox(GetForegroundWindow(), TEXT("Error creating thread 2"), NULL,
  1553.                MB_OK | MB_ICONEXCLAMATION | MB_APPLMODAL) ;
  1554.  
  1555.     nOpenFontDialogCount = 0 ;
  1556.  
  1557.     EnableFontButtons(hwndMainFont, TRUE) ;
  1558.  
  1559.     return ;
  1560.   }
  1561.  
  1562.   ResumeThread(hFontThread1) ;
  1563.   ResumeThread(hFontThread2) ;
  1564.  
  1565.   return ;
  1566. }
  1567.  
  1568.  
  1569.  
  1570.  
  1571.  
  1572.  
  1573. /************************************************************************
  1574.  
  1575.   Function: EnableFontButtons(HWND, BOOL)
  1576.  
  1577.   Purpose:
  1578.  
  1579.     Enables or disables CDTEST's font dialogs buttons based on the
  1580.     status of the second parameter.
  1581.  
  1582.  
  1583.   Returns: Nothing.
  1584.  
  1585.   Comments:
  1586.  
  1587.     This is necessary when multithreading in the case of this application.
  1588.  
  1589. ************************************************************************/
  1590.  
  1591. void EnableFontButtons(HWND hwnd, BOOL bEnable)
  1592. {
  1593.   EnableWindow(GetDlgItem(hwnd, IDOK), bEnable) ;
  1594.   EnableWindow(GetDlgItem(hwnd, IDCANCEL), bEnable) ;
  1595.   EnableWindow(GetDlgItem(hwnd, ID_RESETFONT), bEnable) ;
  1596.   EnableWindow(GetDlgItem(hwnd, ID_MULTITHREADFONT), bEnable) ;
  1597.   EnableWindow(GetDlgItem(hwnd, ID_EDITLOGFONT), bEnable) ;
  1598. }
  1599.