|
|
1.1 root 1: /****************************************************************************
2:
3: PROGRAM: ShowUni.c
4:
5: PURPOSE: Adds, deletes, creates and displays fonts
6:
7: FUNCTIONS:
8:
9: WinMain() - calls initialization function, processes message loop
10: EditfileInit() - initializes window data and registers window
11: EditfileWndProc() - processes messages
12: About() - processes messages for "About" dialog box
13: SelectFont() - select a font
14:
15: ****************************************************************************/
16:
17: #include <windows.h>
18: #include <string.h>
19: #include "showuni.h"
20: #include <commdlg.h>
21:
22: struct __range {
23: int low;
24: int high;
25: } range[] = {
26: {0x20, 0x7f}, //ASCII
27: {0xa0, 0xff}, //Latin
28: {0x100, 0x17f}, //European Latin
29: {0x180, 0x1f0}, //Extended Latin
30: {0x250, 0x2a8}, //Standard Phonetic
31: {0x2b0, 0x2e9}, //Modifier Letters
32: {0x300, 0x341}, //Generic Diacritical
33: {0x370, 0x3f5}, //Greek
34: {0x400, 0x486}, //Cyrillic
35: {0x490, 0x4cc}, //Extended Cyrillic
36: {0x5b0, 0x5f5}, //Hebrew
37: {0x20a0,0x20aa}, //Currency Symbols
38: {0x2100,0x2138}, //Letterlike Symbols
39: {0x2190,0x21ea}, //Arrows
40: {0x2200,0x22f1} }; //Math Operators
41:
42: HANDLE hInst;
43:
44: HFONT hFont;
45: TCHAR FontNameList[32][128]; /* list of added fonts */
46: INT nFontIndex = 0; /* position in FontList */
47: INT nLineSpace;
48:
49: TEXTMETRIC TextMetric;
50: LOGFONT LogFont;
51: POINT ptCurrent = {0, 0};
52: TCHAR FontList[MAXFONT][32];
53: INT FontIndex = 0;
54: INT CurrentFont = 0;
55: DLGPROC lpDlg;
56: FONTENUMPROC lpEnumFunc;
57: TCHAR AppName[] = TEXT("ShowUnicode Sample Application");
58: TCHAR WindowTitle[80];
59: TCHAR OutBuffer[257];
60: int low=0x20, high=0x7f;
61: int CurrentButton=ID_ASCII;
62:
63:
64: /****************************************************************************
65:
66: FUNCTION: WinMain(HANDLE, HANDLE, LPTSTR, int)
67:
68: PURPOSE: calls initialization function, processes message loop
69:
70: ****************************************************************************/
71:
72: int WINAPI WinMain(HANDLE hInstance, HANDLE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
73: {
74: HWND hWnd;
75: MSG msg;
76:
77:
78: if (!hPrevInstance)
79: if (!ShowUniInit(hInstance))
80: return (FALSE);
81:
82: hInst = hInstance;
83:
84: lstrcpy(WindowTitle, AppName);
85: lstrcat(WindowTitle, TEXT(" : Lucida Sans Unicode"));
86:
87: hWnd = CreateWindow(TEXT("ShowUni"),
88: WindowTitle,
89: WS_OVERLAPPEDWINDOW,
90: CW_USEDEFAULT,
91: CW_USEDEFAULT,
92: CW_USEDEFAULT,
93: CW_USEDEFAULT,
94: NULL,
95: NULL,
96: hInstance,
97: NULL);
98:
99: if (!hWnd)
100: return (FALSE);
101:
102: ShowWindow(hWnd, nCmdShow);
103: UpdateWindow(hWnd);
104:
105: while (GetMessage(&msg, NULL, NULL, NULL)) {
106: TranslateMessage(&msg);
107: DispatchMessage(&msg);
108: }
109: return (msg.wParam);
110: }
111:
112: /****************************************************************************
113:
114: FUNCTION: ShowUniInit(HANDLE)
115:
116: PURPOSE: Initializes window data and registers window class
117:
118: ****************************************************************************/
119:
120: INT ShowUniInit(HANDLE hInstance)
121: {
122: HANDLE hMemory;
123: PWNDCLASS pWndClass;
124: BOOL bSuccess;
125:
126: hMemory = LocalAlloc(LPTR, sizeof(WNDCLASS));
127: if(!hMemory){
128: MessageBox(NULL, TEXT("<ShowUniInit> Not enough memory."), NULL, MB_OK | MB_ICONHAND);
129: return(FALSE);
130: }
131:
132: pWndClass = (PWNDCLASS) LocalLock(hMemory);
133: pWndClass->hCursor = LoadCursor(NULL, IDC_ARROW);
134: pWndClass->hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDC_SHOWUNI));
135: pWndClass->lpszMenuName = MAKEINTRESOURCE(IDM_SHOWUNI);
136: pWndClass->lpszClassName = (LPTSTR) TEXT("ShowUni");
137: pWndClass->hbrBackground = GetStockObject(WHITE_BRUSH);
138: pWndClass->hInstance = hInstance;
139: pWndClass->style = NULL;
140: pWndClass->lpfnWndProc = ShowUniWndProc;
141:
142: bSuccess = RegisterClass((LPWNDCLASS) pWndClass);
143:
144: LocalUnlock(hMemory);
145: LocalFree(hMemory);
146: return (bSuccess);
147: }
148:
149:
150: /****************************************************************************
151:
152: FUNCTION: ShowCharacters(HDC, INT, INT)
153:
154: PURPOSE: display character set using current font
155:
156: ****************************************************************************/
157:
158: VOID ShowCharacters(
159: HDC hDC,
160: int low,
161: int high
162: )
163: {
164: HFONT hOldFont;
165: TEXTMETRIC TextMetric;
166: UINT X;
167: UINT Y;
168: int i;
169: LPTSTR p;
170:
171: GetTextMetrics(hDC, &TextMetric);
172: hFont = CreateFont( TextMetric.tmHeight, TextMetric.tmAveCharWidth, 0, 0,
173: FW_NORMAL, FALSE, FALSE, FALSE,
174: UNICODE_CHARSET,
175: OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
176: DEFAULT_QUALITY, DEFAULT_PITCH,
177: FontList[CurrentFont]);
178:
179: for (i=low ; i<=high ; i++) {
180: OutBuffer[i-low] = (TCHAR)i;
181: }
182:
183: if (!(hOldFont = SelectObject(hDC, hFont)))
184: return;
185: GetTextMetrics(hDC, &TextMetric);
186: nLineSpace = TextMetric.tmHeight + TextMetric.tmExternalLeading + 1;
187: X = ptCurrent.x;
188: Y = ptCurrent.y;
189:
190: for (p=OutBuffer,i=high-low+1 ; i>64 ; i-=64,p+=64,Y+=nLineSpace) {
191: TextOut(hDC, X, Y, p, 64);
192: }
193: TextOut(hDC, X, Y, p, i);
194: SelectObject(hDC, hOldFont);
195: }
196:
197:
198: /****************************************************************************
199:
200: FUNCTION: EnumFunc(LPLOGFONT, LPTEXTMETRIC, DWORD, LPARAM)
201:
202: PURPOSE: Finds unicode fonts
203:
204: ****************************************************************************/
205:
206: INT APIENTRY EnumFunc(
207: LPLOGFONT lpLogFont,
208: LPTEXTMETRIC lpTextMetric,
209: DWORD FontType,
210: LPARAM lpData)
211: {
212: if ((int)lpData == 0) {
213: if (lpLogFont->lfCharSet != UNICODE_CHARSET)
214: return 1;
215: lstrcpy((LPTSTR)FontList[FontIndex],
216: (LPTSTR)(lpLogFont->lfFaceName));
217: return (++FontIndex);
218: }
219: else
220: return 0;
221: }
222:
223: /****************************************************************************
224:
225: FUNCTION: GetFonts(HWND)
226:
227: PURPOSE: Get available fonts
228:
229: ****************************************************************************/
230:
231: VOID GetFonts(HWND hWnd)
232: {
233: #if 0
234: HDC hDC;
235:
236: FontIndex = 0;
237: hDC = GetDC(hWnd);
238: lpEnumFunc = (FONTENUMPROC)MakeProcInstance((FARPROC)EnumFunc, hInst);
239: EnumFonts(hDC, (LPTSTR)NULL, lpEnumFunc, (LPARAM)NULL);
240: FreeProcInstance((FARPROC)lpEnumFunc);
241: ReleaseDC(hWnd, hDC);
242: #else
243: FontIndex = 1;
244: lstrcpy(FontList[0], TEXT("Lucida Sans Unicode"));
245: #endif
246: }
247:
248: /****************************************************************************
249:
250: FUNCTION: SelectFont(HWND, unsigned, WORD, LONG)
251:
252: PURPOSE: Initializes window data and registers window class
253:
254: ****************************************************************************/
255:
256: BOOL APIENTRY SelectFont(
257: HWND hDlg,
258: UINT message,
259: WPARAM wParam,
260: LONG lParam)
261: {
262:
263: INT i;
264: INT index;
265:
266: switch (message) {
267: case WM_INITDIALOG:
268: for (i=0; i<FontIndex; i++) { /* displays available fonts */
269: SendDlgItemMessage(hDlg, ID_TYPEFACE, LB_ADDSTRING,
270: NULL, (LONG) (LPTSTR) FontList[i]);
271: SendDlgItemMessage(hDlg, ID_TYPEFACE, LB_SETCURSEL,
272: 0, 0L);
273: }
274: return (TRUE);
275: break;
276:
277: case WM_COMMAND:
278: switch (LOWORD(wParam)) {
279: case IDOK:
280: okay:
281: index=SendDlgItemMessage(hDlg, ID_TYPEFACE,
282: LB_GETCURSEL, 0, 0L);
283: if (index == LB_ERR) {
284: MessageBox(hDlg, TEXT("No font selected"),
285: TEXT("Select Font"), MB_OK | MB_ICONEXCLAMATION);
286: break;
287: }
288: CurrentFont = index;
289: EndDialog(hDlg, 1);
290: break;
291:
292: case IDCANCEL:
293: EndDialog(hDlg, 0);
294: break;
295:
296: case ID_TYPEFACE:
297: switch (HIWORD(wParam)) {
298: case LBN_SELCHANGE:
299: index = SendDlgItemMessage(hDlg, ID_TYPEFACE,
300: LB_GETCURSEL, 0, 0L);
301: if (index == LB_ERR)
302: break;
303: break;
304:
305: case LBN_DBLCLK:
306: goto okay;
307: break;
308: }
309: break;
310:
311: default:
312: break;
313: }
314: break;
315:
316: default:
317: break;
318: }
319: return (FALSE);
320: }
321:
322: /****************************************************************************
323:
324: FUNCTION: Range(HWND, unsigned, WORD, LONG)
325:
326: PURPOSE: Selects a range of characters to display
327:
328: ****************************************************************************/
329:
330: BOOL APIENTRY Range(
331: HWND hDlg,
332: UINT message,
333: WPARAM wParam,
334: LONG lParam)
335: {
336: BOOL f;
337: int i;
338: static int CurrentButtonTmp;
339:
340: switch (message) {
341: case WM_INITDIALOG:
342: f = SetDlgItemInt(hDlg, ID_LOW, low, FALSE);
343: f = SetDlgItemInt(hDlg, ID_HIGH, high, FALSE);
344: CheckRadioButton(hDlg, ID_ASCII, ID_MATH, CurrentButton);
345: CurrentButtonTmp = CurrentButton;
346: return (TRUE);
347: break;
348:
349: case WM_COMMAND:
350: switch (LOWORD(wParam)) {
351: case IDOK:
352: low = GetDlgItemInt(hDlg, ID_LOW, &f, FALSE);
353: high = GetDlgItemInt(hDlg, ID_HIGH, &f, FALSE);
354: if (high-low > 256) {
355: MessageBox(NULL, TEXT("Range too large - 256 max"),
356: NULL, MB_OK | MB_ICONHAND);
357: }
358: else {
359: CurrentButton = CurrentButtonTmp;
360: EndDialog(hDlg, TRUE);
361: }
362: break;
363:
364: case IDCANCEL:
365: EndDialog(hDlg, FALSE);
366: break;
367:
368: case ID_ASCII:
369: case ID_LATIN:
370: case ID_LATIN_E:
371: case ID_LATIN_X:
372: case ID_MODIFIER:
373: case ID_DIACRITICAL:
374: case ID_PHONETIC:
375: case ID_GREEK:
376: case ID_CYRILLIC:
377: case ID_CYRILLIC_X:
378: case ID_HEBREW:
379: case ID_CURRENCY:
380: case ID_LETTERS:
381: case ID_ARROWS:
382: case ID_MATH:
383: for (i=ID_ASCII ; i<=ID_MATH ; i++) {
384: if (IsDlgButtonChecked(hDlg, i)) {
385: f = SetDlgItemInt(hDlg, ID_LOW,
386: range[i-ID_ASCII].low, FALSE);
387: f = SetDlgItemInt(hDlg, ID_HIGH,
388: range[i-ID_ASCII].high, FALSE);
389: CurrentButtonTmp = i;
390: break;
391: }
392: }
393: break;
394:
395: default:
396: break;
397: }
398: break;
399:
400: default:
401: break;
402: }
403: return (FALSE);
404: }
405:
406:
407: /****************************************************************************
408:
409: FUNCTION: ShowUniWndProc(HWND, unsigned, WORD, LONG)
410:
411: PURPOSE: Processes messages
412:
413: ****************************************************************************/
414:
415: LONG APIENTRY ShowUniWndProc(
416: HWND hWnd,
417: UINT message,
418: WPARAM wParam,
419: LONG lParam)
420: {
421: HDC hDC;
422: PAINTSTRUCT ps;
423:
424:
425: switch(message) {
426: case WM_CREATE:
427: GetFonts(hWnd);
428: break;
429:
430: case WM_PAINT:
431: hDC = BeginPaint(hWnd, &ps);
432: ShowCharacters(hDC, low, high);
433: EndPaint(hWnd, &ps);
434: break;
435:
436: case WM_COMMAND:
437: switch (LOWORD(wParam)) {
438:
439: /* File Menu */
440:
441: case IDM_EXIT:
442: DestroyWindow(hWnd);
443: break;
444:
445: case IDM_ABOUT:
446: lpDlg = MakeProcInstance((DLGPROC)About, hInst);
447: DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUT), hWnd, lpDlg);
448: FreeProcInstance(lpDlg);
449: break;
450:
451: /* Show menu */
452:
453: case IDM_CLEAR:
454: InvalidateRect(hWnd, (LPRECT)NULL, TRUE);
455: break;
456:
457: case IDM_SHOWCHARS:
458: InvalidateRect(hWnd, (LPRECT)NULL, TRUE);
459: break;
460:
461: case IDM_SHOWRANGE:
462: lpDlg = MakeProcInstance((DLGPROC)Range, hInst);
463: if (DialogBox(hInst, MAKEINTRESOURCE(IDD_RANGE), hWnd, lpDlg)) {
464: }
465: FreeProcInstance(lpDlg);
466: break;
467:
468: /* Font menu */
469:
470: case IDM_SELECTFONT:
471: lpDlg = MakeProcInstance((DLGPROC)SelectFont, hInst);
472: if (DialogBox(hInst, MAKEINTRESOURCE(IDD_SELECT), hWnd, lpDlg)) {
473: hFont = CreateFont( 10, 10, 0, 0,
474: FW_NORMAL, FALSE, FALSE, FALSE,
475: UNICODE_CHARSET,
476: OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
477: DEFAULT_QUALITY, DEFAULT_PITCH,
478: FontList[CurrentFont]);
479: SetFaceName(hWnd);
480: }
481: FreeProcInstance(lpDlg);
482: break;
483:
484: }
485: break;
486:
487: case WM_LBUTTONUP:
488: ptCurrent.x = LOWORD(lParam);
489: ptCurrent.y = HIWORD(lParam);
490: hDC = GetDC(hWnd);
491: ShowCharacters(hDC, low, high);
492: ReleaseDC(hWnd, hDC);
493: break;
494:
495: case WM_FONTCHANGE:
496: GetFonts(hWnd);
497: break;
498:
499: case WM_DESTROY:
500: PostQuitMessage(0);
501: break;
502:
503: default:
504: return (DefWindowProc(hWnd, message, wParam, lParam));
505: }
506: return (0L);
507: }
508:
509: /****************************************************************************
510:
511: FUNCTION: SetFaceName(HWND)
512:
513: PURPOSE: Retrieves current font's face name, places it in WindowTitle
514:
515: ****************************************************************************/
516:
517: VOID SetFaceName(HWND hWnd)
518: {
519: TCHAR buf[80];
520: HDC hDC;
521:
522: hDC = GetDC(hWnd);
523: SelectObject(hDC, hFont);
524: lstrcpy(WindowTitle, AppName);
525: lstrcat(WindowTitle, TEXT(" : "));
526: GetTextFace(hDC, 80, buf);
527: lstrcat(WindowTitle, buf);
528: SetWindowText(hWnd, (LPTSTR) WindowTitle);
529:
530: ReleaseDC(hWnd, hDC);
531: }
532:
533: /****************************************************************************
534:
535: FUNCTION: About(HWND, unsigned, WORD, LONG)
536:
537: PURPOSE: Processes messages for "About" dialog box
538:
539: MESSAGES:
540:
541: WM_INITDIALOG - initialize dialog box
542: WM_COMMAND - Input received
543:
544: ****************************************************************************/
545:
546: BOOL APIENTRY About(
547: HWND hDlg,
548: UINT message,
549: WPARAM wParam,
550: LONG lParam)
551: {
552: switch (message) {
553: case WM_INITDIALOG:
554: return (TRUE);
555:
556: case WM_COMMAND:
557: if (LOWORD(wParam) == IDOK) {
558: EndDialog(hDlg, TRUE);
559: return (TRUE);
560: }
561: return (TRUE);
562: }
563: return (FALSE);
564: UNREFERENCED_PARAMETER(lParam);
565: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.