|
|
1.1 root 1: #include <windows.h>
2: #include <string.h>
3: #include <stdio.h>
4:
5: #if !defined(NT)
6: #if defined (NOMM)
7: // define 'NOMM' if you want to build this for a non-sound machine
8: #define SND_SYNC 0
9: #define SND_FILENAME 0
10: #define SND_ALIAS 0
11: BOOL APIENTRY PlaySound(LPSTR lpszName, HANDLE hModule, UINT flags)
12: {
13: MessageBox (GetFocus(), lpszName, "Beeeeeep", MB_OK);
14: return TRUE;
15: }
16: #else
17: #include <mmsystem.h>
18: // Win32 has some extra flags that it is using...
19: #define SND_FILENAME 0
20: #define SND_ALIAS 0
21: #endif
22: // Here are some 'types' that Win32 uses that would be handy for Win16
23: #define UINT unsigned int
24: #define INT int
25: #define APIENTRY far pascal
26: // The Win16 call is different from the Win32 one
27: #define PlaySound(szFile, hMod, flags) sndPlaySound (szFile, flags)
28: #endif
29: #include <commdlg.h>
30: #include "playit.h"
31:
32: char szAppName[] = "PlayIt";
33:
34: HWND hwndMain;
35: HWND hwndChild;
36: HMENU hmenuRes;
37: UINT idMaxResource = IDM_RESOURCE;
38: WORD TimerID = 1; /* number used for timer-id */
39: CHAR szBuffer[200]; /* buffer for stringtable stuff */
40:
41: long FAR PASCAL WndProc (HWND, UINT, UINT, LONG);
42: BOOL FAR PASCAL AboutDlgProc (HWND, UINT, UINT, LONG);
43: BOOL APIENTRY GetFileName(LPSTR);
44: BOOL FillResMenu (HMENU);
45: long FAR PASCAL ChildWndProc (HWND, UINT, UINT, LONG);
46:
47: int APIENTRY WinMain (hInstance, hPrevInstance, lpszCmdLine, nCmdShow)
48: HANDLE hInstance, hPrevInstance;
49: LPSTR lpszCmdLine;
50: int nCmdShow;
51: {
52: MSG msg;
53: WNDCLASS wndclass;
54: HMENU hmenuApp;
55: PSTR szTooMany;
56: CHAR TempString[100];
57:
58: #if defined (NT)
59: nCmdShow = SW_SHOWNORMAL;
60: hInstance = GetModuleHandle( NULL );
61: #endif
62:
63: if (!hPrevInstance) {
64: wndclass.style = CS_HREDRAW | CS_VREDRAW;
65: wndclass.lpfnWndProc = (WNDPROC) WndProc;
66: wndclass.cbClsExtra = 0;
67: wndclass.cbWndExtra = 0;
68: wndclass.hInstance = hInstance;
69: wndclass.hIcon = LoadIcon (hInstance, szAppName);
70: wndclass.hCursor = LoadCursor (NULL, IDC_ARROW);
71: wndclass.hbrBackground = (HBRUSH)(COLOR_APPWORKSPACE+1);
72: wndclass.lpszMenuName = szAppName;
73: wndclass.lpszClassName = szAppName;
74:
75: if (!RegisterClass (&wndclass)) {
76: return FALSE;
77: }
78: wndclass.style = CS_HREDRAW | CS_VREDRAW;
79: wndclass.lpfnWndProc = (WNDPROC) ChildWndProc;
80: wndclass.cbClsExtra = 0;
81: wndclass.cbWndExtra = 10;
82: wndclass.hInstance = hInstance;
83: wndclass.hIcon = LoadIcon (hInstance, szAppName);
84: wndclass.hCursor = LoadCursor (NULL, IDC_ARROW);
85: wndclass.hbrBackground = GetStockObject(WHITE_BRUSH);
86: wndclass.lpszMenuName = (HMENU) NULL;
87: wndclass.lpszClassName = "SoundChild";
88:
89: if (!RegisterClass (&wndclass)) {
90: return FALSE;
91: }
92:
93:
94:
95: }
96:
97: hwndMain = CreateWindow (szAppName, szAppName,
98: WS_OVERLAPPEDWINDOW,
99: CW_USEDEFAULT, 0, 300, 200,
100: NULL, (HMENU) NULL, hInstance, NULL);
101:
102: /* create non-visible child window pop up*/
103: hwndChild = CreateWindow ("SoundChild", "SoundChild",
104: WS_CHILD | WS_CAPTION,
105: CW_USEDEFAULT, 0, 200, 100,
106: hwndMain, (HMENU)NULL, hInstance, NULL);
107:
108:
109: if (!SetTimer(hwndChild, TimerID, (UINT) 5000, 0L))
110: {
111: /* Windows only supports 16 public timers */
112: if(!(szTooMany = (PSTR)LocalAlloc(LPTR, 160))){
113: strcpy(TempString, " Too Many Timers Allocated ");
114: szTooMany = TempString;
115: }
116: else{
117: LoadString(hInstance, IDS_TOOMANY, (LPSTR)szTooMany, 160);
118: }
119: MessageBox((HWND)NULL, (LPSTR)szTooMany, (LPSTR)szBuffer, MB_OK | MB_ICONHAND | MB_SYSTEMMODAL);
120: return(FALSE);
121: }
122:
123: hmenuApp = GetMenu (hwndMain);
124: hmenuRes = CreatePopupMenu();
125: if (FillResMenu(hmenuRes)) {
126: if (InsertMenu (hmenuApp, GetMenuItemCount(hmenuApp)-1,
127: MF_BYPOSITION | MF_POPUP, (UINT)hmenuRes, (LPSTR)"&Resources")) {
128: DrawMenuBar (hwndMain);
129: }
130: }
131:
132: ShowWindow (hwndMain, nCmdShow);
133: UpdateWindow (hwndMain);
134:
135: while (GetMessage (&msg, NULL, 0, 0)) {
136: TranslateMessage (&msg);
137: DispatchMessage (&msg);
138: }
139: return msg.wParam;
140:
141: lpszCmdLine; // Just to resolve reference
142: }
143:
144:
145: BOOL CenterWindow (HWND hwndChild, HWND hwndParent)
146: {
147: RECT rChild, rParent;
148: int wChild, hChild, wParent, hParent;
149: int wScreen, hScreen, xNew, yNew;
150: HDC hdc;
151:
152: GetWindowRect (hwndChild, &rChild);
153: wChild = rChild.right - rChild.left;
154: hChild = rChild.bottom - rChild.top;
155:
156: GetWindowRect (hwndParent, &rParent);
157: wParent = rParent.right - rParent.left;
158: hParent = rParent.bottom - rParent.top;
159:
160: hdc = GetDC (hwndChild);
161: wScreen = GetDeviceCaps (hdc, HORZRES);
162: hScreen = GetDeviceCaps (hdc, VERTRES);
163: ReleaseDC (hwndChild, hdc);
164:
165: xNew = rParent.left + ((wParent - wChild) /2);
166: if (xNew < 0) {
167: xNew = 0;
168: } else if ((xNew+wChild) > wScreen) {
169: xNew = wScreen - wChild;
170: }
171:
172: yNew = rParent.top + ((hParent - hChild) /2);
173: if (yNew < 0) {
174: yNew = 0;
175: } else if ((yNew+hChild) > hScreen) {
176: yNew = hScreen - hChild;
177: }
178:
179: return SetWindowPos (hwndChild, NULL, xNew, yNew, 0, 0, SWP_NOSIZE | SWP_NOZORDER);
180: }
181:
182:
183: BOOL APIENTRY AboutDlgProc(HWND hwnd, UINT msg, UINT wParam, LONG lParam)
184: {
185: INT wmId;
186:
187: switch (msg) {
188: case WM_INITDIALOG:
189: CenterWindow (hwnd, GetWindow (hwnd, GW_OWNER));
190: return (TRUE);
191:
192: case WM_COMMAND:
193: #if defined (NT)
194: wmId = LOWORD(wParam);
195: #elif defined (WIN16)
196: wmId = wParam;
197: #endif
198: switch (wmId) {
199: case IDOK:
200: case IDCANCEL:
201: EndDialog(hwnd, TRUE);
202: return (TRUE);
203: }
204: break;
205: }
206: return (FALSE);
207:
208: /* Just For Reference */
209: lParam;
210: }
211:
212: UINT BeepFlags (UINT wParam)
213: {
214: UINT flags = MB_OK;
215:
216: switch (wParam) {
217: case IDM_SYNC_ICONHAND:
218: case IDM_SYNC_ICONQUESTION:
219: case IDM_SYNC_ICONEXCLAMATION:
220: case IDM_SYNC_ICONASTERISK:
221: flags |= MB_TASKMODAL;
222: break;
223: }
224:
225: switch (wParam) {
226: case IDM_ICONHAND:
227: case IDM_SYNC_ICONHAND:
228: flags |= MB_ICONHAND;
229: break;
230:
231: case IDM_ICONQUESTION:
232: case IDM_SYNC_ICONQUESTION:
233: flags |= MB_ICONQUESTION;
234: break;
235:
236: case IDM_ICONEXCLAMATION:
237: case IDM_SYNC_ICONEXCLAMATION:
238: flags |= MB_ICONEXCLAMATION;
239: break;
240:
241: case IDM_ICONASTERISK:
242: case IDM_SYNC_ICONASTERISK:
243: flags |= MB_ICONASTERISK;
244: break;
245:
246: default:
247: break;
248: }
249: return flags;
250: }
251:
252:
253:
254: long FAR PASCAL WndProc (hwnd, iMessage, wParam, lParam)
255: HWND hwnd;
256: UINT iMessage;
257: UINT wParam;
258: LONG lParam;
259: {
260: static char szSoundName[80];
261: static UINT sndFlags;
262: HANDLE hInst;
263: FARPROC lpDlgProc;
264: UINT wmId, wmEvent;
265: char szBuf[25];
266: char szErr[25];
267: UINT flags;
268: DWORD err, i;
269:
270: #if defined (WIN16)
271: hInst = GetWindowWord (hwnd, GWW_HINSTANCE);
272: #elif defined (NT)
273: hInst = GetModuleHandle (NULL);
274: #endif
275:
276: switch (iMessage) {
277: case WM_CREATE:
278: szSoundName[0] = (char)0;
279: break;
280:
281: case WM_LBUTTONDOWN:
282: if (lstrlen(szSoundName) > 0) {
283: PlaySound (szSoundName, hInst, sndFlags);
284: }
285: break;
286:
287: case WM_COMMAND:
288: #if defined (NT)
289: wmId = LOWORD(wParam);
290: wmEvent = HIWORD(wParam);
291: #elif defined (WIN16)
292: wmId = wParam;
293: wmEvent = HIWORD(lParam);
294: #endif
295:
296: switch (wmId) {
297: case IDM_OPEN:
298: if (GetFileName (szSoundName)) {
299: sndFlags = SND_ASYNC | SND_FILENAME;
300:
301: /* SND_FILENAME doesn't seem to work, so...
302: WriteProfileString ("SOUNDS", "PLAYIT", szSoundName);
303: sndFlags = SND_ASYNC | SND_ALIAS;
304: strcpy (szSoundName, "PLAYIT");
305: */
306:
307:
308: sndFlags = SND_SYNC | SND_FILENAME;
309: // SND_FILENAME is currently having problems
310: // with path slashes... so lets switch in
311: // something that it can handle for now...
312: for (i=0; i<strlen(szSoundName); i++) {
313: if (szSoundName[i] == '\\')
314: szSoundName[i] = '/';
315: }
316:
317: if (!PlaySound(szSoundName, hInst, sndFlags)) {
318: err = GetLastError();
319: sprintf (szErr, "Error: %i [0x%x]", err, err);
320: MessageBox (GetFocus(), szErr, szSoundName, MB_OK);
321: }
322:
323: }
324: break;
325:
326: case IDM_ABOUT:
327: lpDlgProc = MakeProcInstance((FARPROC) AboutDlgProc, hInst);
328: DialogBox(hInst, "AboutBox", hwnd, (WNDPROC)lpDlgProc);
329: FreeProcInstance(lpDlgProc);
330: break;
331:
332: case IDM_HELP_CONTENTS:
333: WinHelp (hwnd, "PlayIt.HLP", HELP_KEY, (DWORD)"CONTENTS");
334: break;
335: case IDM_HELP_INDEX:
336: WinHelp (hwnd, "PlayIt.HLP", HELP_KEY, (DWORD)"INDEX");
337: break;
338: case IDM_HELP_OVERVIEW:
339: WinHelp (hwnd, "PlayIt.HLP", HELP_KEY, (DWORD)"OVERVIEW");
340: break;
341: case IDM_HELP_GLOSSARY:
342: WinHelp (hwnd, "PlayIt.HLP", HELP_KEY, (DWORD)"GLOSSARY");
343: break;
344: case IDM_HELP_TUTORIAL:
345: WinHelp (hwnd, "PlayIt.HLP", HELP_KEY, (DWORD)"TUTORIAL");
346: break;
347: case IDM_HELP_DEMO:
348: WinHelp (hwnd, "PlayIt.HLP", HELP_KEY, (DWORD)"DEMO");
349: break;
350: case IDM_HELP_HELP:
351: WinHelp (hwnd, "PlayIt.HLP", HELP_KEY, (DWORD)"HELP");
352: break;
353:
354:
355: case IDM_EXIT:
356: DestroyWindow(hwnd);
357: break;
358:
359:
360: default:
361: if (wmId >= IDM_RESOURCE && wmId <= idMaxResource) {
362: if (hmenuRes) {
363: GetMenuString (hmenuRes, wmId, szSoundName, sizeof(szBuf),
364: MF_BYCOMMAND);
365: sndFlags = SND_SYNC | SND_ALIAS;
366: switch(szSoundName[6]){
367:
368: case 'H':
369: case 'h':
370:
371: SendMessage(hwndChild, WM_COMMAND, MAKELONG(IDM_ICONHAND, NULL), (LONG)szSoundName);
372: SendMessage(hwndChild, WM_COMMAND, MAKELONG(IDM_UNHIDE, NULL), (LONG)szSoundName);
373: break;
374:
375: case 'Q':
376: case 'q':
377:
378: SendMessage(hwndChild, WM_COMMAND, MAKELONG(IDM_ICONQUESTION, NULL), (LONG)szSoundName);
379: SendMessage(hwndChild, WM_COMMAND, MAKELONG(IDM_UNHIDE, NULL), (LONG) szSoundName);
380: break;
381:
382: case 'E':
383: case 'e':
384:
385: SendMessage(hwndChild, WM_COMMAND, MAKELONG(IDM_ICONEXCLAMATION, NULL), (LONG)szSoundName);
386: SendMessage(hwndChild, WM_COMMAND, MAKELONG(IDM_UNHIDE, NULL), (LONG) szSoundName);
387: break;
388:
389: case 'A':
390: case 'a':
391:
392: SendMessage(hwndChild, WM_COMMAND, MAKELONG(IDM_ICONASTERISK, NULL), (LONG)szSoundName);
393: SendMessage(hwndChild, WM_COMMAND, MAKELONG(IDM_UNHIDE, NULL), (LONG) szSoundName);
394: break;
395:
396: default:
397: SendMessage(hwndChild, WM_COMMAND, MAKELONG(IDM_SYSTEMDEFAULT, NULL), (LONG) szSoundName);
398: SendMessage(hwndChild, WM_COMMAND, MAKELONG(IDM_UNHIDE, NULL), (LONG) szSoundName);
399: }
400: if (!PlaySound (szSoundName, hInst, sndFlags)) {
401: //err = GetLastError ();
402: //sprintf (szErr, "Error: %i [0x%x]", err, err);
403: MessageBox (hwnd, "ERROR", "PlaySound() Called SYNC failed", MB_OK);
404: }
405: SendMessage(hwndChild, WM_COMMAND, MAKELONG(IDM_HIDE, NULL), (LONG) szSoundName);
406:
407: }
408: }
409: break;
410:
411: }
412: break;
413:
414: case WM_DESTROY:
415: if (hwnd == hwndMain) {
416: DestroyWindow(hwndChild);
417: PostQuitMessage (0);
418: }
419: break;
420:
421: default:
422: return DefWindowProc (hwnd, iMessage, wParam, lParam);
423: }
424: return 0L;
425:
426: hInst; //Just to resolve reference
427: flags; // ditto
428: }
429:
430: #define ID_TEST 321
431: #define ID_FN 1152
432: #define ID_CANCEL IDCANCEL
433:
434: BOOL FAR PASCAL PlaySoundFileHook (HWND hdlg, UINT msg, UINT wParam, LONG lParam)
435: {
436: HWND hwndTest;
437: HWND hwndCancel;
438: char szTmp[256];
439: UINT cy, i;
440: RECT rect;
441: HANDLE hInst;
442: WORD wId;
443:
444: hInst = GetModuleHandle (NULL);
445:
446: switch (msg) {
447: case WM_INITDIALOG:
448:
449: /* Determine proper placement of the 'TEST' button */
450: hwndCancel = GetDlgItem (hdlg, ID_CANCEL);
451: if (hwndCancel!=0) {
452: GetWindowRect (hwndCancel, &rect);
453: cy = rect.bottom - rect.top;
454: rect.top = rect.bottom + cy;
455: rect.bottom = rect.top +cy;
456: ScreenToClient (hdlg, (LPPOINT)&rect.left);
457: ScreenToClient (hdlg, (LPPOINT)&rect.right);
458:
459: hwndTest = CreateWindow ("BUTTON", "&Test",
460: BS_PUSHBUTTON | WS_VISIBLE | WS_CHILD | WS_TABSTOP,
461: rect.left, rect.top, rect.right-rect.left, rect.bottom-rect.top,
462: hdlg, (HMENU)ID_TEST, hInst, 0L);
463: if (hwndTest==0) {
464: MessageBox (GetFocus(), "No Test Button", "Open", MB_OK);
465: } else {
466: ShowWindow (hwndTest, SW_SHOW);
467: }
468:
469: } else {
470: MessageBox (GetFocus(), "Unable to find cancel button", "OpenFile", MB_OK);
471: }
472:
473: break;
474:
475: case WM_COMMAND:
476: wId = LOWORD(wParam);
477: switch (wId) {
478: case ID_TEST:
479: /* The 'Viewer >>' button was pressed. */
480: GetWindowText (GetDlgItem(hdlg, ID_FN), szTmp, sizeof(szTmp));
481: for (i=0; i<(UINT)strlen(szTmp); i++) {
482: if (szTmp[i] == '\\')
483: szTmp[i] = '/';
484: }
485:
486: PlaySound(szTmp, NULL, SND_ASYNC | SND_FILENAME );
487:
488: }
489: break;
490: }
491: return (FALSE);
492:
493: lParam; // Just to reference it
494: }
495:
496:
497:
498: BOOL APIENTRY GetFileName(LPSTR lpstr)
499: {
500: OPENFILENAME ofn;
501: char szFilterSpec [128] = /* file type filters */
502: "Sound Files(*.WAV)\0*.WAV\0";
503:
504: #define MAXFILENAME 256
505: char szFileName[MAXFILENAME];
506: char szFileTitle[MAXFILENAME];
507:
508: lstrcpy(szFileName, ""); /* these need be NULL*/
509: lstrcpy(szFileTitle, "");
510:
511: /* fill in non-variant fields of OPENFILENAME struct. */
512: ofn.lStructSize = sizeof(OPENFILENAME);
513: ofn.hwndOwner = GetFocus();
514: ofn.lpstrFilter = szFilterSpec;
515: ofn.lpstrCustomFilter = NULL;
516: ofn.nMaxCustFilter = 0;
517: ofn.nFilterIndex = 0;
518: ofn.lpstrFile = szFileName;
519: ofn.nMaxFile = MAXFILENAME;
520: ofn.lpstrInitialDir = "..\\WAV";
521: ofn.lpstrFileTitle = szFileTitle;
522: ofn.nMaxFileTitle = MAXFILENAME;
523: ofn.lpstrTitle = "Open Sound File";
524: ofn.lpstrDefExt = "WAV";
525: ofn.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY
526: | OFN_PATHMUSTEXIST | OFN_ENABLEHOOK;
527: ofn.lpfnHook = (LPOFNHOOKPROC) PlaySoundFileHook;
528:
529: /* Use standard open dialog */
530: if (!GetOpenFileName ((LPOPENFILENAME)&ofn)){
531: *lpstr = NULL;
532: return FALSE;
533: }
534:
535: lstrcpy(lpstr, ofn.lpstrFile);
536: return TRUE;
537:
538: }
539:
540:
541: #define BUFSIZE 1024
542:
543: BOOL FillResMenu (HMENU hMenu)
544: {
545: HANDLE hBuf;
546: LPSTR lpBuf, lpString;
547: UINT cnt, idMenu;
548: CHAR tempstring[30];
549:
550: hBuf = GlobalAlloc(GMEM_FIXED|GMEM_ZEROINIT, BUFSIZE);
551: if(!hBuf){
552: return(FALSE);
553: }
554: lpBuf = GlobalLock (hBuf);
555:
556: cnt = GetProfileString ("sounds", NULL, "", lpBuf, BUFSIZE);
557: idMenu = IDM_RESOURCE;
558: if (cnt>0) {
559: lpString = lpBuf;
560: while (*lpString) {
561: strcpy(tempstring, lpString); /* this code is a hack for a user bug*/
562: strcat(tempstring, " ");
563: AppendMenu (hMenu, MF_STRING, idMenu++, tempstring);
564: lpString += lstrlen(lpString) +1;
565: }
566: }
567: idMaxResource = idMenu-1;
568:
569: GlobalUnlock (hBuf);
570: GlobalFree (hBuf);
571:
572: return (idMaxResource > IDM_RESOURCE);
573: }
574:
575:
576: long FAR PASCAL ChildWndProc (hwnd, iMessage, wParam, lParam)
577: HWND hwnd;
578: UINT iMessage;
579: UINT wParam;
580: LONG lParam;
581: {
582:
583:
584:
585: WORD wmId;
586: WORD wmEvent;
587: HDC hDc;
588: HICON hIcon;
589: PAINTSTRUCT ps;
590: static BOOL bWindowDone;
591: static BOOL bHideWindow;
592:
593: switch (iMessage) {
594:
595: case WM_PAINT:
596: hDc = BeginPaint(hwnd, &ps);
597: if((hIcon = (HICON) GetWindowLong(hwnd, 0))){
598: DrawIcon(ps.hdc, 80, 20, hIcon);
599: }
600: EndPaint(hwnd, &ps);
601: bWindowDone = TRUE;
602: break;
603:
604:
605: case WM_TIMER:
606: /* timer set, because USER coalesces the UNHIDEHIDE, such that
607: window never showed. This way, I never issue SW_HIDE, until, the window
608: has been shown*/
609:
610: if(bHideWindow == TRUE && bWindowDone == TRUE){
611: bWindowDone = FALSE;
612: bHideWindow = FALSE;
613: SetWindowLong(hwnd, 0, 0);
614: ShowWindow(hwnd, SW_HIDE);
615: }
616: break;
617:
618: case WM_COMMAND:
619: #if defined (NT)
620: wmId = LOWORD(wParam);
621: wmEvent = HIWORD(wParam);
622: #elif defined (WIN16)
623: wmId = wParam;
624: wmEvent = HIWORD(lParam);
625: #endif
626:
627: switch (wmId) {
628: case IDM_ICONHAND:
629: SetWindowText(hwnd, (LPSTR) lParam);
630: hIcon = LoadIcon(NULL, IDI_HAND);
631: SetWindowLong(hwnd, 0, (LONG) hIcon);
632: break;
633:
634: case IDM_ICONQUESTION:
635: SetWindowText(hwnd, (LPSTR) lParam);
636: hIcon = LoadIcon(NULL, IDI_QUESTION);
637: SetWindowLong(hwnd, 0, (LONG) hIcon);
638: break;
639:
640: case IDM_ICONEXCLAMATION:
641: SetWindowText(hwnd, (LPSTR) lParam);
642: hIcon = LoadIcon(NULL, IDI_EXCLAMATION);
643: SetWindowLong(hwnd, 0, (LONG) hIcon);
644: break;
645:
646: case IDM_ICONASTERISK:
647: SetWindowText(hwnd, (LPSTR) lParam);
648: hIcon = LoadIcon(NULL, IDI_ASTERISK);
649: SetWindowLong(hwnd, 0, (LONG) hIcon);
650: break;
651:
652: case IDM_SYSTEMDEFAULT: /* for System Default*/
653: SetWindowText(hwnd, (LPSTR) lParam);
654: SetWindowLong(hwnd, 0, 0);
655: break; /* NO ICON*/
656:
657: case IDM_HIDE:
658: bHideWindow = TRUE;
659: break;
660:
661: case IDM_UNHIDE:
662: ShowWindow(hwnd, SW_SHOW);
663: break;
664:
665: }
666: break;
667:
668: default:
669: return DefWindowProc (hwnd, iMessage, wParam, lParam);
670: }
671: return 0L;
672:
673:
674: }
675:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.