home *** CD-ROM | disk | FTP | other *** search
/ Microsoft Programmer's Library 1.3 / Microsoft-Programers-Library-v1.3.iso / sampcode / win_lrn / modeless / hello.c next >
C/C++ Source or Header  |  1988-10-11  |  11KB  |  365 lines

  1. /*  Hello.c
  2.     Hello Application
  3.     Windows Version 1.01
  4.     Copyright (c) Microsoft 1985
  5.  
  6. This application has been  revised  to  demonstrate  the  coding 
  7. differences between the two Dialog boxes: 
  8.    MODAL, created  using DialogBox and 
  9.    MODELESS, created using CreateDialog.  
  10. The  application  starts  out by having the user select the "GO" 
  11. menu item which creates the "First Dialog"  and  then  the  DEMO 
  12. button  then  creates  the "Second Dialog".  The "Second Dialog" 
  13. then allows you to push some buttons and process them.  
  14.  
  15. To point out the differences in coding,  there are  "#ifdef"  to 
  16. allow  you  to  compile using the desired method and to visually 
  17. see what needs to be done when using one method over the  other.  
  18. This  information  is  an  expanded implementation of the sample 
  19. code on pages 169-173 of the Programming Guide.  The default  is 
  20. set to compile using MODAL dialog boxes.  If you want to compile 
  21. using the MODELESS dialog boxes, change "MODAL" to "XMODAL".*/ 
  22.  
  23. #define XMODAL /* default */
  24.  
  25. #include "windows.h"
  26. #include "hello.h"
  27.  
  28. char szAppName[10];
  29. char szAbout[10];
  30. char szMessage[15];
  31. int  MessageLength;
  32.  
  33. #ifdef MODAL
  34. #else
  35. HWND  hDlgWnd1;
  36. HWND  hDlgWnd2;
  37. #endif
  38. static  HANDLE hInst;
  39. FARPROC lpprocAbout;
  40. FARPROC lpprocFirstDlg;
  41. FARPROC lpprocSecondDlg;
  42.  
  43. long FAR PASCAL HelloWndProc(HWND, unsigned, WORD, LONG);
  44. BOOL FAR PASCAL     FirstDlg(HWND, unsigned, WORD, LONG);
  45. BOOL FAR PASCAL    SecondDlg(HWND, unsigned, WORD, LONG);
  46.  
  47. BOOL FAR PASCAL About( hDlg, message, wParam, lParam )
  48. HWND hDlg;
  49. unsigned message;
  50. WORD wParam;
  51. LONG lParam;
  52. {
  53.     if (message == WM_COMMAND) {
  54.         EndDialog( hDlg, TRUE );
  55.         return TRUE;
  56.         }
  57.     else if (message == WM_INITDIALOG)
  58.         return TRUE;
  59.     else return FALSE;
  60. }
  61.  
  62.  
  63. void HelloPaint( hDC )
  64. HDC hDC;
  65. {
  66.     TextOut( hDC, (short)10, (short)10,
  67. #ifdef MODAL
  68.            (LPSTR)"DialogBox = Modal",(short)17 );
  69. #else
  70.            (LPSTR)"CreateDialog = Modeless",(short)23 );
  71. #endif
  72. }
  73.  
  74. /* Procedure called when the application is loaded for the first time */
  75. BOOL HelloInit( hInstance )
  76. HANDLE hInstance;
  77. {
  78.     PWNDCLASS   pHelloClass;
  79.  
  80.     /* Load strings from resource */
  81.     LoadString( hInstance, IDSNAME, (LPSTR)szAppName, 10 );
  82.     LoadString( hInstance, IDSABOUT, (LPSTR)szAbout, 10 );
  83.     MessageLength = LoadString( hInstance, IDSTITLE, (LPSTR)szMessage, 15 );
  84.  
  85.     pHelloClass = (PWNDCLASS)LocalAlloc( LPTR, sizeof(WNDCLASS) );
  86.  
  87.     pHelloClass->hCursor        = LoadCursor( NULL, IDC_ARROW );
  88.     pHelloClass->hIcon          = LoadIcon( hInstance, (LPSTR)szAppName );
  89.     pHelloClass->lpszMenuName   = (LPSTR)szAppName;
  90.     pHelloClass->lpszClassName  = (LPSTR)szAppName;
  91.     pHelloClass->hbrBackground  = (HBRUSH)GetStockObject( WHITE_BRUSH );
  92.     pHelloClass->hInstance      = hInstance;
  93.     pHelloClass->style          = CS_HREDRAW | CS_VREDRAW;
  94.     pHelloClass->lpfnWndProc    = HelloWndProc;
  95.  
  96.     if (!RegisterClass( (LPWNDCLASS)pHelloClass ) )
  97.         /* Initialization failed.
  98.          * Windows will automatically deallocate all allocated memory.
  99.          */
  100.         return FALSE;
  101.  
  102.     LocalFree( (HANDLE)pHelloClass );
  103.     return TRUE;        /* Initialization succeeded */
  104. }
  105.  
  106.  
  107. int PASCAL WinMain( hInstance, hPrevInstance, lpszCmdLine, cmdShow )
  108. HANDLE hInstance, hPrevInstance;
  109. LPSTR lpszCmdLine;
  110. int cmdShow;
  111. {
  112.     BOOL  bResult;
  113.     MSG   msg;
  114.     HWND  hWnd;
  115.     HMENU hMenu;
  116.  
  117.     if (!hPrevInstance) {
  118.         /* Call initialization procedure if this is the first instance */
  119.         if (!HelloInit( hInstance ))
  120.             return FALSE;
  121.         }
  122.     else {
  123.         /* Copy data from previous instance */
  124.         GetInstanceData( hPrevInstance, (PSTR)szAppName, 10 );
  125.         GetInstanceData( hPrevInstance, (PSTR)szAbout, 10 );
  126.         GetInstanceData( hPrevInstance, (PSTR)szMessage, 15 );
  127.         GetInstanceData( hPrevInstance, (PSTR)&MessageLength, sizeof(int) );
  128.         }
  129.  
  130.     hWnd = CreateWindow((LPSTR)szAppName,
  131.                         (LPSTR)szMessage,
  132.                         WS_TILEDWINDOW,
  133.                         0,    /*  x - ignored for tiled windows */
  134.                         0,    /*  y - ignored for tiled windows */
  135.                         0,    /* cx - ignored for tiled windows */
  136.                         0,    /* cy - ignored for tiled windows */
  137.                         (HWND)NULL,        /* no parent */
  138.                         (HMENU)NULL,       /* use class menu */
  139.                         (HANDLE)hInstance, /* handle to window instance */
  140.                         (LPSTR)NULL        /* no params to pass on */
  141.                         );
  142.  
  143.     /* Save instance handle for DialogBox */
  144.     hInst = hInstance;
  145.  
  146.     /* Bind callback function with module instance */
  147.         lpprocAbout = MakeProcInstance( (FARPROC)About,     hInstance );
  148.      lpprocFirstDlg = MakeProcInstance( (FARPROC)FirstDlg,  hInstance );
  149.     lpprocSecondDlg = MakeProcInstance( (FARPROC)SecondDlg, hInstance );
  150.  
  151.     /* Insert "About..." into system menu */
  152.     hMenu = GetSystemMenu(hWnd, FALSE);
  153.     ChangeMenu(hMenu, 0, NULL, 999, MF_APPEND | MF_SEPARATOR);
  154.     ChangeMenu(hMenu, 0, (LPSTR)szAbout, IDSABOUT, MF_APPEND | MF_STRING);
  155.  
  156.     /* Make window visible according to the way the app is activated */
  157.     ShowWindow( hWnd, cmdShow );
  158.     UpdateWindow( hWnd );
  159.  
  160.     /* Polling messages from event queue */
  161. #ifdef MODAL
  162.     while (GetMessage((LPMSG)&msg, NULL, 0, 0)) {
  163.         TranslateMessage((LPMSG)&msg);
  164.         DispatchMessage((LPMSG)&msg);
  165.         }
  166. #else
  167.     /* The following can be rewritten in many ways, but was made 
  168.        for clairity and for easy modification.
  169.        Since this program does not use an Accelerator Table the 
  170.        code has been commented out.  I thought I should put it 
  171.        in for completness.  */ 
  172.  
  173.     while (GetMessage((LPMSG)&msg, NULL, 0, 0)) {
  174.         bResult = NULL; /* default is that the message has not been processed */
  175.         if (hDlgWnd1 != NULL)
  176.            bResult = IsDialogMessage(hDlgWnd1, (LPMSG)&msg);
  177.         if (hDlgWnd2 != NULL)
  178.            bResult = IsDialogMessage(hDlgWnd2, (LPMSG)&msg);
  179.      /* if (!bResult)  /* message not processed by above dialog(s) */
  180.      /*    bResult = TranslateAccelerator(hWnd, hAccelTable, (LPMSG)&msg );
  181.      */
  182.         if (!bResult) {  /* the parent will get the message */
  183.              TranslateMessage((LPMSG)&msg);
  184.              DispatchMessage((LPMSG)&msg);
  185.         } /* end if */
  186.     } /* end while */
  187. #endif
  188.     return (int)msg.wParam;
  189. }
  190.  
  191.  
  192. long FAR PASCAL HelloWndProc( hWnd, message, wParam, lParam )
  193. HWND hWnd;
  194. unsigned message;
  195. WORD wParam;
  196. LONG lParam;
  197. {
  198.     PAINTSTRUCT ps;
  199.  
  200.     switch (message)
  201.     {
  202.     case WM_SYSCOMMAND:
  203.         switch (wParam)
  204.         {
  205.         case IDSABOUT:
  206.             DialogBox( hInst, MAKEINTRESOURCE(ABOUTBOX), hWnd, lpprocAbout );
  207.             break;
  208.         default:
  209.             return DefWindowProc( hWnd, message, wParam, lParam );
  210.         }
  211.         break;
  212.  
  213.     case WM_CREATE:
  214. #ifdef MODAL
  215. #else
  216.     hDlgWnd1 = NULL;  /* initialize the first time through */
  217.     hDlgWnd2 = NULL;  /* initialize the first time through */
  218. #endif
  219.         break;
  220.  
  221.     case WM_COMMAND:
  222. #ifdef MODAL
  223.         DialogBox( hInst, MAKEINTRESOURCE(FIRSTDIALOG),
  224.                    hWnd, lpprocFirstDlg);
  225. #else
  226.         hDlgWnd1 = CreateDialog( hInst, MAKEINTRESOURCE(FIRSTDIALOG),
  227.                                  hWnd, lpprocFirstDlg);
  228. #endif
  229.         break;
  230.  
  231.     case WM_DESTROY:
  232.         PostQuitMessage( 0 );
  233.         break;
  234.  
  235.     case WM_PAINT:
  236.         BeginPaint( hWnd, (LPPAINTSTRUCT)&ps );
  237.         HelloPaint( ps.hdc );
  238.         EndPaint( hWnd, (LPPAINTSTRUCT)&ps );
  239.         break;
  240.  
  241.     default:
  242.         return DefWindowProc( hWnd, message, wParam, lParam );
  243.         break;
  244.     }
  245.     return(0L);
  246. }
  247.  
  248. /**********************************************************
  249.                   First  Dialog
  250. ***********************************************************/
  251. BOOL FAR PASCAL FirstDlg(hDlg, message, wParam, lParam)
  252. HWND       hDlg;
  253. unsigned   message;
  254. WORD       wParam;
  255. LONG       lParam;
  256. {
  257.     switch (message){
  258.     case WM_INITDIALOG:
  259.         return TRUE;
  260.  
  261.     case WM_COMMAND:
  262.         switch (wParam)
  263.         {
  264.         case IDDINSERT:
  265. #ifdef MODAL
  266.              DialogBox(hInst, MAKEINTRESOURCE(SECONDDIALOG),
  267.                hDlg, lpprocSecondDlg);
  268.              /* please note that the Dialog in the RC file does 
  269.                 NOT have the WS_VISIBLE attribute set which will
  270.                 allow for keyboard processing BEFORE the dialog 
  271.                 is displayed.                                   */
  272. #else
  273.          hDlgWnd2 = CreateDialog(hInst, MAKEINTRESOURCE(SECONDDIALOG),
  274.                      hDlg, lpprocSecondDlg);
  275.              /* ShowWindow is needed here because the dialog 
  276.                 style doesn't have WM_VISIBLE bit set.  */
  277.              ShowWindow(hDlgWnd2,SHOW_OPENWINDOW);
  278. #endif
  279.             break;
  280.         case IDDCANCEL:
  281. #ifdef MODAL
  282.         EndDialog(hDlg, TRUE);
  283. #else
  284.         DestroyWindow(hDlg);
  285.         hDlgWnd1 = NULL; /* clear because this is used in the input loop */
  286. #endif
  287.         break;
  288.  
  289.         default:
  290.             return FALSE;
  291.         }
  292.         break;
  293.  
  294.     default:
  295.         return FALSE;
  296.     }
  297.     return TRUE;
  298. }
  299.  
  300.  
  301. /**********************************************************
  302.                   Second Dialog
  303. ***********************************************************/
  304. BOOL FAR PASCAL SecondDlg(hDlg, message, wParam, lParam)
  305. HWND       hDlg;
  306. unsigned   message;
  307. WORD       wParam;
  308. LONG       lParam;
  309. {
  310.  
  311.   switch (message){
  312.      case WM_INITDIALOG:
  313.       /* Modify the text strings. */
  314.      SetDlgItemText( hDlg, IDDTXT1,
  315.              (LPSTR)"Use the 'TAB' key to move around."); 
  316.      SetDlgItemText( hDlg, IDDTXT2,
  317.              (LPSTR)"Select the button desired."); 
  318.  
  319.       /* Modify the button text. */
  320.      SetDlgItemText( hDlg, IDDABORT, (LPSTR)"ONE");
  321.      SetDlgItemText( hDlg, IDDRETRY, (LPSTR)"TWO");
  322.      SetDlgItemText( hDlg, IDDIGNORE,(LPSTR)"THREE");
  323.      SetDlgItemText( hDlg, IDDOK,     (LPSTR)"FOUR");
  324.  
  325.       /* Disable the 2nd button */
  326.      EnableWindow( GetDlgItem(hDlg, IDDRETRY), FALSE );
  327.  
  328.          break;
  329.  
  330.      case WM_COMMAND:
  331.          switch (wParam)
  332.          {
  333.            case IDDABORT:
  334.          MessageBox( hDlg,(LPSTR)"One",(LPSTR)"Button Selected",MB_OK);
  335.              break;
  336.            case IDDRETRY:
  337.          MessageBox( hDlg,(LPSTR)"Two",(LPSTR)"Button Selected",MB_OK);
  338.              break;
  339.            case IDDIGNORE:
  340.          MessageBox( hDlg,(LPSTR)"Three",(LPSTR)"Button Selected",MB_OK);
  341.              break;
  342.            case IDDOK:
  343.          MessageBox( hDlg,(LPSTR)"Four",(LPSTR)"Button Selected",MB_OK);
  344.              break;
  345.        default: ;  /* nothing */
  346.         break;
  347.      }  /* end switch */
  348.  
  349.     case WM_CLOSE:
  350.  
  351. #ifdef MODAL
  352.      EndDialog(hDlg, TRUE);
  353. #else
  354.      DestroyWindow(hDlg);
  355.      hDlgWnd2 = NULL; /* clear because this is used in the input loop */
  356. #endif
  357.  
  358.     break;
  359.  
  360.      default:
  361.          return FALSE;
  362.    }
  363.    return TRUE;
  364. }
  365.