/**************************************************************************\ * uniput.c -- input of unicode characters. * * Steve Firebaugh * Microsoft Developer Support * Copyright (c) 1992 Microsoft Corporation * \**************************************************************************/ #define UNICODE #include #include #include "uniput.h" /* Misc. defines for size, color, and appearance of drawing. */ #define GRIDCOLOR PALETTEINDEX (6) #define TICKSPACE 20 #define FWW_STEPS 40 HANDLE hFile = INVALID_HANDLE_VALUE; HANDLE OpenNewFile(HWND); TCHAR szHelpPathName[] = TEXT("uniput.HLP"); HANDLE hInst; HWND hwndMain; HWND hwndClient; HWND hwndStatus; int gShowhex, gShowNames; #define STATUSHEIGHT 2*GetSystemMetrics(SM_CYMENU) /**************************************************************************\ * * function: WinMain() * * input parameters: c.f. generic sample * \**************************************************************************/ int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { MSG msg; CLIENTCREATESTRUCT clientcreate; WNDCLASS wc; UNREFERENCED_PARAMETER( lpCmdLine ); UNREFERENCED_PARAMETER( nCmdShow ); hInst = hInstance; /* Check for previous instance. If none, then register class. */ if (!hPrevInstance) { wc.style = NULL; wc.lpfnWndProc = (WNDPROC)MainWndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = LoadIcon(hInstance, TEXT("uniputIcon")); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = NULL; wc.lpszMenuName = TEXT("uniputMenu"); wc.lpszClassName = TEXT("uniput"); if (!RegisterClass(&wc)) return (FALSE); } /* class registered o.k. */ /* Create the main window. Return false if CreateWindow() fails */ hwndMain = CreateWindow( TEXT("uniput"), TEXT("Input unicode characters"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInst, NULL); if (!hwndMain) return (FALSE); /* create the MDI "client" window. */ clientcreate.hWindowMenu = GetSubMenu(GetMenu(hwndMain),2); clientcreate.idFirstChild = 1; hwndClient = CreateWindow( TEXT("MDICLIENT"), NULL, WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | MDIS_ALLCHILDSTYLES, 0,0,0,0, hwndMain, NULL, hInst, (LPVOID)&clientcreate); if (!hwndClient) return (FALSE); /* create status bar */ wc.style = CS_VREDRAW | CS_HREDRAW | CS_OWNDC; wc.lpfnWndProc = (WNDPROC)StatusWndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInst; wc.hIcon = NULL; wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = GetStockObject (LTGRAY_BRUSH); wc.lpszMenuName = NULL; wc.lpszClassName = TEXT("status"); if (!RegisterClass(&wc)) return (FALSE); hwndStatus = CreateWindow( TEXT("status"), TEXT("status"), WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | WS_BORDER, 0,0, GetSystemMetrics(SM_CXFULLSCREEN), STATUSHEIGHT, hwndMain, NULL, hInst, 0); if (!hwndStatus) return (FALSE); ShowWindow(hwndMain, SW_SHOWDEFAULT); SetCursor (LoadCursor (NULL, IDC_WAIT)); /* Create the first child window showing glyphs. */ wc.style = CS_VREDRAW | CS_HREDRAW | CS_OWNDC; wc.lpfnWndProc = (WNDPROC)DisplayWndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 12; wc.hInstance = hInst; wc.hIcon = LoadIcon(hInst, TEXT("uniputIcon")); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = GetStockObject (WHITE_BRUSH); wc.lpszMenuName = NULL; wc.lpszClassName = TEXT("display"); if (!RegisterClass(&wc)) return (FALSE); /* set the menus to be correct */ SendMessage (hwndMain, WM_COMMAND, IDM_SHOWHEX,0); SendMessage (hwndMain, WM_COMMAND, IDM_SHOWNAMES,0); /* Create one MDI child window to get started */ SendMessage (hwndMain, WM_COMMAND, IDM_NEWWINDOW, 0); SetCursor (LoadCursor (NULL, IDC_ARROW)); /* Loop getting messages and dispatching them. */ while (GetMessage(&msg,NULL, NULL, NULL)) { TranslateMessage(&msg); DispatchMessage(&msg); } return (msg.wParam); } /**************************************************************************\ * * function: MainWndProc() * * input parameters: normal window procedure parameters. * \**************************************************************************/ LRESULT CALLBACK MainWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { HWND hwndActive; switch (message) { /**********************************************************************\ * WM_CREATE \**********************************************************************/ case WM_CREATE: { } /**********************************************************************\ * WM_SIZE * * When the frame is sized, then change the size of the MDI client, * excluding the status bar, and change the size and position of the * status bar. \**********************************************************************/ case WM_SIZE: { RECT r; GetClientRect (hwnd, &r); r.bottom -= STATUSHEIGHT; SetWindowPos (hwndClient, HWND_BOTTOM, r.left, r.top, r.right, r.bottom, 0); /* size & position status bar: left, right, & top just out of view */ SetWindowPos (hwndStatus, HWND_TOP, r.left-1, r.bottom, r.right+2, STATUSHEIGHT+1, 0); return TRUE; } break; /**********************************************************************\ * WMU_CHARACTER * * global variable: hFile * * user message sent to main window when user hits a glyph square. * if the main window has a file open, then write this unicode * character to that file. \**********************************************************************/ case WMU_CHARACTER: { DWORD nBytes; WCHAR tChar; tChar = (WCHAR)lParam; /* show it on the status bar */ SendMessage (hwndStatus, WMU_CHARACTER, 0, lParam); if (hFile != INVALID_HANDLE_VALUE) WriteFile (hFile, &tChar, sizeof(WCHAR), &nBytes, NULL); } break; /**********************************************************************\ * WM_COMMAND * \**********************************************************************/ case WM_COMMAND: { switch (LOWORD(wParam)) { /******************************************************************\ * WM_COMMAND, IDM_NEWWINDOW * * global - hwndClient, hInst * * Simply create a new MDI child window. \******************************************************************/ case IDM_NEWWINDOW: { HWND hwndDisplay; hwndDisplay = CreateMDIWindow( TEXT("display"), TEXT("Display"), WS_CHILD | WS_CLIPSIBLINGS | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_HSCROLL, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, hwndClient, hInst, 0); } break; /******************************************************************\ * WM_COMMAND, IDM_NEWFILE * * global - hFile. \******************************************************************/ case IDM_NEWFILE: { DWORD nBytes; hFile = OpenNewFile (hwnd); /* Write the unicode byte order mark */ WriteFile (hFile, "\xFE\xFF", 2, &nBytes, NULL); } break; /******************************************************************\ * WM_COMMAND, IDM_CLOSEFILE * * global - hFile. \******************************************************************/ case IDM_CLOSEFILE: CloseHandle (hFile); hFile = INVALID_HANDLE_VALUE; SendMessage (hwndStatus, WMU_SETFILENAME, 0, (LPARAM)NULL); break; case IDM_HELP: WinHelp( hwnd, szHelpPathName, HELP_INDEX, (DWORD) NULL ); break; case IDM_ABOUT: DialogBox (hInst, TEXT("aboutBox"), hwnd, (DLGPROC) About); break; /******************************************************************\ * WM_COMMAND, IDM_SHOWHEX * * Check menu on and off. Set global value: gShowHex \******************************************************************/ case IDM_SHOWHEX: if (GetMenuState (GetMenu (hwnd),IDM_SHOWHEX, MF_BYCOMMAND) == MF_CHECKED) { CheckMenuItem(GetMenu (hwnd), LOWORD(wParam) , MF_UNCHECKED); gShowhex = FALSE; RedrawWindow (hwnd, NULL, NULL, RDW_INVALIDATE |RDW_ALLCHILDREN); } else { CheckMenuItem(GetMenu (hwnd), LOWORD(wParam) , MF_CHECKED); gShowhex = TRUE; RedrawWindow (hwnd, NULL, NULL, RDW_INVALIDATE |RDW_ALLCHILDREN); } break; /******************************************************************\ * WM_COMMAND, IDM_SHOWNAMES * * Check menu on and off. Set global value: gShowNames \******************************************************************/ case IDM_SHOWNAMES: if (GetMenuState (GetMenu (hwnd),IDM_SHOWNAMES, MF_BYCOMMAND) == MF_CHECKED) { CheckMenuItem(GetMenu (hwnd), LOWORD(wParam) , MF_UNCHECKED); gShowNames = FALSE; } else { CheckMenuItem(GetMenu (hwnd), LOWORD(wParam) , MF_CHECKED); gShowNames = TRUE; } // PROBLEM: Need to send message to all child windows. hwndActive = (HWND)SendMessage (hwndClient, WM_MDIGETACTIVE, 0,0); SendMessage (hwndActive, WMU_NEWRANGE, 0,0); InvalidateRect (hwndActive, NULL, TRUE); break; /******************************************************************\ * WM_COMMAND, IDM_CHAR* * * manage mutually exclusive menu indicating number of chars per line \******************************************************************/ case IDM_CHAR10: case IDM_CHAR16: case IDM_CHAR20: case IDM_CHAR32: case IDM_CHAR40: case IDM_CHAR64: { HMENU hMenu; int nCharPerLine; hMenu = GetMenu (hwnd); CheckMenuItem(hMenu, IDM_CHAR10, MF_UNCHECKED); CheckMenuItem(hMenu, IDM_CHAR16, MF_UNCHECKED); CheckMenuItem(hMenu, IDM_CHAR20, MF_UNCHECKED); CheckMenuItem(hMenu, IDM_CHAR32, MF_UNCHECKED); CheckMenuItem(hMenu, IDM_CHAR40, MF_UNCHECKED); CheckMenuItem(hMenu, IDM_CHAR64, MF_UNCHECKED); CheckMenuItem(hMenu, LOWORD(wParam), MF_CHECKED); /* notice the value is coded into the menu i.d. */ nCharPerLine = LOWORD(wParam)-IDM_CHARBASE; hwndActive = (HWND)SendMessage (hwndClient, WM_MDIGETACTIVE, 0,0); SendMessage (hwndActive, WMU_SETNCHAR, nCharPerLine ,0); InvalidateRect (hwndActive, NULL, TRUE); } break; /******************************************************************\ * WM_COMMAND, IDM_FONT* * * manage mutually exclusive menu indicating font height \******************************************************************/ case IDM_FONT18: case IDM_FONT36: case IDM_FONT72: { HMENU hMenu; int Width, Height; hMenu = GetMenu (hwnd); CheckMenuItem(hMenu, IDM_FONT18, MF_UNCHECKED); CheckMenuItem(hMenu, IDM_FONT36, MF_UNCHECKED); CheckMenuItem(hMenu, IDM_FONT72, MF_UNCHECKED); CheckMenuItem(hMenu, LOWORD(wParam), MF_CHECKED); /* notice the value is coded into the menu i.d. */ Height = LOWORD(wParam)-IDM_FONTBASE; /* scale the width proportionately */ Width = Height * UCFONTWIDTH/UCFONTHEIGHT; hwndActive = (HWND)SendMessage (hwndClient, WM_MDIGETACTIVE, 0,0); SendMessage (hwndActive, WMU_NEWFONT, (WPARAM)Width,(LPARAM)Height); InvalidateRect (hwndActive, NULL, TRUE); } break; /******************************************************************\ * WM_COMMAND, IDM_MDI* * * misc. MDI responsibilities. hwndClient does real work. \******************************************************************/ case IDM_MDICASCADE: SendMessage (hwndClient, WM_MDICASCADE, 0,0); break; case IDM_MDITILE: SendMessage (hwndClient, WM_MDITILE, MDITILE_HORIZONTAL,0); break; break; } /* end switch */ } break; /* end WM_COMMAND */ /**********************************************************************\ * WM_DESTROY \**********************************************************************/ case WM_DESTROY: WinHelp( hwnd, szHelpPathName, (UINT) HELP_QUIT, (DWORD) NULL ); PostQuitMessage(0); break; default: break; } /* end switch */ return (DefFrameProc(hwnd, hwndClient, message, wParam, lParam)); } /***************************************************************************\ * FUNCTION: About \***************************************************************************/ LRESULT CALLBACK About(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { if ((message == WM_COMMAND) && (LOWORD(wParam) == IDOK)) { EndDialog (hwnd, TRUE); return TRUE; } if ((message == WM_SYSCOMMAND) && (wParam == SC_CLOSE)) { EndDialog (hwnd, TRUE); return TRUE; } return FALSE; } /***************************************************************************\ * * FUNCTION: OpenNewFile(HWND) * * PURPOSE: Invokes common dialog function to open a file and opens it. * \***************************************************************************/ HANDLE OpenNewFile( HWND hwnd ) { TCHAR szFile[MAX_PATH],szFileTitle[MAX_PATH]; OPENFILENAME OpenFileName; wsprintf (szFile, TEXT("")); wsprintf (szFileTitle, TEXT("")); OpenFileName.lStructSize = sizeof(OPENFILENAME); OpenFileName.hwndOwner = hwnd; OpenFileName.hInstance = (HANDLE) hInst; OpenFileName.lpstrFilter = NULL; OpenFileName.lpstrCustomFilter = NULL; OpenFileName.nMaxCustFilter = 0L; OpenFileName.nFilterIndex = 1L; OpenFileName.lpstrFile = szFile; OpenFileName.nMaxFile = sizeof(szFile); OpenFileName.lpstrFileTitle = szFileTitle; OpenFileName.nMaxFileTitle = sizeof(szFileTitle); OpenFileName.lpstrInitialDir = NULL; OpenFileName.lpstrTitle = TEXT("Open a File"); OpenFileName.nFileOffset = 0; OpenFileName.nFileExtension = 0; OpenFileName.lpstrDefExt = NULL; OpenFileName.lCustData = 0; OpenFileName.Flags = OFN_HIDEREADONLY; if (!GetOpenFileName(&OpenFileName)) return INVALID_HANDLE_VALUE; /* update status bar with the file title. */ SendMessage (hwndStatus, WMU_SETFILENAME, 0, (LPARAM)OpenFileName.lpstrFileTitle); return (CreateFile(OpenFileName.lpstrFile, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL)); }