home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Windows Gam…ming Gurus (2nd Edition) / Disc2.iso / msdn_vcb / samples / vc98 / sdk / winui / congui / gui.c < prev    next >
C/C++ Source or Header  |  1997-10-05  |  7KB  |  230 lines

  1.  
  2. /******************************************************************************\
  3. *       This is a part of the Microsoft Source Code Samples. 
  4. *       Copyright (C) 1993-1997 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. // GUI.C
  13. // ================================================================
  14. // This module contains all of the functions that interface to the
  15. // 'graphical' part of this program. This currently only relates to
  16. // the code that brings up the dialog box, and calls the WinHelp
  17. // engine.
  18.  
  19. #include <stdio.h>
  20. #include <string.h>
  21. #include <ctype.h>
  22. #include <windows.h>
  23. #include "ConGUI.h"
  24.  
  25. int DoHelp (char *szHelpTopic);
  26. int GetDialogArgs (char ***pargv);
  27. BOOL CenterWindow (HWND hwnd);
  28. BOOL APIENTRY CLDlgProc (HWND hdlg, UINT msg, WPARAM wParam, LPARAM lParam);
  29.  
  30.  
  31. // Use WINHELP to bring up the applicaiton help file
  32. int DoHelp (char *szHelpTopic)
  33. {
  34.     WinHelp (GetFocus(), "ConGUI.HLP", HELP_KEY, (DWORD)(LPSTR)szHelpTopic);
  35.     return TRUE;
  36. }
  37.  
  38.  
  39. // Bring up the dialog box, and pass back a 'command line' as was
  40. // specified by the user
  41. int GetDialogArgs (char ***pargv)
  42. {
  43.     int ret;
  44.     HANDLE hinst;
  45.     HWND hwnd;
  46.     char szFile[80];
  47.  
  48.     hinst = GetModuleHandle (NULL);
  49.     hwnd = GetFocus();
  50.  
  51.     ret = DialogBoxParam (hinst, "CL", NULL, CLDlgProc, (LPARAM)pargv);
  52.  
  53.     if (-1 == ret) {
  54.         ret = GetLastError();
  55.         printf ("Unable to create dialog: %d\n", ret);
  56.         GetModuleFileName (hinst, szFile, sizeof(szFile));
  57.         printf ("hinst = %d\n", hinst);
  58.         printf ("hwnd = %d\n", hwnd);
  59.         printf ("File = %s\n", szFile);
  60.         return FALSE;
  61.  
  62.     }
  63.     return ret;
  64. }
  65.  
  66. // A quick little routine that will center a window on the screen.
  67. // Handy for dialog boxes
  68. BOOL CenterWindow (HWND hwnd)
  69. {
  70.     RECT    rect;
  71.     int     w, h;
  72.     int     wScreen, hScreen, xNew, yNew;
  73.     HDC     hdc;
  74.  
  75.     GetWindowRect (hwnd, &rect);
  76.     w = rect.right - rect.left;
  77.     h = rect.bottom - rect.top;
  78.  
  79.     hdc = GetDC (hwnd);
  80.     wScreen = GetDeviceCaps (hdc, HORZRES);
  81.     hScreen = GetDeviceCaps (hdc, VERTRES);
  82.     ReleaseDC (hwnd, hdc);
  83.  
  84.     xNew = wScreen/2 - w/2;
  85.     yNew = hScreen/2 - h/2;
  86.  
  87.     return SetWindowPos (hwnd, NULL, xNew, yNew, 0, 0, SWP_NOSIZE | SWP_NOZORDER);
  88. }
  89.  
  90.  
  91. // Create a data structure that will hold the strings for the combo boxes
  92. // we have in our dialog. This just illustrates 'a' way to do this, not
  93. // necessarily the best.
  94.  
  95. typedef struct tagDlgCtrls {
  96.     int ctrlId;
  97.     int def;
  98.     char str[25];
  99.     char opt[5];
  100. } DlgCtrls;
  101.  
  102. DlgCtrls dlgctrls[] = {
  103.     { 415, FALSE, "DOS EXE", "..." },
  104.     { 415, FALSE, "Windows 3.0 EXE", "..."  },
  105.     { 415, FALSE, "Windows 3.0 DLL", "..."  },
  106.     { 415, FALSE, "Windows 3.1 EXE", "..."  },
  107.     { 415, FALSE, "Windows 3.1 DLL", "..."  },
  108.     { 415, TRUE,  "Windows NT EXE", "..."  },
  109.     { 415, FALSE, "Windows NT DLL", "..."  },
  110.     { 415, FALSE, "Windows NT Console App", "..."  },
  111.  
  112.     { 402, FALSE, "Small", "AS" },
  113.     { 402, FALSE, "Medium", "AM" },
  114.     { 402, FALSE, "Compact", "AC" },
  115.     { 402, TRUE,  "Large", "AL" },
  116.     { 402, FALSE, "Huge", "AH" },
  117.     { 402, FALSE, "Customize", "A?" },
  118.  
  119.     { 404, FALSE, "8086", "G0" },
  120.     { 404, FALSE, "80186", "G1" },
  121.     { 404, TRUE,  "80286", "G2" },
  122.     { 404, FALSE, "80386", "G3" },
  123.     { 404, FALSE, "80486", "G4" },
  124.  
  125.     { 406, TRUE,  "stdcall", "Gz" },
  126.     { 406, FALSE, "Pascal", "Gc" },
  127.     { 406, FALSE, "C", "Gd" },
  128.  
  129.     { 408, FALSE, "Level 0", "W0" },
  130.     { 408, FALSE, "Level 1", "W1" },
  131.     { 408, FALSE, "Level 2", "W2" },
  132.     { 408, TRUE,  "Level 3", "W3" },
  133.     { 408, FALSE, "Level 4", "W4" },
  134.  
  135.     { 411, FALSE, "None", "" },
  136.     { 411, FALSE, "Line Numbers Only", "Zd" },
  137.     { 411, TRUE,  "Full Information", "Zi" },
  138.  
  139.     { 418, FALSE, "Ansi C", "Za" },
  140.     { 418, TRUE, "MS Extensions", "Ze" },
  141.  
  142.     { 413, FALSE, "None", "" },
  143.     { 413, TRUE,  "Protect Mode App", "GA" },
  144.     { 413, FALSE, "Protect Mode DLL", "GD" },
  145.  
  146.     { 0, 0}  // End Of List
  147. };
  148.  
  149.  
  150. BOOL APIENTRY CLDlgProc (HWND hdlg, UINT msg, WPARAM wParam, LPARAM lParam)
  151. {
  152.     int wmId;
  153.     static char ***pargv;
  154.     static char **argv;
  155.  
  156.     int i, item, index, iCtrl, argc;
  157.     char *cmd;
  158.     char *cmdline;
  159.  
  160.     switch (msg) {
  161.         case WM_INITDIALOG:
  162.             // We need to initialize stuff in the dialog box...
  163.  
  164.             pargv = (char ***)lParam;
  165.             argv = *pargv;
  166.             CenterWindow (hdlg);
  167.  
  168.             iCtrl = i = 0;
  169.             while (dlgctrls[i].ctrlId) {
  170.                 if (dlgctrls[i].ctrlId != iCtrl) { // Starting a new list
  171.                     iCtrl = dlgctrls[i].ctrlId;
  172.                 }
  173.                 index = SendDlgItemMessage (hdlg, iCtrl, CB_ADDSTRING, 0, (DWORD)(LPSTR)dlgctrls[i].str);
  174.                 SendDlgItemMessage (hdlg, iCtrl, CB_SETITEMDATA, index, i);
  175.                 if (dlgctrls[i].def) {
  176.                     SendDlgItemMessage (hdlg, dlgctrls[i].ctrlId, CB_SETCURSEL, index, 0);
  177.                 }
  178.                 i++;
  179.             }
  180.             return (TRUE);
  181.  
  182.         case WM_DESTROY:
  183.             break;
  184.  
  185.         case WM_COMMAND:
  186.             wmId = LOWORD(wParam);
  187.             switch (wmId) {
  188.  
  189.                 case T_HELP:
  190.                     DoHelp ("Contents");
  191.                     break;
  192.  
  193.                 case IDOK:
  194.                     cmd = cmdline = (char *)GlobalAlloc (GPTR, 128);
  195.                     argv[0] = cmdline;
  196.                     argc = 0;
  197.  
  198.                     if (cmdline) {
  199.                         iCtrl = i = 0;
  200.                         while (dlgctrls[i].ctrlId) {
  201.                             if (dlgctrls[i].ctrlId != iCtrl) {
  202.                                 iCtrl = dlgctrls[i].ctrlId;
  203.                                 index = SendDlgItemMessage(hdlg, iCtrl, CB_GETCURSEL, 0, 0);
  204.                                 if (index) {
  205.                                     item = SendDlgItemMessage (hdlg, iCtrl, CB_GETITEMDATA, index, 0);
  206.                                     wsprintf ((LPSTR)cmd, "-%s", (LPSTR)dlgctrls[item].opt);
  207.                                     cmd += strlen(cmd);
  208.                                     cmd[0] = 0;
  209.                                     argv[++argc] = ++cmd;
  210.                                 }
  211.                             }
  212.                             i++;
  213.                         }
  214.  
  215.                     } // if (cmdline)...
  216.  
  217.                     EndDialog(hdlg, argc);
  218.                     return (TRUE);
  219.  
  220.                 case IDCANCEL:
  221.                     EndDialog(hdlg, 0);
  222.                     return (TRUE);
  223.             }
  224.             break;
  225.     }
  226.     return (FALSE);
  227.  
  228.     lParam; // unreferenced formal parameter
  229. }
  230.