|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.