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

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