Annotation of q_a/samples/uniput/uniput.c, revision 1.1.1.1

1.1       root        1: 
                      2: /******************************************************************************\
                      3: *       This is a part of the Microsoft Source Code Samples. 
                      4: *       Copyright (C) 1993 Microsoft Corporation.
                      5: *       All rights reserved. 
                      6: *       This source code is only intended as a supplement to 
                      7: *       Microsoft Development Tools and/or WinHelp documentation.
                      8: *       See these sources for detailed information regarding the 
                      9: *       Microsoft samples programs.
                     10: \******************************************************************************/
                     11: 
                     12: /**************************************************************************\
                     13: * uniput.c -- input of unicode characters.
                     14: \**************************************************************************/
                     15: #define UNICODE
                     16: 
                     17: #include <windows.h>
                     18: #include <commdlg.h>
                     19: #include "uniput.h"
                     20: 
                     21: 
                     22: /* Misc. defines for size, color, and appearance of drawing. */
                     23: #define GRIDCOLOR  PALETTEINDEX (6)
                     24: #define TICKSPACE  20
                     25: #define FWW_STEPS  40
                     26: 
                     27: 
                     28: HANDLE hFile = INVALID_HANDLE_VALUE;
                     29: 
                     30: HANDLE OpenNewFile(HWND);
                     31: 
                     32: 
                     33: TCHAR szHelpPathName[] = TEXT("uniput.HLP");
                     34: 
                     35: HANDLE hInst;
                     36: HWND   hwndMain;
                     37: HWND   hwndClient;
                     38: HWND   hwndStatus;
                     39: 
                     40: int gShowhex, gShowNames;
                     41: 
                     42: #define STATUSHEIGHT (UCFONTHEIGHT/2 + 3*SBORDER)
                     43: 
                     44: 
                     45: /**************************************************************************\
                     46: *
                     47: *  function:  WinMain()
                     48: *
                     49: *  input parameters:  c.f. generic sample
                     50: *
                     51: \**************************************************************************/
                     52: int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                     53:                      LPSTR lpCmdLine, int nCmdShow)
                     54: {
                     55:     MSG    msg;
                     56:     CLIENTCREATESTRUCT clientcreate;
                     57:     WNDCLASS  wc;
                     58: 
                     59: 
                     60:     UNREFERENCED_PARAMETER( lpCmdLine );
                     61:     UNREFERENCED_PARAMETER(  nCmdShow );
                     62:     hInst = hInstance;
                     63: 
                     64: 
                     65:     /* Check for previous instance.  If none, then register class. */
                     66:     if (!hPrevInstance) {
                     67: 
                     68:       wc.style = 0;
                     69:       wc.lpfnWndProc = (WNDPROC)MainWndProc;
                     70: 
                     71:       wc.cbClsExtra = 0;
                     72:       wc.cbWndExtra = 0;
                     73:       wc.hInstance = hInstance;
                     74:       wc.hIcon = LoadIcon(hInstance, TEXT("uniputIcon"));
                     75:       wc.hCursor = LoadCursor(NULL, IDC_ARROW);
                     76:       wc.hbrBackground = NULL;
                     77:       wc.lpszMenuName =  TEXT("uniputMenu");
                     78:       wc.lpszClassName = TEXT("uniput");
                     79: 
                     80:       if (!RegisterClass(&wc)) return (FALSE);
                     81: 
                     82:     }  /* class registered o.k. */
                     83: 
                     84: 
                     85:     /* Create the main window.  Return false if CreateWindow() fails */
                     86:     hwndMain = CreateWindow(
                     87:         TEXT("uniput"),
                     88:         TEXT("Input unicode characters"),
                     89:         WS_OVERLAPPEDWINDOW,
                     90:         CW_USEDEFAULT,
                     91:         CW_USEDEFAULT,
                     92:         CW_USEDEFAULT,
                     93:         CW_USEDEFAULT,
                     94:         NULL, NULL, hInst, NULL);
                     95: 
                     96:     if (!hwndMain) return (FALSE);
                     97: 
                     98: 
                     99:     /* create the MDI "client" window. */
                    100:     clientcreate.hWindowMenu  = GetSubMenu(GetMenu(hwndMain),1);
                    101:     clientcreate.idFirstChild = 1;
                    102:     hwndClient = CreateWindow(
                    103:         TEXT("MDICLIENT"),
                    104:         NULL,
                    105:         WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | MDIS_ALLCHILDSTYLES,
                    106:         0,0,0,0,
                    107:         hwndMain, NULL, hInst, (LPVOID)&clientcreate);
                    108:     if (!hwndClient) return (FALSE);
                    109: 
                    110: 
                    111: 
                    112:     /* create status bar */
                    113:     wc.style = CS_VREDRAW | CS_HREDRAW | CS_OWNDC;
                    114:     wc.lpfnWndProc = (WNDPROC)StatusWndProc;
                    115:     wc.cbClsExtra = 0;
                    116:     wc.cbWndExtra = 0;
                    117:     wc.hInstance = hInst;
                    118:     wc.hIcon = NULL;
                    119:     wc.hCursor = LoadCursor(NULL, IDC_ARROW);
                    120:     wc.hbrBackground = GetStockObject (LTGRAY_BRUSH);
                    121:     wc.lpszMenuName = NULL;
                    122:     wc.lpszClassName = TEXT("status");
                    123:     if (!RegisterClass(&wc)) return (FALSE);
                    124: 
                    125:     hwndStatus = CreateWindow(
                    126:         TEXT("status"),
                    127:         TEXT("status"),
                    128:         WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | WS_BORDER,
                    129:         0,0,
                    130:         GetSystemMetrics(SM_CXFULLSCREEN),
                    131:         STATUSHEIGHT,
                    132:         hwndMain, NULL, hInst, 0);
                    133:     if (!hwndStatus) return (FALSE);
                    134: 
                    135: 
                    136:     ShowWindow(hwndMain, SW_SHOWDEFAULT);
                    137:     SetCursor (LoadCursor (NULL, IDC_WAIT));
                    138: 
                    139: 
                    140:     /* Register display window class, and do class initialization. */
                    141:     if (!openDisplay()) return (FALSE);
                    142: 
                    143:     /* set the menus to be correct */
                    144:     SendMessage (hwndMain, WM_COMMAND, IDM_SHOWHEX,0);
                    145:     SendMessage (hwndMain, WM_COMMAND, IDM_SHOWNAMES,0);
                    146: 
                    147: 
                    148: 
                    149:     /* Create one MDI child window to get started */
                    150:     SendMessage (hwndMain, WM_COMMAND, IDM_NEWWINDOW, 0);
                    151: 
                    152:     SetCursor (LoadCursor (NULL, IDC_ARROW));
                    153: 
                    154: 
                    155: 
                    156:     /* Loop getting messages and dispatching them. */
                    157:     while (GetMessage(&msg,NULL, 0,0)) {
                    158:         TranslateMessage(&msg);
                    159:         DispatchMessage(&msg);
                    160:     }
                    161: 
                    162:     closeDisplay();
                    163:     return (msg.wParam);
                    164: }
                    165: 
                    166: 
                    167: 
                    168: /**************************************************************************\
                    169: *
                    170: *  function:  MainWndProc()
                    171: *
                    172: *  input parameters:  normal window procedure parameters.
                    173: *
                    174: \**************************************************************************/
                    175: LRESULT CALLBACK MainWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
                    176: {
                    177: HWND hwndActive;
                    178: 
                    179:   switch (message) {
                    180: 
                    181:     /**********************************************************************\
                    182:     *  WM_CREATE
                    183:     \**********************************************************************/
                    184:     case WM_CREATE: {
                    185: 
                    186:     }
                    187: 
                    188: 
                    189:     /**********************************************************************\
                    190:     *  WM_SIZE
                    191:     *
                    192:     * When the frame is sized, then change the size of the MDI client,
                    193:     *  excluding the status bar, and change the size and position of the
                    194:     *  status bar.
                    195:     \**********************************************************************/
                    196:     case WM_SIZE: {
                    197: 
                    198:       RECT r;
                    199:       GetClientRect (hwnd, &r);
                    200:       r.bottom -= STATUSHEIGHT;
                    201: 
                    202:       SetWindowPos (hwndClient, HWND_BOTTOM,
                    203:                     r.left, r.top, r.right, r.bottom, 0);
                    204: 
                    205:       /* size & position status bar: left, right, & top just out of view */
                    206:       SetWindowPos (hwndStatus, HWND_TOP,
                    207:         r.left-1, r.bottom,
                    208:         r.right+2, STATUSHEIGHT+1, 0);
                    209: 
                    210: 
                    211:       return TRUE;
                    212: 
                    213:     } break;
                    214: 
                    215: 
                    216: 
                    217:     /**********************************************************************\
                    218:     *  WMU_CHARACTER
                    219:     *
                    220:     * global variable: hFile
                    221:     *
                    222:     * user message sent to main window when user hits a glyph square.
                    223:     *  if the main window has a file open, then write this unicode
                    224:     *  character to that file.
                    225:     \**********************************************************************/
                    226:     case WMU_CHARACTER: {
                    227:         DWORD nBytes;
                    228:         WCHAR tChar;
                    229: 
                    230:       tChar = (WCHAR)lParam;
                    231: 
                    232:       /* show it on the status bar */
                    233:       SendMessage (hwndStatus, WMU_CHARACTER, 0, lParam);
                    234: 
                    235:       if (hFile != INVALID_HANDLE_VALUE)
                    236:         WriteFile (hFile, &tChar, sizeof(WCHAR), &nBytes, NULL);
                    237: 
                    238:     } break;
                    239: 
                    240: 
                    241: 
                    242:     /**********************************************************************\
                    243:     *  WM_COMMAND
                    244:     *
                    245:     \**********************************************************************/
                    246:     case WM_COMMAND: {
                    247: 
                    248:       switch (LOWORD(wParam)) {
                    249: 
                    250:         /******************************************************************\
                    251:         *  WM_COMMAND, IDM_NEWWINDOW
                    252:         *
                    253:         * global - hwndClient, hInst
                    254:         *
                    255:         * Simply create a new MDI child window.
                    256:         \******************************************************************/
                    257:         case IDM_NEWWINDOW: {
                    258:           HWND hwndDisplay;
                    259: 
                    260:           hwndDisplay = CreateMDIWindow(
                    261:               DISPLAYCLASS,
                    262:               TEXT("Display"),
                    263:               WS_CHILD | WS_CLIPSIBLINGS | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_VISIBLE |
                    264:                          WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_HSCROLL,
                    265:               CW_USEDEFAULT,
                    266:               CW_USEDEFAULT,
                    267:               CW_USEDEFAULT,
                    268:               CW_USEDEFAULT,
                    269:               hwndClient, hInst, 0);
                    270:         } break;
                    271: 
                    272: 
                    273:         /******************************************************************\
                    274:         *  WM_COMMAND, IDM_NEWFILE
                    275:         *
                    276:         * global - hFile.
                    277:         \******************************************************************/
                    278:         case IDM_NEWFILE: {
                    279:           DWORD nBytes;
                    280: 
                    281:           hFile = OpenNewFile (hwnd);
                    282:           /* Write the unicode byte order mark */
                    283:           WriteFile (hFile, "\xFE\xFF", 2, &nBytes, NULL);
                    284:         } break;
                    285: 
                    286: 
                    287:         /******************************************************************\
                    288:         *  WM_COMMAND, IDM_CLOSEFILE
                    289:         *
                    290:         * global - hFile.
                    291:         \******************************************************************/
                    292:         case IDM_CLOSEFILE:
                    293:           CloseHandle (hFile);
                    294:           hFile = INVALID_HANDLE_VALUE;
                    295:           SendMessage (hwndStatus, WMU_SETTARGETNAME, 0, (LPARAM)NULL);
                    296:         break;
                    297: 
                    298: 
                    299:         case IDM_HELP:
                    300:           WinHelp( hwnd, szHelpPathName, HELP_INDEX, (DWORD) NULL );
                    301:         break;
                    302: 
                    303: 
                    304:         case IDM_ABOUT:
                    305:           DialogBox (hInst, TEXT("aboutBox"), hwnd, (DLGPROC) About);
                    306:         break;
                    307: 
                    308: 
                    309: 
                    310:         /******************************************************************\
                    311:         *  WM_COMMAND, IDM_SHOWHEX
                    312:         *
                    313:         * Check menu on and off.  Set global value: gShowHex
                    314:         \******************************************************************/
                    315:         case IDM_SHOWHEX:
                    316:           if (GetMenuState (GetMenu (hwnd),IDM_SHOWHEX, MF_BYCOMMAND)
                    317:                 == MF_CHECKED) {
                    318:             CheckMenuItem(GetMenu (hwnd), LOWORD(wParam) , MF_UNCHECKED);
                    319:             gShowhex = FALSE;
                    320:             RedrawWindow (hwnd, NULL, NULL, RDW_INVALIDATE |RDW_ALLCHILDREN);
                    321:           } else {
                    322:             CheckMenuItem(GetMenu (hwnd), LOWORD(wParam) , MF_CHECKED);
                    323:             gShowhex = TRUE;
                    324:             RedrawWindow (hwnd, NULL, NULL, RDW_INVALIDATE |RDW_ALLCHILDREN);
                    325:           }
                    326:         break;
                    327: 
                    328: 
                    329:         /******************************************************************\
                    330:         *  WM_COMMAND, IDM_SHOWNAMES
                    331:         *
                    332:         * Check menu on and off.  Set global value: gShowNames
                    333:         \******************************************************************/
                    334:         case IDM_SHOWNAMES:
                    335:           if (GetMenuState (GetMenu (hwnd),IDM_SHOWNAMES, MF_BYCOMMAND)
                    336:                 == MF_CHECKED) {
                    337:             CheckMenuItem(GetMenu (hwnd), LOWORD(wParam) , MF_UNCHECKED);
                    338:             gShowNames = FALSE;
                    339:           } else {
                    340:             CheckMenuItem(GetMenu (hwnd), LOWORD(wParam) , MF_CHECKED);
                    341:             gShowNames = TRUE;
                    342:           }
                    343:           // PROBLEM:  Need to send message to all child windows.
                    344: 
                    345:           hwndActive = (HWND)SendMessage (hwndClient, WM_MDIGETACTIVE, 0,0);
                    346:           SendMessage (hwndActive, WMU_NEWRANGE, 0,0);
                    347:           InvalidateRect (hwndActive, NULL, TRUE);
                    348: 
                    349:         break;
                    350: 
                    351: 
                    352:         /******************************************************************\
                    353:         *  WM_COMMAND, IDM_CHAR*
                    354:         *
                    355:         * manage mutually exclusive menu indicating number of chars per line
                    356:         \******************************************************************/
                    357:         case IDM_CHAR10:
                    358:         case IDM_CHAR16:
                    359:         case IDM_CHAR20:
                    360:         case IDM_CHAR32:
                    361:         case IDM_CHAR40:
                    362:         case IDM_CHAR64:
                    363: 
                    364:         { HMENU hMenu;
                    365:           int nCharPerLine;
                    366: 
                    367:           hMenu = GetMenu (hwnd);
                    368: 
                    369:           CheckMenuItem(hMenu, IDM_CHAR10, MF_UNCHECKED);
                    370:           CheckMenuItem(hMenu, IDM_CHAR16, MF_UNCHECKED);
                    371:           CheckMenuItem(hMenu, IDM_CHAR20, MF_UNCHECKED);
                    372:           CheckMenuItem(hMenu, IDM_CHAR32, MF_UNCHECKED);
                    373:           CheckMenuItem(hMenu, IDM_CHAR40, MF_UNCHECKED);
                    374:           CheckMenuItem(hMenu, IDM_CHAR64, MF_UNCHECKED);
                    375: 
                    376:           CheckMenuItem(hMenu, LOWORD(wParam), MF_CHECKED);
                    377: 
                    378:           /* notice the value is coded into the menu i.d. */
                    379:           nCharPerLine = LOWORD(wParam)-IDM_CHARBASE;
                    380:           hwndActive = (HWND)SendMessage (hwndClient, WM_MDIGETACTIVE, 0,0);
                    381:           SendMessage (hwndActive, WMU_SETNCHAR, nCharPerLine ,0);
                    382:           InvalidateRect (hwndActive, NULL, TRUE);
                    383: 
                    384:         } break;
                    385: 
                    386: 
                    387: 
                    388:         /******************************************************************\
                    389:         *  WM_COMMAND, IDM_FONT*
                    390:         *
                    391:         * manage mutually exclusive menu indicating font height
                    392:         \******************************************************************/
                    393:         case IDM_FONT18:
                    394:         case IDM_FONT36:
                    395:         case IDM_FONT72:
                    396: 
                    397:         { HMENU hMenu;
                    398:           int Width, Height;
                    399:           hMenu = GetMenu (hwnd);
                    400: 
                    401:           CheckMenuItem(hMenu, IDM_FONT18, MF_UNCHECKED);
                    402:           CheckMenuItem(hMenu, IDM_FONT36, MF_UNCHECKED);
                    403:           CheckMenuItem(hMenu, IDM_FONT72, MF_UNCHECKED);
                    404: 
                    405:           CheckMenuItem(hMenu, LOWORD(wParam), MF_CHECKED);
                    406: 
                    407:           /* notice the value is coded into the menu i.d. */
                    408:           Height = LOWORD(wParam)-IDM_FONTBASE;
                    409:           /* scale the width proportionately */
                    410:           Width = Height * UCFONTWIDTH/UCFONTHEIGHT;
                    411: 
                    412:           hwndActive = (HWND)SendMessage (hwndClient, WM_MDIGETACTIVE, 0,0);
                    413:           SendMessage (hwndActive, WMU_NEWFONT, (WPARAM)Width,(LPARAM)Height);
                    414:           InvalidateRect (hwndActive, NULL, TRUE);
                    415: 
                    416:         } break;
                    417: 
                    418: 
                    419: 
                    420:         /******************************************************************\
                    421:         *  WM_COMMAND, IDM_MDI*
                    422:         *
                    423:         * misc. MDI responsibilities.  hwndClient does real work.
                    424:         \******************************************************************/
                    425:         case IDM_MDICASCADE: SendMessage (hwndClient, WM_MDICASCADE, 0,0); break;
                    426:         case IDM_MDITILE:    SendMessage (hwndClient, WM_MDITILE, MDITILE_HORIZONTAL,0); break;
                    427:         break;
                    428: 
                    429: 
                    430: 
                    431: 
                    432:       } /* end switch */
                    433:     } break;  /* end WM_COMMAND */
                    434: 
                    435: 
                    436: 
                    437: 
                    438: 
                    439:     /**********************************************************************\
                    440:     *  WM_DESTROY
                    441:     \**********************************************************************/
                    442:     case WM_DESTROY:
                    443:       WinHelp( hwnd, szHelpPathName, (UINT) HELP_QUIT, (DWORD) NULL );
                    444:       PostQuitMessage(0);
                    445:     break;
                    446: 
                    447: 
                    448:   } /* end switch */
                    449:   return (DefFrameProc(hwnd, hwndClient, message, wParam, lParam));
                    450: }
                    451: 
                    452: 
                    453: 
                    454: /***************************************************************************\
                    455: *    FUNCTION: About
                    456: \***************************************************************************/
                    457: LRESULT CALLBACK About(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
                    458: {
                    459:   if ((message == WM_COMMAND) && (LOWORD(wParam) == IDOK)) {
                    460:     EndDialog (hwnd, TRUE);
                    461:     return TRUE;
                    462:   }
                    463:   if ((message == WM_SYSCOMMAND) && (wParam == SC_CLOSE)) {
                    464:     EndDialog (hwnd, TRUE);
                    465:     return TRUE;
                    466:   }
                    467:   return FALSE;
                    468: }
                    469: 
                    470: 
                    471: 
                    472: 
                    473: 
                    474: 
                    475: 
                    476: /***************************************************************************\
                    477: *
                    478: *    FUNCTION: OpenNewFile(HWND)
                    479: *
                    480: *    PURPOSE:  Invokes common dialog function to open a file and opens it.
                    481: *
                    482: \***************************************************************************/
                    483: HANDLE OpenNewFile( HWND hwnd )
                    484: {
                    485:    TCHAR szFile[MAX_PATH],szFileTitle[MAX_PATH];
                    486:    OPENFILENAME OpenFileName;
                    487: 
                    488: 
                    489:    wsprintf (szFile, TEXT(""));
                    490:    wsprintf (szFileTitle, TEXT(""));
                    491: 
                    492:    OpenFileName.lStructSize       = sizeof(OPENFILENAME);
                    493:    OpenFileName.hwndOwner         = hwnd;
                    494:    OpenFileName.hInstance         = (HANDLE) hInst;
                    495:    OpenFileName.lpstrFilter       = NULL;
                    496:    OpenFileName.lpstrCustomFilter = NULL;
                    497:    OpenFileName.nMaxCustFilter    = 0L;
                    498:    OpenFileName.nFilterIndex      = 1L;
                    499:    OpenFileName.lpstrFile         = szFile;
                    500:    OpenFileName.nMaxFile          = sizeof(szFile);
                    501:    OpenFileName.lpstrFileTitle    = szFileTitle;
                    502:    OpenFileName.nMaxFileTitle     = sizeof(szFileTitle);
                    503:    OpenFileName.lpstrInitialDir   = NULL;
                    504:    OpenFileName.lpstrTitle        = TEXT("Open a File");
                    505: 
                    506:    OpenFileName.nFileOffset       = 0;
                    507:    OpenFileName.nFileExtension    = 0;
                    508:    OpenFileName.lpstrDefExt       = NULL;
                    509: 
                    510:    OpenFileName.lCustData         = 0;
                    511: 
                    512:    OpenFileName.Flags = OFN_HIDEREADONLY;
                    513: 
                    514:    if (!GetOpenFileName(&OpenFileName)) return INVALID_HANDLE_VALUE;
                    515: 
                    516:    /* update status bar with the file title. */
                    517:    SendMessage (hwndStatus, WMU_SETTARGETNAME, 0, (LPARAM)OpenFileName.lpstrFileTitle);
                    518: 
                    519:    return (CreateFile(OpenFileName.lpstrFile,
                    520:                       GENERIC_WRITE,
                    521:                       0,
                    522:                       NULL,
                    523:                       CREATE_ALWAYS,
                    524:                       FILE_ATTRIBUTE_NORMAL,
                    525:                       NULL));
                    526: }

unix.superglobalmegacorp.com

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