|
|
1.1 root 1: /* mcitest.c - WinMain(), main dialog box and support code for MCITest.
2: *
3: * MCITest is a Windows with Multimedia sample application illustrating
4: * the use of the Media Control Interface (MCI). MCITest puts up a dialog
5: * box allowing you to enter and execute MCI string commands.
6: *
7: * (C) Copyright Microsoft Corp. 1991, 1992. All rights reserved.
8: *
9: * You have a royalty-free right to use, modify, reproduce and
10: * distribute the Sample Files (and/or any modified version) in
11: * any way you find useful, provided that you agree that
12: * Microsoft has no warranty obligations or liability for any
13: * Sample Application Files which are modified.
14: */
15:
16: /*----------------------------------------------------------------------------*\
17: | mcitest.c - A testbed for MCI |
18: | |
19: | |
20: | History: |
21: | 01/01/88 toddla Created |
22: | 03/01/90 davidle Modified quick app into MCI testbed |
23: | 09/17/90 t-mikemc Added Notification box with 3 notification types |
24: | 11/02/90 w-dougb Commented & formatted the code to look pretty |
25: | 05/29/91 NigelT ported to Win32
26: | 02/05/92 SteveDav Merged latest Win 3.1 stuff
27: | |
28: \*----------------------------------------------------------------------------*/
29:
30: /*----------------------------------------------------------------------------*\
31: | |
32: | i n c l u d e f i l e s |
33: | |
34: \*----------------------------------------------------------------------------*/
35:
36: #include <stdio.h>
37: #include <string.h>
38: #include <windows.h>
39: #include "mcitest.h"
40: #include "mcimain.h"
41: #include "edit.h"
42:
43:
44: /*----------------------------------------------------------------------------*\
45: | |
46: | c o n s t a n t a n d m a c r o d e f i n i t i o n s |
47: | |
48: \*----------------------------------------------------------------------------*/
49:
50: #define BUFFER_LENGTH 256
51: #define SLASH(c) ((c) == '/' || (c) == '\\')
52:
53:
54: /*----------------------------------------------------------------------------*\
55: | |
56: | g l o b a l v a r i a b l e s |
57: | |
58: \*----------------------------------------------------------------------------*/
59: #ifndef STATICDT
60: #if DBG
61: #define STATICDT
62: #else
63: #define STATICDT static
64: #endif
65: #endif
66:
67: STATICDT int nLastNumberOfDevices = 0;
68: STATICDT HANDLE hAccTable;
69: STATICDT HANDLE hInstApp;
70: HWND hwndMainDlg = 0;
71: STATICDT HWND hwndEdit = 0;
72: STATICDT HWND hwndDevices = 0;
73: STATICDT char aszMciFile[BUFFER_LENGTH] = "";
74: STATICDT char aszBuffer[BUFFER_LENGTH];
75: STATICDT char aszExt[] = "*.mcs";
76: char aszAppName[] = "MCITest";
77: STATICDT char aszMainTextFormat[] = "%s - %s";
78: STATICDT char aszDeviceTextFormat[] = "Open MCI Devices(count=%d)";
79: STATICDT char aszNULL[] = "";
80: STATICDT char aszTRUE[] = "TRUE";
81: STATICDT char aszFALSE[] = "FALSE";
82: STATICDT char aszEOL[] = "\r\n";
83: STATICDT char aszOpenFileTitle[] = "Open MCITest File";
84: STATICDT char aszSaveFileTitle[] = "Save MCITest File";
85: STATICDT char aszSaveFileControl[] = "Save File &Name";
86: STATICDT char aszProfileSection[] = "extensions";
87: STATICDT char aszProfileKey[] = "mcs";
88: STATICDT char aszProfileSetting[] = "mcitest.exe ^.mcs";
89: STATICDT char aszMciTester[] = "MciTester";
90:
91: /*----------------------------------------------------------------------------*\
92: | |
93: | f u n c t i o n d e f i n i t i o n s |
94: | |
95: \*----------------------------------------------------------------------------*/
96:
97: BOOL mcitester(HWND hwnd, UINT Msg, LONG wParam, LONG lParam);
98: PSTR FileName(PSTR szPath);
99: STATICFN void update_device_list(void);
100: DWORD sendstring(HWND hwndDlg, PSTR strBuffer);
101: void execute( HWND hwndDlg, BOOL fStep);
102: void OpenMciFile( HWND hwndDlg, LPSTR szFile);
103: BOOL AppInit(int argc, char *argv[]);
104: BOOL ErrDlgFunc( HWND hwndDlg, UINT Msg, LONG w, LONG l );
105: void create_device_list(void);
106: STATICFN BOOL devices(HWND hwndDlg, UINT Msg, LONG wParam, LONG lParam);
107:
108: /*----------------------------------------------------------------------------*\
109: | AboutDlgProc( hwndDlg, Message, wParam, lParam ) |
110: | |
111: | Description: |
112: | This function handles messages belonging to the "About" dialog box. |
113: | The only message that it looks for is WM_COMMAND, indicating the user |
114: | has pressed the "OK" button. When this happens, it takes down |
115: | the dialog box. |
116: | |
117: | Arguments: |
118: | hwndDlg window handle of the about dialog window |
119: | Message message number |
120: | wParam message-dependent parameter |
121: | lParam message-dependent parameter |
122: | |
123: | Returns: |
124: | TRUE if the message has been processed, else FALSE |
125: | |
126: \*----------------------------------------------------------------------------*/
127:
128: BOOL AboutDlgProc(
129: HWND hwndDlg,
130: UINT Msg,
131: LONG wParam,
132: LONG lParam)
133: {
134: dprintf4("AboutDlgProc");
135: switch (Msg) {
136: case WM_COMMAND:
137:
138: if (LOWORD(wParam) == IDOK) {
139: EndDialog(hwndDlg,TRUE);
140: }
141: break;
142:
143: case WM_INITDIALOG:
144: return TRUE;
145:
146: }
147:
148: return FALSE;
149: }
150:
151: /*----------------------------------------------------------------------------*\
152: | FileName(szPath) |
153: | |
154: | Description: |
155: | This function takes the full path\filename string specified in <szPath>|
156: | and returns a pointer to the first character of the filename in the |
157: | same string. |
158: | |
159: | Arguments: |
160: | szPath pointer to the full path\filename string |
161: | |
162: | Returns: |
163: | a pointer to the first character of the filename in the same string |
164: | |
165: \*----------------------------------------------------------------------------*/
166:
167: PSTR FileName(
168: PSTR szPath)
169: {
170: PSTR szCurrent; /* temporary pointer to the string */
171:
172: /* Scan to the end of the string */
173:
174: for (szCurrent = szPath; *szCurrent; szCurrent++)
175: {} ;
176:
177: /*
178: * Now start scanning back towards the beginning of the string until
179: * a slash (\) character, colon, or start of the string is encountered.
180: */
181:
182: for (; szCurrent >= szPath
183: && !SLASH(*szCurrent)
184: && *szCurrent != ':'
185: ; szCurrent--)
186: {} ;
187:
188: /* This should be done by calling a Win 32 function, e.g. GetFullPathName
189: */
190:
191: /* Now pointing to the char before the first char in the filename.
192: */
193: return ++szCurrent;
194: }
195:
196: /*----------------------------------------------------------------------------*\
197: | OpenMciFile( hwndDlg, szFile ) |
198: | |
199: | Description: |
200: | This function opens the MCI file specified by <szFile> and updates the |
201: | main window caption to display this file name along with the app name. |
202: | |
203: | Arguments: |
204: | hwndDlg window handle of the main dialog window |
205: | szFile pointer to the string containing the filename to be |
206: | opened |
207: | Returns: |
208: | void |
209: | |
210: \*----------------------------------------------------------------------------*/
211:
212: void OpenMciFile(
213: HWND hwndDlg,
214: LPSTR lszFile)
215: {
216: dprintf2("OpenMciFile: %s", lszFile);
217:
218: if (EditOpenFile(hwndEdit, lszFile)) {
219:
220: strcpy(aszMciFile, lszFile);
221: wsprintf(aszBuffer, aszMainTextFormat, (LPSTR)aszAppName,
222: (LPSTR)FileName(aszMciFile));
223: dprintf3("Set caption: %s", aszBuffer);
224: SetWindowText(hwndDlg, aszBuffer);
225: } else {
226: dprintf1("failed to open %s", lszFile);
227: }
228: }
229:
230: /*----------------------------------------------------------------------------*\
231: | get_number_of_devices() |
232: | |
233: | Description: |
234: | This function sends a command to MCI querying it as to how many |
235: | are currently open in the system. It returns the value provided by MCI.|
236: | |
237: | Arguments: |
238: | none |
239: | |
240: | Returns: |
241: | The number of MCI devices currently open, or 0 if an error occurred. |
242: | |
243: \*----------------------------------------------------------------------------*/
244:
245: int get_number_of_devices(
246: void)
247: {
248: MCI_SYSINFO_PARMS sysinfo; /* Parameter structure used for getting
249: information about the MCI devices in
250: the system */
251: DWORD dwDevices; /* count of open devices */
252:
253: /*
254: * Set things up so that MCI puts the number of open devices directly
255: * into <dwDevices>.
256: */
257:
258: sysinfo.lpstrReturn = (LPSTR)(LPDWORD)&dwDevices;
259: sysinfo.dwRetSize = sizeof(dwDevices);
260:
261: /*
262: * Send MCI a command querying all devices in the system to see if they
263: * are open. If the command was successful, return the number provided by
264: * MCI. Otherwise, return 0.
265: *
266: */
267:
268: if (mciSendCommand (MCI_ALL_DEVICE_ID,
269: MCI_SYSINFO,
270: (MCI_SYSINFO_OPEN | MCI_SYSINFO_QUANTITY),
271: (DWORD)(LPMCI_SYSINFO_PARMS)&sysinfo) != 0)
272: return 0;
273: else
274: return (int)dwDevices;
275: }
276:
277:
278: /*----------------------------------------------------------------------------*\
279: | update_device_list() |
280: | |
281: | Description: |
282: | This function updates the list of devices displayed in the Devices |
283: | dialog. |
284: | |
285: | Arguments: |
286: | none |
287: | |
288: | Returns: |
289: | void |
290: | |
291: \*----------------------------------------------------------------------------*/
292:
293: STATICFN void update_device_list(
294: void)
295: {
296: char aszBuf[BUFFER_LENGTH]; /* string used for several things */
297: MCI_SYSINFO_PARMS sysinfo; /* Parameter structure used for getting
298: information about the devices in the
299: system */
300: HWND hwndList; /* handle to the Devices listbox window */
301: int nDevices;
302: int nCurrentDevice;
303: #if DBG
304: BOOL fNoRedraw = FALSE;
305: #endif
306:
307: /* If the Devices dialog is not present, then return */
308:
309: if (hwndDevices == 0) {
310: return;
311: }
312:
313: /* Find out how many devices are currently open in the system */
314:
315: nDevices = get_number_of_devices();
316:
317: /* Update the dialog caption appropriately */
318:
319: wsprintf(aszBuf, aszDeviceTextFormat, nDevices);
320: SetWindowText(hwndDevices, aszBuf);
321:
322: /* Get a handle to the dialog's listbox, and prepare it for updating */
323:
324: hwndList = GetDlgItem (hwndDevices, ID_DEVICE_LIST);
325: SendMessage (hwndList, LB_RESETCONTENT, 0, 0L);
326:
327: if (nDevices) {
328: SendMessage (hwndList, WM_SETREDRAW, FALSE, 0L);
329: #if DBG
330: fNoRedraw = TRUE;
331: #endif
332: }
333:
334: /*
335: * Get the name of each open device in the system, one device at a time.
336: * Add each device's name to the listbox.
337: */
338:
339: for (nCurrentDevice = 1; nCurrentDevice <= nDevices; ++nCurrentDevice) {
340:
341: sysinfo.dwNumber = nCurrentDevice;
342: sysinfo.lpstrReturn = (LPSTR)&aszBuf;
343: sysinfo.dwRetSize = sizeof(aszBuf);
344:
345: /* If an error is encountered, skip to the next device.
346: */
347: if (mciSendCommand(MCI_ALL_DEVICE_ID, MCI_SYSINFO,
348: MCI_SYSINFO_OPEN | MCI_SYSINFO_NAME,
349: (DWORD)(LPMCI_SYSINFO_PARMS)&sysinfo) != 0) {
350: continue;
351: }
352:
353: /* Redraw the list when all device names have been added.
354: */
355: if (nCurrentDevice == nDevices) {
356: /* About to add the last device - allow redrawing */
357: SendMessage(hwndList, WM_SETREDRAW, TRUE, 0L);
358: #if DBG
359: fNoRedraw = FALSE;
360: #endif
361: }
362:
363: /* Add the device name to the listbox.
364: */
365: SendMessage(hwndList, LB_ADDSTRING, 0, (LONG)(LPSTR)aszBuf);
366: }
367:
368:
369: #if DBG
370: if (fNoRedraw) { // We had an error...
371: dDbgAssert("Assert failed, REDRAW is still off", __FILE__, __LINE__);
372: }
373: #endif
374:
375: /* Remember the number of open devices we found this time */
376:
377: nLastNumberOfDevices = nDevices;
378: }
379:
380: /*----------------------------------------------------------------------------*\
381: | sendstring( hwndDlg, strBuffer ) |
382: | |
383: | Description: |
384: | This function sends the string command specified in <strBuffer> to MCI |
385: | via the MCI string interface. Any message returned by MCI is displayed |
386: | in the 'MCI output' box. Any error which may have occurred is displayed|
387: | in the 'Error' box'. |
388: | |
389: | Arguments: |
390: | hwndDlg window handle of the main dialog window |
391: | strBuffer pointer to the string containing the string command to |
392: | be executed |
393: | Returns: |
394: | void |
395: | |
396: \*----------------------------------------------------------------------------*/
397:
398: DWORD sendstring(
399: HWND hwndDlg,
400: PSTR strBuffer)
401: {
402: char aszReturn[BUFFER_LENGTH]; /* string containing the message
403: returned by MCI */
404: DWORD dwErr; /* variable containing the return
405: code from the MCI command */
406: dprintf2("sendstring: %s", strBuffer);
407:
408: /* Uncheck the notification buttons */
409:
410: CheckDlgButton (hwndDlg, ID_NOT_SUCCESS, FALSE);
411: CheckDlgButton (hwndDlg, ID_NOT_SUPER, FALSE);
412: CheckDlgButton (hwndDlg, ID_NOT_ABORT, FALSE);
413: CheckDlgButton (hwndDlg, ID_NOT_FAIL, FALSE);
414:
415: /* Send the string command to MCI */
416:
417: dwErr = mciSendString(strBuffer, aszReturn, sizeof(aszReturn), hwndDlg);
418:
419: /* Put the text message returned by MCI into the 'MCI Output' box */
420:
421: SetDlgItemText (hwndDlg, ID_OUTPUT, aszReturn);
422:
423: /*
424: * Decode the error # returned by MCI, and display the string in the
425: * 'Error' box.
426: */
427:
428: mciGetErrorString(dwErr, strBuffer, BUFFER_LENGTH);
429: SetDlgItemText(hwndDlg, ID_ERRORCODE, strBuffer);
430:
431: /* Update the internal list of currently open devices */
432:
433: update_device_list();
434: return dwErr;
435: }
436:
437:
438: /*----------------------------------------------------------------------------*\
439: | ErrDlgFunc( hwndDlg, Msg, wParam, lParam ) |
440: | |
441: | Description: |
442: | This function is the callback function for the dialog box which |
443: | occurs during the execution of a error in a loop of MCITEST commands |
444: | It displays Abort, Continue and Ignore buttons |
445: | |
446: | Arguments: |
447: | hwndDlg window handle of the error message dialog window |
448: | Msg message number |
449: | wParam message-dependent parameter |
450: | lParam message-dependent parameter |
451: | |
452: | Returns: |
453: | normal message passing return values |
454: | |
455: \*----------------------------------------------------------------------------*/
456:
457:
458: BOOL ErrDlgFunc(
459: HWND hwndDlg,
460: UINT Msg,
461: LONG wParam,
462: LONG lParam)
463: {
464: dprintf4("ErrDlgFunc");
465: switch( Msg ) {
466: case WM_INITDIALOG:
467: return TRUE;
468:
469:
470: case WM_COMMAND:
471: switch( LOWORD(wParam) ) { // button pushed
472: case IDABORT:
473: case IDOK:
474: case IDIGNORE:
475: EndDialog( hwndDlg, LOWORD(wParam) ); // return button ID
476: break;
477: }
478: break;
479: }
480: return( FALSE );
481: }
482:
483: /*----------------------------------------------------------------------------*\
484: | execute( hwndDlg, fStep ) |
485: | |
486: | Description: |
487: | This function executes the MCI command which is currently selected in |
488: | the edit box. If <fStep> is true, then only this one line will be |
489: | executed. Otherwise, every line from the currently selected line to |
490: | the last line in the edit box will be executed sequentially. |
491: | |
492: | Arguments: |
493: | hwndDlg window handle of the main dialog window |
494: | fSingleStep flag indicating whether or not to work in 'single step'|
495: | mode |
496: | Returns: |
497: | void |
498: | |
499: \*----------------------------------------------------------------------------*/
500:
501: void execute(
502: HWND hwndDlg,
503: BOOL fSingleStep)
504: {
505: int iLine; /* line # of the command currently being executed
506: in the edit box */
507: int n=0; /* counter variable */
508: int runcount = 1;
509: int count;
510: int iLineStart;
511: BOOL fIgnoreErrors = FALSE;
512:
513: runcount = GetDlgItemInt(hwndDlg, ID_RUNCOUNT, NULL, TRUE);
514:
515: /*
516: * Go through this loop for every line in the edit box from the currently
517: * selected line to the last line, or a single line if in single step mode
518: */
519:
520: iLineStart = EditGetCurLine(hwndEdit);
521: dprintf2("Called to execute %d lines from line %d", runcount, iLineStart);
522:
523: for (count = runcount; count-- > 0; )
524: {
525: for (iLine = iLineStart;
526: EditGetLine(hwndEdit, iLine, aszBuffer, sizeof(aszBuffer));
527: iLine++ ) {
528:
529: /* If we hit a comment line or a blank line, skip to the next line */
530:
531: if (*aszBuffer == ';' || *aszBuffer == 0) {
532: continue;
533: }
534:
535: /* Select the line that is about to be processed */
536:
537: EditSelectLine(hwndEdit,iLine);
538:
539: /*
540: * If we're in 'single step' mode and we've already processed one
541: * line, then break out of the loop (and exit the routine).
542: */
543:
544: if (fSingleStep && ++n == 2) {
545: break;
546: }
547:
548: /*
549: * Send the command on the current line to MCI via the string
550: * interface.
551: */
552:
553: if (sendstring(hwndDlg, aszBuffer) != 0
554: && !fIgnoreErrors
555: && runcount > 1
556: && !fSingleStep) {
557:
558: int nRet;
559:
560: nRet = DialogBox(hInstApp, MAKEINTRESOURCE(IDD_ERRORDLG),
561: hwndDlg, (DLGPROC)ErrDlgFunc);
562:
563: if (nRet == IDABORT) { goto exit_fn; }
564: if (nRet == IDIGNORE) { fIgnoreErrors = TRUE; }
565:
566: }
567: }
568: SetDlgItemInt (hwndDlg, ID_RUNCOUNT, count, TRUE);
569: if (fSingleStep) { break; }
570: }
571: exit_fn:;
572: SetDlgItemInt (hwndDlg, ID_RUNCOUNT, runcount, TRUE);
573: }
574:
575:
576: /*----------------------------------------------------------------------------*\
577: | devices( hwndDlg, uMessage, wParam, lParam ) |
578: | |
579: | Description: |
580: | This function handles messages belonging to the "List of open devices" |
581: | dialog box. The only message that it looks for is WM_COMMAND, |
582: | indicating the user has pressed the "OK" button. When this happens, |
583: | it takes down the dialog box. |
584: | |
585: | Arguments: |
586: | hwndDlg window handle of the Devices dialog window |
587: | uMessage message number |
588: | wParam message-dependent parameter |
589: | lParam message-dependent parameter |
590: | |
591: | Returns: |
592: | TRUE if the message has been processed, else FALSE |
593: | |
594: \*----------------------------------------------------------------------------*/
595:
596: STATICFN BOOL devices(
597: HWND hwndDlg,
598: UINT Msg,
599: LONG wParam,
600: LONG lParam)
601: {
602: switch (Msg) {
603:
604: case WM_COMMAND:
605:
606: dprintf4("Devices -- WM_COMMAND");
607: switch (LOWORD(wParam)) {
608:
609: case ID_END_DEVICE_LIST:
610:
611: hwndDevices = 0;
612: EndDialog(hwndDlg,TRUE);
613:
614: break;
615: }
616:
617: break;
618: }
619:
620: return FALSE;
621: }
622:
623:
624:
625: /*----------------------------------------------------------------------------*\
626: | create_device_list() |
627: | |
628: | Description: |
629: | This function creates the Devices dialog box and updates the list of |
630: | open devices displayed in it. |
631: | |
632: | Arguments: |
633: | none |
634: | |
635: | Returns: |
636: | void |
637: | |
638: \*----------------------------------------------------------------------------*/
639:
640: void create_device_list(
641: void)
642: {
643: /* Create the Devices dialog box */
644:
645: hwndDevices = CreateDialog(hInstApp, MAKEINTRESOURCE(IDD_DEVICES),
646: hwndMainDlg, (DLGPROC)devices);
647: //hwndDevices = CreateDialog (hInstApp, "devices", hwndMainDlg, (WNDPROC)devices);
648:
649: if (hwndDevices == NULL) {
650: dprintf1("NULL hwndDevices");
651: return;
652: }
653:
654: /* Update the information displayed in the listbox */
655:
656: update_device_list();
657: }
658:
659:
660: /*----------------------------------------------------------------------------*\
661: | mcitester( hwndDlg, Msg, wParam, lParam ) |
662: | |
663: | Description: |
664: | This function is the main message handler for MCI test. It handles |
665: | messages from the pushbuttons, radio buttons, edit controls, menu |
666: | system, etc. When it receives a WM_EXIT message, this routine tears |
667: | everything down and exits. |
668: | |
669: | Arguments: |
670: | hwndDlg window handle of the main dialog window |
671: | Msg message number |
672: | wParam message-dependent parameter |
673: | lParam message-dependent parameter |
674: | |
675: | Returns: |
676: | TRUE if the message has been processed, else FALSE |
677: | |
678: \*----------------------------------------------------------------------------*/
679:
680: BOOL mcitester(
681: HWND hwndDlg,
682: UINT Msg,
683: LONG wParam,
684: LONG lParam)
685: {
686: DWORD dw; /* return value from various messages */
687: UINT EnableOrNot; /* is something currently selected? */
688: UINT wID; /* the type of notification required */
689: int i;
690:
691: #if DBG
692: if (Msg != WM_MOUSEMOVE && Msg != WM_NCHITTEST && Msg != WM_NCMOUSEMOVE
693: && (Msg < WM_CTLCOLORMSGBOX || Msg > WM_CTLCOLORSTATIC)
694: && Msg != WM_SETCURSOR) {
695: dprintf4("hWnd: %08XH, Msg: %08XH, wParam: %08XH, lParam: %08XH", hwndDlg, Msg, wParam, lParam );
696: }
697: #endif
698: switch (Msg) {
699:
700: case WM_COMMAND:
701:
702: dprintf3("WM_COMMAND, wParam: %08XH, lParam: %08XH", wParam, lParam);
703: switch (LOWORD(wParam)) {
704:
705: case IDOK:
706:
707: /*
708: * When the OK button gets pressed, insert a CR LF into
709: * the edit control. and execute the current line.
710: *
711: */
712:
713: SetFocus(hwndEdit);
714: i = EditGetCurLine(hwndEdit);
715:
716: execute(hwndDlg, TRUE);
717:
718: EditSetCurLine(hwndEdit, i);
719:
720: SendMessage(hwndEdit, WM_KEYDOWN, VK_END, 0L);
721: SendMessage(hwndEdit, WM_KEYUP, VK_END, 0L);
722: SendMessage(hwndEdit, EM_REPLACESEL, 0,(LONG)(LPSTR)aszEOL);
723:
724: break;
725:
726: case ID_GO:
727:
728: /*
729: * When the GO! button gets pressed, execute every line
730: * in the edit box starting with the first one.
731: *
732: */
733:
734: EditSetCurLine(hwndEdit, 0);
735: execute(hwndDlg, FALSE);
736:
737: break;
738:
739: case ID_STEP:
740:
741: /*
742: * When the STEP button gets pressed, execute the currently
743: * selected line in the edit box.
744: */
745:
746: execute(hwndDlg, TRUE);
747:
748: break;
749:
750: case MENU_EXIT:
751: case ID_EXIT:
752: case IDCANCEL:
753:
754: /*
755: * If the user indicates that he/she wishes to exit the
756: * application, then end the main dialog and post a WM_QUIT
757: * message.
758: *
759: */
760:
761: EndDialog(hwndDlg,TRUE);
762: PostQuitMessage (0);
763: hwndMainDlg = 0;
764:
765: break;
766:
767: case MENU_ABOUT:
768:
769: /* Show the 'About...' box */
770:
771: DialogBox(hInstApp, MAKEINTRESOURCE(IDD_ABOUTBOX), hwndDlg, (DLGPROC)AboutDlgProc);
772: break;
773:
774: case WM_CLEAR:
775: case WM_CUT:
776: case WM_COPY:
777: case WM_PASTE:
778: case WM_UNDO:
779:
780: /* Pass whatever edit message we receive to the edit box */
781: // BUGBUG This might well be bogus
782: dprintf3("sending edit Msg to edit control");
783: SendMessage(hwndEdit, LOWORD(wParam), 0, 0);
784:
785: break;
786:
787: case MENU_OPEN:
788:
789: /* Open a 'File Open' dialog */
790: #ifdef WIN16
791:
792: f = OpenFileDialog(hwndDlg, aszOpenFileTitle, aszExt,
793: DLGOPEN_MUSTEXIST | OF_EXIST | OF_READ, NULL,
794: aszBuffer, sizeof(aszBuffer));
795:
796: /* If the user selected a valid file, then open it */
797:
798: if ((int)f >= 0)
799: OpenMciFile(hwndDlg, aszBuffer);
800: #else
801:
802: strcpy(aszBuffer, aszExt);
803: i = DlgOpen(hInstApp, hwndDlg, aszBuffer, sizeof(aszBuffer) );
804:
805: /* If the user selected a valid file, then open it */
806:
807: if (i == 1)
808: OpenMciFile(hwndDlg, aszBuffer);
809: #endif
810:
811: break;
812:
813: case MENU_SAVE:
814:
815: /*
816: * If a filename exists, then save the contents of the edit
817: * box under that filename.
818: *
819: */
820:
821: if (*aszMciFile) {
822:
823: EditSaveFile(hwndEdit, aszMciFile);
824: break;
825: }
826:
827: break;
828:
829: case MENU_SAVEAS:
830:
831: /*
832: */
833:
834: #ifdef WIN16
835: *aszBuffer = (char)0;
836: f = OpenFileDialog(hwndDlg, aszSaveFileTitle, aszExt,
837: DLGOPEN_SAVE | OF_EXIST, aszSaveFileControl, aszBuffer,
838: sizeof(aszBuffer));
839:
840: /* If the user didn't hit Cancel, then he must have set a
841: * filename, so save the contents of the edit box under
842: * that filename.
843: */
844: if (f != DLGOPEN_CANCEL) {
845:
846: EditSaveFile(hwndEdit, aszBuffer);
847: }
848:
849: #else
850: strcpy(aszBuffer, aszExt);
851: i = DlgOpen(hInstApp, hwndDlg, aszBuffer, sizeof(aszBuffer) );
852:
853: /*
854: * If the user didn't hit Cancel, then he must have set a
855: * filename, so save the contents of the edit box under
856: * that filename.
857: *
858: */
859:
860: if (i != 2) {
861:
862: EditSaveFile(hwndEdit, aszBuffer);
863: }
864: #endif
865: break;
866:
867: case MENU_DEVICES:
868:
869: /*
870: * If the Devices dialog box doesn't already exist, then
871: * create and display it.
872: *
873: */
874:
875: if (hwndDevices == 0) {
876: create_device_list();
877: }
878:
879: break;
880:
881: #if DBG
882: case IDM_DEBUG0:
883: case IDM_DEBUG1:
884: case IDM_DEBUG2:
885: case IDM_DEBUG3:
886: case IDM_DEBUG4:
887: dDbgSetDebugMenuLevel(wParam - IDM_DEBUG0);
888: break;
889: #endif
890:
891: }
892: break; // end of WM_COMMAND case
893:
894: case WM_INITDIALOG:
895:
896: /* Do general initialization stuff */
897:
898: hwndEdit = GetDlgItem(hwndDlg,ID_INPUT);
899:
900: dprintf3("WM_INITDIALOG: hwndEdit = %08xH", hwndEdit);
901:
902: SetMenu(hwndDlg, LoadMenu(hInstApp, MAKEINTRESOURCE(IDM_MCITEST)));
903:
904: SetClassLong (hwndDlg, GCL_HICON,
905: (DWORD)LoadIcon (hInstApp, MAKEINTRESOURCE(IDI_MCITEST)));
906:
907: CheckDlgButton (hwndDlg, ID_NOT_SUCCESS, FALSE);
908: CheckDlgButton (hwndDlg, ID_NOT_SUPER, FALSE);
909: CheckDlgButton (hwndDlg, ID_NOT_ABORT, FALSE);
910: CheckDlgButton (hwndDlg, ID_NOT_FAIL, FALSE);
911: SetDlgItemInt (hwndDlg, ID_RUNCOUNT, 1, TRUE);
912:
913: #if DBG
914: // Check the initial debug level
915: {
916: HANDLE hMenu;
917: hMenu = GetMenu(hwndDlg);
918: CheckMenuItem(hMenu, (UINT)(__iDebugLevel + IDM_DEBUG0), MF_CHECKED);
919: }
920: #endif
921:
922: hAccTable = LoadAccelerators(hInstApp, MAKEINTRESOURCE(IDA_MCITEST));
923:
924: dprintf4("INIT_DIALOG: hwndEdit = %08XH Haccel = %08XH,", hwndEdit, hAccTable);
925:
926: return TRUE;
927:
928: case WM_DESTROY:
929:
930: /* End the dialog and send a WM_QUIT message */
931:
932: dprintf2("dialog ending");
933: dSaveDebugLevel(aszAppName);
934: EndDialog(hwndDlg,TRUE);
935: PostQuitMessage (0);
936: hwndMainDlg = 0;
937:
938: break;
939:
940: case MM_MCINOTIFY:
941:
942: /*
943: * Check the radio button corresponding to the notification
944: * received.
945: *
946: */
947:
948: dprintf3("MM_MCINOTIFY, wParam: %08XH", wParam);
949: wID = 0;
950: switch (wParam) {
951: case MCI_NOTIFY_SUCCESSFUL:
952:
953: wID = ID_NOT_SUCCESS;
954: break;
955:
956: case MCI_NOTIFY_SUPERSEDED:
957:
958: wID = ID_NOT_SUPER;
959: break;
960:
961: case MCI_NOTIFY_ABORTED:
962:
963: wID = ID_NOT_ABORT;
964: break;
965:
966: case MCI_NOTIFY_FAILURE:
967:
968: wID = ID_NOT_FAIL;
969: break;
970:
971: default:
972: break;
973: }
974:
975: if (wID) {
976:
977: CheckDlgButton (hwndDlg, wID, TRUE);
978: SetFocus (GetDlgItem(hwndDlg, ID_INPUT));
979: }
980:
981: break;
982:
983: case WM_INITMENUPOPUP: /* wParam is menu handle */
984:
985: dprintf3("WM_INITMENUPOPUP");
986:
987: /* Enable the 'Save' option if a valid filename exists */
988:
989: EnableMenuItem((HMENU)wParam, (UINT)MENU_SAVE,
990: (UINT)(*aszMciFile ? MF_ENABLED : MF_GRAYED));
991:
992: /* Find out if something is currently selected in the edit box */
993:
994: dw = SendMessage(hwndEdit,EM_GETSEL,0,0L);
995: EnableOrNot = (UINT)((HIWORD(dw) != LOWORD(dw) ? MF_ENABLED : MF_GRAYED));
996:
997: /* Enable / disable the Edit menu options appropriately */
998:
999: EnableMenuItem ((HMENU)wParam, (UINT)WM_UNDO ,
1000: (UINT)(SendMessage(hwndEdit,EM_CANUNDO,0,0L) ? MF_ENABLED : MF_GRAYED));
1001: EnableMenuItem ((HMENU)wParam, WM_CUT , EnableOrNot);
1002: EnableMenuItem ((HMENU)wParam, WM_COPY , EnableOrNot);
1003: EnableMenuItem ((HMENU)wParam, WM_PASTE,
1004: (UINT)(IsClipboardFormatAvailable(CF_TEXT) ? MF_ENABLED : MF_GRAYED));
1005: EnableMenuItem ((HMENU)wParam, WM_CLEAR, EnableOrNot);
1006:
1007: return 0L;
1008: }
1009:
1010: return 0;
1011: }
1012:
1013:
1014: /*----------------------------------------------------------------------------*\
1015: | AppInit( hInst, hPrev, sw, szCmdLine) |
1016: | |
1017: | Description: |
1018: | This is called when the application is first loaded into memory. It |
1019: | performs all initialization that doesn't need to be done once per |
1020: | instance. |
1021: | |
1022: | Arguments: |
1023: | hInstance instance handle of current instance |
1024: | hPrev instance handle of previous instance |
1025: | sw not really used at all |
1026: | szCmdLine string containing the command line arguments |
1027: | |
1028: | Returns: |
1029: | TRUE if successful, FALSE if not |
1030: | |
1031: \*----------------------------------------------------------------------------*/
1032:
1033: BOOL AppInit(
1034: int argc,
1035: char *argv[])
1036: {
1037: /* Put up the main dialog box */
1038:
1039: hInstApp = GetModuleHandle(NULL);
1040: dprintf1("MCITEST starting... module handle is %xH", hInstApp);
1041:
1042: if (NULL ==
1043: (hwndMainDlg = CreateDialog (hInstApp,
1044: MAKEINTRESOURCE(IDD_MCITEST),// "mcitester",
1045: NULL, (DLGPROC)mcitester)
1046: )) {
1047: DWORD n;
1048:
1049: n = GetLastError();
1050: dprintf1("NULL hwndMainDLG, last error is %d", n);
1051: DebugBreak();
1052:
1053: return(FALSE);
1054: }
1055:
1056: /* Fix up WIN.INI if this is the first time we are run... */
1057:
1058: if (!GetProfileString(aszProfileSection, aszProfileKey, aszNULL, aszBuffer, sizeof(aszBuffer)))
1059: WriteProfileString(aszProfileSection, aszProfileKey, aszProfileSetting);
1060:
1061: /*
1062: * If a command line argument was specified, assume it to be a filename
1063: * and open that file.
1064: *
1065: */
1066:
1067: if (argc > 1 && *argv[1])
1068: OpenMciFile(hwndMainDlg, argv[1]);
1069:
1070: return TRUE;
1071: }
1072:
1073:
1074: /*----------------------------------------------------------------------------*\
1075: | WinMain( hInst, hPrev, lpszCmdLine, sw ) |
1076: | |
1077: | Description: |
1078: | The main procedure for the app. After initializing, it just goes |
1079: | into a message-processing loop until it gets a WM_QUIT message |
1080: | (meaning the app was closed). |
1081: | |
1082: | Arguments: |
1083: | hInst instance handle of this instance of the app |
1084: | hPrev instance handle of previous instance, NULL if first |
1085: | szCmdLine null-terminated command line string |
1086: | sw specifies how the window is to be initially displayed |
1087: | |
1088: | Returns: |
1089: | The exit code as specified in the WM_QUIT message. |
1090: | |
1091: \*----------------------------------------------------------------------------*/
1092:
1093: int _CRTAPI1 main(
1094: int argc,
1095: char *argv[],
1096: char *envp[])
1097: {
1098: MSG Msg; /* Windows message structure */
1099:
1100: // If we are in DEBUG mode, get debug level for this module
1101: dGetDebugLevel(aszAppName);
1102: #if DBG
1103: dprintf1("started (debug level %d)", __iDebugLevel);
1104: #endif
1105:
1106: /* Call the initialization procedure */
1107:
1108: if (!AppInit(argc, argv)) {
1109: return FALSE;
1110: }
1111:
1112:
1113: /* Poll the event queue for messages */
1114:
1115: while (GetMessage(&Msg, NULL, 0, 0)) {
1116:
1117: /*
1118: * If the Devices dialog is showing and the number of open devices has
1119: * changed since we last checked, then update the list of open devices.
1120: */
1121:
1122: if (hwndDevices != 0 && get_number_of_devices() != nLastNumberOfDevices) {
1123: update_device_list();
1124: }
1125:
1126: /* Main message processing */
1127:
1128: if (!hwndMainDlg || !IsDialogMessage(hwndMainDlg, &Msg)) {
1129: TranslateMessage(&Msg);
1130: DispatchMessage(&Msg);
1131: // IsDialogMessage may enter with hwndMainDlg != NULL and exit with
1132: // hwndMainDlg == NULL after processing the message
1133: }
1134: else if (hwndMainDlg) {
1135: TranslateAccelerator (hwndMainDlg, hAccTable, &Msg);
1136: }
1137: }
1138:
1139: return Msg.wParam;
1140: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.