Annotation of mstools/samples/showuni/showuni.c, revision 1.1.1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.