|
|
1.1 root 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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.