Annotation of q_a/samples/uniput/uniput.c, revision 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.