home *** CD-ROM | disk | FTP | other *** search
/ Microsoft Programmer's Library 1.3 / Microsoft-Programers-Library-v1.3.iso / sampcode / win_lrn / dialog / diaboxin.c < prev    next >
C/C++ Source or Header  |  1988-08-10  |  8KB  |  315 lines

  1. /*
  2.  *
  3.  *  DialogBoxIndirect
  4.  *
  5.  *  This program demonstrates the use of the function DialogBoxIndirect.
  6.  *  It allows the user to create a modal dialogbox on the fly. Memory is
  7.  *  dynamically allocated so that the structure will accomadate variable
  8.  *  string sizes.
  9.  */
  10.  
  11.  
  12.  
  13. #include <windows.h>
  14. #include "diaboxin.h"
  15.  
  16. BOOL FAR PASCAL InitDiabox ( HANDLE , HANDLE , int );
  17. long FAR PASCAL DiaboxWindowProc ( HANDLE , unsigned , WORD , LONG );
  18. BOOL FAR PASCAL DialogBoxWindowProc (HANDLE, unsigned, WORD, LONG); /* added */
  19.  
  20. HANDLE hInst;
  21. FARPROC lpDlgTest;
  22. HWND hDlgTest;
  23.  
  24. #define DTHDR        struct dtHdrType
  25.  
  26. struct dtHdrType
  27. {
  28.    LONG  dtStyle;
  29.    BYTE  dtItemCount;
  30.    int   dtX;
  31.    int   dtY;
  32.    int   dtCX;
  33.    int   dtCY;
  34.    char  dtResourceName[7];
  35.    char  dtClassName[1];
  36.    char  dtCaptionText[1];
  37. };
  38.  
  39. #define DTITM        struct dtItmType
  40.  
  41. struct dtItmType
  42. {
  43.    int   dtilX;
  44.    int   dtilY;
  45.    int   dtilCX;
  46.    int   dtilCY;
  47.    int   dtilID;
  48.    LONG  dtilWindowStyle;
  49.    BYTE  dtilControlClass;
  50.    char  dtilText[1];
  51. };
  52.  
  53.  
  54. /**************************************************************************/
  55.  
  56. int PASCAL WinMain  (hInstance , hPrevInstance , lpszCmdLine , cmdShow )
  57. HANDLE hInstance , hPrevInstance;
  58. LPSTR  lpszCmdLine;
  59. int cmdShow;
  60.   {
  61.   MSG  msg;
  62.  
  63.   InitDiabox (hInstance, hPrevInstance, cmdShow );
  64.   while ( GetMessage((LPMSG)&msg, NULL, 0 , 0 ))
  65.     {
  66.         TranslateMessage((LPMSG)&msg);
  67.         DispatchMessage((LPMSG)&msg);
  68.     }
  69.   exit(msg.wParam);
  70.   }
  71.  
  72. /*******************************   initialization   ***********************/
  73.  
  74. BOOL FAR PASCAL InitDiabox (hInstance , hPrevInstance , cmdShow)
  75. HANDLE hInstance;
  76. HANDLE hPrevInstance;
  77. int cmdShow;
  78.   {
  79.   WNDCLASS  wcDiaboxClass;
  80.   HWND  hWnd;
  81.  
  82.   wcDiaboxClass.lpszClassName = (LPSTR) "Diabox";
  83.   wcDiaboxClass.hInstance     = hInstance;
  84.   wcDiaboxClass.lpfnWndProc   = DiaboxWindowProc;
  85.   wcDiaboxClass.hCursor       = LoadCursor ( NULL , IDC_ARROW );
  86.   wcDiaboxClass.hIcon         = NULL;
  87.   wcDiaboxClass.lpszMenuName  = (LPSTR) "diabox";             /* menu added  */
  88.   wcDiaboxClass.hbrBackground = GetStockObject (WHITE_BRUSH);
  89.   wcDiaboxClass.style         = CS_HREDRAW | CS_VREDRAW;
  90.   wcDiaboxClass.cbClsExtra    = 0;
  91.   wcDiaboxClass.cbWndExtra    = 0;
  92.  
  93.   RegisterClass ((LPWNDCLASS) &wcDiaboxClass);
  94.   hWnd = CreateWindow((LPSTR) "Diabox",
  95.                       (LPSTR) "DialogBoxIndirect",
  96.                       WS_OVERLAPPEDWINDOW,
  97.                       CW_USEDEFAULT,
  98.                       CW_USEDEFAULT,
  99.                       CW_USEDEFAULT,
  100.                       CW_USEDEFAULT,
  101.                       (HWND)NULL,
  102.                       (HMENU)NULL,
  103.                       (HANDLE)hInstance,
  104.                       (LPSTR)NULL
  105.                      );
  106.  
  107.   hInst = hInstance;                    /*  instance saved for dialog box  */
  108.  
  109.   ShowWindow (hWnd , cmdShow);
  110.   UpdateWindow (hWnd);
  111.  
  112.   return TRUE;
  113.   }
  114.  
  115. /*********************   window procedure - process messages   *************/
  116.  
  117. long FAR PASCAL DiaboxWindowProc (hWnd , message , wParam , lParam)
  118. HWND        hWnd;
  119. unsigned    message;
  120. WORD        wParam;
  121. LONG        lParam;
  122.   {
  123.     PAINTSTRUCT ps;
  124.  
  125.     switch (message)
  126.     {
  127.  
  128.     case WM_COMMAND:
  129.         switch (wParam)
  130.         {
  131.         case IDDBOX:
  132.             DisplayDialogBox(hWnd);
  133.             break;
  134.         default:
  135.             return DefWindowProc(hWnd, message, wParam, lParam);
  136.             break;
  137.         }
  138.  
  139.     case WM_PAINT:
  140.         BeginPaint (hWnd, (LPPAINTSTRUCT)&ps);
  141.         EndPaint(hWnd, (LPPAINTSTRUCT)&ps);
  142.         break;
  143.  
  144.     case WM_DESTROY:
  145.         PostQuitMessage(0);
  146.         break;
  147.  
  148.     default:
  149.         return( DefWindowProc( hWnd , message , wParam , lParam ) );
  150.         break;
  151.     }
  152.   return( 0L );
  153.   }
  154.  
  155. /***************************************************************************/
  156.  
  157. DisplayDialogBox(hWnd)
  158. HWND   hWnd;
  159. {
  160.  
  161.    DTHDR    dtHdr;
  162.    DTITM    dtItm;
  163.    HANDLE   hDTemplate;
  164.    LPSTR    lpDTemplate;
  165.    WORD     wByteCount;
  166.    BYTE     work[256];
  167.    static   char     name[7] = "diabox";
  168.  
  169.    if(hDlgTest != NULL)
  170.       return(FALSE);
  171.  
  172.    if(!(hDTemplate = GlobalAlloc(GMEM_MOVEABLE, (DWORD) sizeof(DTHDR))))
  173.       return(FALSE);
  174.    wByteCount = 0;
  175.  
  176.    dtHdr.dtStyle     = WS_POPUP | WS_VISIBLE | WS_BORDER | WS_CAPTION |
  177.                        WS_SIZEBOX | WS_MINIMIZEBOX | WS_MAXIMIZEBOX;
  178.    dtHdr.dtItemCount = 2;
  179.    dtHdr.dtX         = 10;
  180.    dtHdr.dtY         = 10;
  181.    dtHdr.dtCX        = 200;
  182.    dtHdr.dtCY        = 100;
  183.    strcpy(dtHdr.dtResourceName, name);
  184.    dtHdr.dtClassName[0]    = 0;
  185.    if(!writeGMem(hDTemplate, wByteCount, (BYTE *) &dtHdr, sizeof(DTHDR)-1))
  186.       return(FALSE);
  187.    wByteCount += sizeof(DTHDR)-1;
  188.  
  189.    strcpy(work, "Howdy !!!");
  190.    if(!writeGMem(hDTemplate, wByteCount, work, strlen(work)+1))
  191.       return(FALSE);
  192.    wByteCount += strlen(work)+1;
  193.  
  194. /* add BUTTON item */
  195.  
  196.    dtItm.dtilX     = 30;
  197.    dtItm.dtilY     = 50;
  198.    dtItm.dtilCX    = 32;
  199.    dtItm.dtilCY    = 12;
  200.    dtItm.dtilID    = 0x0200;
  201.    dtItm.dtilWindowStyle = BS_DEFPUSHBUTTON | WS_TABSTOP | WS_CHILD | WS_VISIBLE;
  202.    dtItm.dtilControlClass = 0x80;
  203.    if(!writeGMem(hDTemplate, wByteCount, (BYTE *) &dtItm, sizeof(DTITM)-1))
  204.       return(FALSE);
  205.    wByteCount += sizeof(DTITM)-1;
  206.  
  207.    strcpy(work, "OK");
  208.    if(!writeGMem(hDTemplate, wByteCount, work, strlen(work)+1))
  209.       return(FALSE);
  210.    wByteCount += strlen(work)+1;
  211.  
  212.    work[0] = 0;
  213.    if(!writeGMem(hDTemplate, wByteCount, work, 1))
  214.       return(FALSE);
  215.    wByteCount += 1;
  216.  
  217. /* add MESSAGE item */
  218.  
  219.    dtItm.dtilX     = 30;
  220.    dtItm.dtilY     = 20;
  221.    dtItm.dtilCX    = 100;
  222.    dtItm.dtilCY    = 8;
  223.    dtItm.dtilID    = 0x0100;
  224.    dtItm.dtilWindowStyle = SS_LEFT | WS_CHILD | WS_VISIBLE;
  225.    dtItm.dtilControlClass = 0x82;
  226.    if(!writeGMem(hDTemplate, wByteCount, (BYTE *) &dtItm, sizeof(DTITM)-1))
  227.       return(FALSE);
  228.    wByteCount += sizeof(DTITM)-1;
  229.  
  230.    strcpy(work, "Modal DialogBox");
  231.    if(!writeGMem(hDTemplate, wByteCount, work, strlen(work)+1))
  232.       return(FALSE);
  233.    wByteCount += strlen(work)+1;
  234.  
  235.    work[0] = 0;
  236.    if(!writeGMem(hDTemplate, wByteCount, work, 1))
  237.       return(FALSE);
  238.  
  239.    lpDlgTest = MakeProcInstance((FARPROC) DialogBoxWindowProc, hInst);
  240.  
  241.    hDlgTest = DialogBoxIndirect (hInst, hDTemplate, hWnd, lpDlgTest);
  242.                                              /*  function demonstrated  */
  243.    if (hDlgTest == -1)
  244.      MessageBox (NULL,(LPSTR)"DialogBoxIndirect failed",
  245.                 (LPSTR) "error",MB_ICONHAND);
  246.    FreeProcInstance ((FARPROC) lpDlgTest);
  247.    hDlgTest = NULL;
  248.   return(TRUE);
  249.  
  250. }
  251. /**************************************************************************/
  252.  
  253. BOOL FAR PASCAL DialogBoxWindowProc (hDlg, message, wParam, lParam)
  254. HWND      hDlg;
  255. unsigned  message;
  256. WORD      wParam;
  257. LONG      lParam;
  258. {
  259.   switch(message)
  260.   {
  261.    case WM_COMMAND:
  262.       switch(wParam)
  263.       {
  264.       case 0x0100:
  265.       case 0x0200:
  266.          break;
  267.       default:
  268.          return(TRUE);
  269.       }
  270.       break;
  271.    default:
  272.       return(FALSE);
  273.    }
  274.  
  275.    EndDialog (hDlg, TRUE);
  276.    return(TRUE);
  277. }
  278.  
  279.  
  280. /****************************************************************************/
  281.  
  282. BOOL NEAR writeGMem(hData, offset, data, length)
  283. HANDLE  hData;
  284. WORD    offset;
  285. BYTE    *data;
  286. WORD    length;
  287. {
  288.    HANDLE  hNewData;
  289.    LPSTR   lpDstData;
  290.    int     n;
  291.  
  292.    if(offset+length > GlobalSize(hData))
  293.    {
  294.       if(!(hNewData = GlobalReAlloc(hData, (DWORD) offset+length, GMEM_MOVEABLE)))
  295.          GlobalFree(hData);
  296.  
  297.       hData = hNewData;
  298.    }
  299.  
  300.    if(lpDstData = GlobalLock(hData))
  301.    {
  302.       lpDstData = lpDstData + offset;
  303.       for (n = 0 ; n < length ; n++)
  304.          *lpDstData++ = *data++;
  305.       GlobalUnlock(hData);
  306.       return(TRUE);
  307.    }
  308.  
  309.    return(FALSE);
  310. }
  311.  
  312.  
  313.  
  314.  
  315.