home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / tolkit45.zip / os2tk45 / samples / pm / controls / sty_dlg.c next >
C/C++ Source or Header  |  1999-05-11  |  63KB  |  1,907 lines

  1. /*************************************************************************
  2. *
  3. *  File Name   : STY_DLG.C
  4. *
  5. *  Description : This module contains the Dialog Procedures for the user
  6. *                defined dialogs as well as any support code they need.
  7. *
  8. *  Concepts    : Dialog procedures for user defined dialogs,
  9. *                initialization of controls in the dialog boxs,
  10. *                use of presentation parameters.
  11. *
  12. *  API's       :  DosAllocMem             WinQueryFocus
  13. *                 DosFreeMem              WinQueryPointerPos
  14. *                 GpiQueryFonts           WinQueryPresParams
  15. *                 WinCreateWindow         WinQueryWindowText
  16. *                 WinDefDlgProc           WinQueryWindowUShort
  17. *                 WinDismissDlg           WinReleasePS
  18. *                 WinGetPS                WinRemovePresParams
  19. *                 WinLoadMenu             WinSendDlgItemMsg
  20. *                 WinLoadPointer          WinSendMsg
  21. *                 WinLoadString           WinSetDlgItemText
  22. *                 WinMapWindowPoints      WinSetPresParams
  23. *                 WinPopupMenu            WinWindowFromID
  24. *
  25. *  Copyright (C) 1992 IBM Corporation
  26. *
  27. *      DISCLAIMER OF WARRANTIES.  The following [enclosed] code is
  28. *      sample code created by IBM Corporation. This sample code is not
  29. *      part of any standard or IBM product and is provided to you solely
  30. *      for  the purpose of assisting you in the development of your
  31. *      applications.  The code is provided "AS IS", without
  32. *      warranty of any kind.  IBM shall not be liable for any damages
  33. *      arising out of your use of the sample code, even if they have been
  34. *      advised of the possibility of such damages.                                                    *
  35. ************************************************************************/
  36.  
  37. /*  Include files, macros, defined constants, and externs              */
  38.  
  39. #define INCL_WINWINDOWMGR
  40. #define INCL_WINFRAMEMGR
  41. #define INCL_WINPOINTERS
  42. #define INCL_WININPUT
  43. #define INCL_WINLISTBOXES
  44. #define INCL_WINENTRYFIELDS
  45. #define INCL_WINSTDSPIN
  46. #define INCL_WINSTDBOOK
  47. #define INCL_WINMLE
  48. #define INCL_WINMENUS
  49. #define INCL_WINSTATICS
  50. #define INCL_WINSTDCNR
  51. #define INCL_WINSTDSLIDER
  52. #define INCL_WINSTDVALSET
  53. #define INCL_WINDIALOGS
  54. #define INCL_WINSYS
  55. #define INCL_GPILCIDS
  56. #define INCL_GPIBITMAPS
  57. #define INCL_DOSMEMMGR
  58.  
  59. #include <os2.h>
  60. #include <string.h>
  61. #include <stdlib.h>
  62. #include "sty_main.h"
  63. #include "sty_dlg.h"
  64. #include "sty_xtrn.h"
  65. #include "sty_help.h"
  66.  
  67. typedef struct _USERRECORD
  68. {
  69.   RECORDCORE  recordCore;
  70.   CDATE       date;
  71.   CTIME       time;
  72.   PSZ         recordData;
  73. } USERRECORD, *PUSERRECORD;
  74.  
  75. #define COLORNAMELEN    20
  76. #define NUMCOLORS       15  /* number of colors used in PP Demo */
  77. #define NUMSPINCOLORS   16  /* number of colors used in SPIN Demo */
  78. #define NUMFONTS         4  /* number of fonts used in PP Demo */
  79. #define FONTPOINTSIZE   80  /* point size to use in PP Demo */
  80. #define PPFONTPOINTSIZE  2              /* length of font point prefix */
  81.  
  82. /*  Global variables                                                   */
  83.                                         /* array of clr names          */
  84. static CHAR apszPresParamColor[NUMCOLORS][COLORNAMELEN];
  85. static PSZ *apszPresParamFont = NULL;
  86. static LONG lNumFonts;
  87. static CNRINFO cnrinfo;
  88. static ULONG ulCnrAttributes;
  89. static RECORDINSERT recordInsert;
  90. static PUSERRECORD pUserRecord;
  91. static PFIELDINFO pFieldInfo, firstFieldInfo;
  92. static FIELDINFOINSERT fieldInfoInsert;
  93. static PFIELDINFOINSERT pFieldInfoInsert;
  94. static CHAR pszViewText[] = "Text for Text View.";
  95. static CHAR pszViewIcon[] = "Text for Icon View.";
  96. static CHAR pszViewName[] = "Text for Name View.";
  97. static CHAR pszColumnText1[]= "Data";
  98. static CHAR pszColumnText2[]= "Date";
  99. static CHAR pszColumnText3[]= "Time";
  100. static CHAR pszSampleData[] = "Sample Data";
  101. static CHAR pszCnrTitle[] = "Sample Container";
  102.  
  103. /*
  104.  * Set up an array of colors in the same order as the stringtable
  105.  * constants
  106.  */
  107. static ULONG aulColor[NUMCOLORS-1] =
  108.               { CLR_BLUE, CLR_RED, CLR_PINK, CLR_GREEN, CLR_CYAN,
  109.                 CLR_YELLOW, CLR_DARKGRAY, CLR_DARKBLUE, CLR_DARKRED,
  110.                 CLR_DARKPINK, CLR_DARKGREEN, CLR_DARKCYAN, CLR_BROWN,
  111.                 CLR_PALEGRAY };
  112.  
  113. /*  Entry point declarations                                           */
  114.  
  115. MRESULT EXPENTRY ProdInfoDlgProc(HWND hwnd, USHORT msg, MPARAM mp1, MPARAM mp2);
  116. MRESULT EXPENTRY DemoDlgProc(HWND hwnd, USHORT msg, MPARAM mp1, MPARAM mp2);
  117. MRESULT EXPENTRY PresParamDemoDlgProc(HWND hwnd, USHORT msg, MPARAM mp1,
  118.                                       MPARAM mp2);
  119. BOOL InitializeValueSet(HWND hwnd);
  120. BOOL InitializeSpinButton(HWND hwnd);
  121. BOOL InitializeSlider(HWND hwnd);
  122. BOOL InitializeNoteBook(HWND hwnd);
  123. BOOL InitializeContainer(HWND hwnd);
  124. BOOL LoadListBox(HWND hwnd);
  125. BOOL InitPresParamDemoDlg(HWND hwnd);
  126. BOOL UpdatePresParamDemoDlg(HWND hwnd);
  127. VOID ShowDlgHelp(HWND hwnd);
  128. VOID SetSysMenu(HWND hwnd);
  129.  
  130.  
  131. /*********************************************************************
  132.  *  Name : ProdInfoDlgProc
  133.  *
  134.  *  Description : Processes all messages sent to the Product
  135.  *                Information dialog box.
  136.  *
  137.  *  Concepts : Called for each message sent to the Product
  138.  *             Information dialog box.  The Product
  139.  *             Information box only has a button control so
  140.  *             this routine only processes WM_COMMAND
  141.  *             messages.  Any WM_COMMAND posted must have come
  142.  *             from the Ok button so we dismiss the dialog
  143.  *             upon receiving it.
  144.  *
  145.  *  API's : WinDismissDlg
  146.  *          WinDefDlgProc
  147.  *
  148.  * Parameters   : hwnd - Window handle to which message is addressed
  149.  *                msg - Message type
  150.  *                mp1 - First message parameter
  151.  *                mp2 - Second message parameter
  152.  *
  153.  *  Returns : Dependent upon message sent
  154.  *
  155.  ****************************************************************/
  156. MRESULT EXPENTRY ProdInfoDlgProc( HWND hwnd, USHORT msg, MPARAM mp1,
  157.                                   MPARAM mp2)
  158. {
  159.    switch(msg)
  160.    {
  161.       case WM_COMMAND:
  162.          /*
  163.           * No matter what the command, close the dialog
  164.           */
  165.          WinDismissDlg(hwnd, TRUE);
  166.          break;
  167.  
  168.       case WM_HELP:
  169.          ShowDlgHelp(hwnd);
  170.          break;
  171.  
  172.       default:
  173.          return(WinDefDlgProc(hwnd, msg, mp1, mp2));
  174.          break;
  175.    }
  176.    return (MRESULT)0;
  177. }           /* End of ProdInfolDlgProc()                               */
  178.  
  179.  
  180. /*********************************************************************
  181.  *  Name : DemoDlgProc
  182.  *
  183.  *  Description : Processes all messages sent to all Demo dialogs.
  184.  *
  185.  *  Concepts : Called for each message sent to a demo dialog box.
  186.  *             A switch statement branches to the routines to be
  187.  *             performed for each message processed.  Any messages
  188.  *             not specifically process are passed to the default
  189.  *             window procedure WinDefDlgProc().
  190.  *
  191.  *  API's : WinDismissDlg
  192.  *          WinLoadMenu
  193.  *          WinQueryPointerPos
  194.  *          WinMapWindowPoints
  195.  *          WinPopupMenu
  196.  *          WinSendDlgItemMsg
  197.  *          WinSetDlgItemText
  198.  *          WinDefDlgProc
  199.  *
  200.  * Parameters   : hwnd - Window handle to which message is addressed
  201.  *                msg - Message type
  202.  *                mp1 - First message parameter
  203.  *                mp2 - Second message parameter
  204.  *
  205.  *  Returns : Dependent upon message sent
  206.  *
  207.  ****************************************************************/
  208. MRESULT EXPENTRY DemoDlgProc( HWND hwnd, USHORT msg, MPARAM mp1,
  209.                               MPARAM mp2)
  210. {
  211.    CHAR      acBuffer[4];
  212.    CHAR      *cData;
  213.    PSHORT    psIdDlg;
  214.  
  215.    cnrinfo.pszCnrTitle = pszCnrTitle;
  216.    ulCnrAttributes = CA_CONTAINERTITLE | CA_TITLESEPARATOR;
  217.  
  218.    switch(msg)
  219.    {
  220.       case WM_INITDLG:
  221.  
  222.          SetSysMenu(hwnd);
  223.          psIdDlg = (PSHORT) mp2;
  224.  
  225.          switch(*psIdDlg)
  226.          {
  227.         /*
  228.          * The ShowDemoDlg() filled mp2 with a pointer to the id of
  229.          * the dialog template used to create the dialog box.
  230.          */
  231.             case IDD_LISTBOXDLG:
  232.             /*
  233.              * Load some text into the list boxes.  If any of the
  234.              * LoadListBox() routines fail, abort the dialog
  235.              */
  236.                if (!LoadListBox(WinWindowFromID(hwnd, IDC_LISTBOX)) ||
  237.                    !LoadListBox(WinWindowFromID(hwnd, IDC_MULTISELLISTBOX)))
  238.                {
  239.                   WinDismissDlg(hwnd, FALSE);
  240.                }
  241.                break;
  242.  
  243.             case IDD_COMBOBOXDLG:
  244.             /*
  245.              * Load some text into the combo boxes.  If any of the
  246.              * LoadListBox() routines fail, abort the dialog
  247.              */
  248.                if (!LoadListBox(WinWindowFromID(hwnd, IDC_SIMPLE)) ||
  249.                    !LoadListBox(WinWindowFromID(hwnd, IDC_DROPDOWN)) ||
  250.                    !LoadListBox(WinWindowFromID(hwnd, IDC_DROPDOWNLIST)))
  251.                {
  252.                   WinDismissDlg(hwnd, FALSE);
  253.                }
  254.                break;
  255.  
  256.             case IDD_SPINBUTTONDLG:
  257.             /*
  258.              * Initialize the master and servant Spinbuttons.
  259.              * If the initialization routine fails, abort
  260.              * the dialog
  261.              */
  262.                if (!InitializeSpinButton(hwnd))
  263.                {
  264.                   WinDismissDlg(hwnd, FALSE);
  265.                }
  266.                break;
  267.  
  268.             case IDD_VALUESETDLG:
  269.             /*
  270.              * Initialize the Valueset control.
  271.              * If the initialization routine fails, abort
  272.              * the dialog
  273.              */
  274.                if (!InitializeValueSet(hwnd))
  275.                {
  276.                   WinDismissDlg(hwnd, FALSE);
  277.                }
  278.                break;
  279.  
  280.             case IDD_CONTAINERDLG:
  281.             /*
  282.              * Initialize the Container control.
  283.              * If the initialization routine fails, abort
  284.              * the dialog
  285.              */
  286.                cnrinfo.flWindowAttr = CV_ICON | ulCnrAttributes;
  287.                if (!InitializeContainer(hwnd))
  288.                {
  289.                   WinDismissDlg(hwnd, FALSE);
  290.                }
  291.                break;
  292.  
  293.             case IDD_NOTEBOOKDLG:
  294.             /*
  295.              * Initialize the Notebook control.
  296.              * If the initialization routine fails, abort
  297.              * the dialog
  298.              */
  299.                if (!InitializeNoteBook(hwnd))
  300.                {
  301.                   WinDismissDlg(hwnd, FALSE);
  302.                }
  303.                break;
  304.  
  305.             case IDD_SLIDERDLG:
  306.             /*
  307.              * Initialize the Slider control.
  308.              * If the initialization routine fails, abort
  309.              * the dialog
  310.              */
  311.                if (!InitializeSlider(hwnd))
  312.                {
  313.                   WinDismissDlg(hwnd, FALSE);
  314.                }
  315.                break;
  316.  
  317.             default:
  318.                break;
  319.          }
  320.          break;
  321.  
  322.       case WM_CONTROL:
  323.          /*
  324.           * Process the WM_CONTROL messages for the slider and valueset
  325.           * set controls.
  326.           */
  327.          switch(SHORT2FROMMP(mp1))
  328.          {
  329.             case CN_CONTEXTMENU:
  330.             {
  331.                POINTL point;
  332.                HWND hwndMenu;
  333.                HWND hwndContainer;
  334.                /*
  335.                 * If we receive a EN_CONTEXTMENU MESSAGE and if the
  336.                 * current dialog if the container dialog, display a
  337.                 * popup menu that allows the user to change the
  338.                 * container view.
  339.                 */
  340.                 hwndContainer = WinWindowFromID(hwnd,IDC_CONTAINER);
  341.  
  342.                 hwndMenu = WinLoadMenu(hwnd, 0, IDD_CONTAINERMENU);
  343.                 WinQueryPointerPos(HWND_DESKTOP, &point);
  344.                 WinMapWindowPoints(HWND_DESKTOP,hwndContainer,&point,1);
  345.  
  346.                 WinPopupMenu(hwndContainer, hwnd, hwndMenu,
  347.                              point.x, point.y,
  348.                              IDM_ICON, PU_NONE | PU_SELECTITEM |
  349.                              PU_MOUSEBUTTON1 | PU_MOUSEBUTTON2 | PU_KEYBOARD);
  350.                break;
  351.             }
  352.             case SLN_CHANGE:
  353.             {
  354.                LONG ulValue;
  355.  
  356.                if (SHORT1FROMMP(mp1) == IDC_HSLIDER)
  357.                {
  358.                   ulValue = (ULONG) WinSendDlgItemMsg(hwnd, IDC_HSLIDER,
  359.                      SLM_QUERYSLIDERINFO,
  360.                      MPFROM2SHORT(SMA_SLIDERARMPOSITION,SMA_INCREMENTVALUE),
  361.                      NULL);
  362.                   cData = _ltoa(ulValue,acBuffer,10);
  363.                   WinSetDlgItemText(hwnd,IDC_HSLIDERDATA, cData);
  364.                }
  365.                else
  366.                {
  367.                   ulValue = (ULONG) WinSendDlgItemMsg(hwnd, IDC_VSLIDER,
  368.                      SLM_QUERYSLIDERINFO,
  369.                      MPFROM2SHORT(SMA_SLIDERARMPOSITION,SMA_INCREMENTVALUE),
  370.                      NULL);
  371.                   cData = _ltoa(ulValue,acBuffer,10);
  372.                   WinSetDlgItemText(hwnd,IDC_VSLIDERDATA, cData);
  373.                }
  374.                break;
  375.             }
  376.             case VN_SELECT:
  377.             case VN_ENTER:
  378.             {
  379.                CHAR  pszNotificationTxt[256];
  380.                CHAR  pszTmp[5];
  381.                ULONG ulRowCol;
  382.  
  383.                ulRowCol = (ULONG)WinSendDlgItemMsg(hwnd, IDC_VALUESET,
  384.                   VM_QUERYSELECTEDITEM, NULL, NULL);
  385.  
  386.                if ((SHORT2FROMMP(mp1)) == VN_SELECT)
  387.                   strcpy (pszNotificationTxt, "VN_SELECT for item at row ");
  388.                else
  389.                   strcpy (pszNotificationTxt, "VN_ENTER for item at row ");
  390.  
  391.                _itoa(SHORT1FROMMP(ulRowCol), pszTmp, 10);
  392.                strcat (pszNotificationTxt, pszTmp);
  393.                strcat (pszNotificationTxt, ",Column ");
  394.                _itoa(SHORT2FROMMP(ulRowCol), pszTmp, 10);
  395.                strcat (pszNotificationTxt, pszTmp);
  396.                WinSetDlgItemText(hwnd,IDC_VALUESETTEXT, pszNotificationTxt);
  397.                break;
  398.             }
  399.          }
  400.          break;
  401.       case WM_COMMAND:
  402.          switch( SHORT1FROMMP( mp1 ) )     /* Extract the command value    */
  403.          {
  404.             /*
  405.              * Process the command messages from the container popup menu
  406.              */
  407.             case IDM_ICON:
  408.                cnrinfo.flWindowAttr = CV_ICON | ulCnrAttributes;
  409.                WinSendDlgItemMsg(hwnd,IDC_CONTAINER,CM_SETCNRINFO,&cnrinfo,
  410.                               MPFROMLONG(CMA_FLWINDOWATTR));
  411.                break;
  412.  
  413.             case IDM_NAME:
  414.                cnrinfo.flWindowAttr = CV_NAME | ulCnrAttributes;
  415.                WinSendDlgItemMsg(hwnd,IDC_CONTAINER,CM_SETCNRINFO,&cnrinfo,
  416.                              MPFROMLONG(CMA_FLWINDOWATTR));
  417.                break;
  418.  
  419.             case IDM_TEXT:
  420.                cnrinfo.flWindowAttr = CV_TEXT | ulCnrAttributes;
  421.                WinSendDlgItemMsg(hwnd,IDC_CONTAINER,CM_SETCNRINFO,&cnrinfo,
  422.                                 MPFROMLONG(CMA_FLWINDOWATTR));
  423.                break;
  424.  
  425.             case IDM_DETAIL:
  426.                cnrinfo.flWindowAttr = CV_DETAIL | ulCnrAttributes |
  427.                   CA_DETAILSVIEWTITLES;
  428.  
  429.                WinSendDlgItemMsg(hwnd,IDC_CONTAINER,CM_SETCNRINFO,&cnrinfo,
  430.                                 MPFROMLONG(CMA_FLWINDOWATTR));
  431.  
  432.                WinSendDlgItemMsg(hwnd,IDC_CONTAINER,
  433.                                  CM_INVALIDATEDETAILFIELDINFO,      /*@@@RBS*/
  434.                                  NULL, NULL);
  435.  
  436.                break;
  437.  
  438.             case DID_OK:
  439.             case DID_CANCEL:          /* The Cancel pushbutton or Escape key */
  440.                WinDismissDlg( hwnd, TRUE );     /* Removes the dialog box    */
  441.                return (MRESULT)FALSE;
  442.  
  443.             default:
  444.                break;
  445.          }
  446.          break;
  447.  
  448.       case WM_HELP:
  449.          ShowDlgHelp(hwnd);
  450.          break;
  451.  
  452.       default:
  453.          return(WinDefDlgProc(hwnd, msg, mp1, mp2));
  454.          break;
  455.    }
  456.    return (MRESULT)0;
  457. }                                            /* End of DemoDlgProc()        */
  458.  
  459. /*********************************************************************
  460.  *  Name : LoadListBox
  461.  *
  462.  *  Description : Loads the demo list box with 0 through 9
  463.  *
  464.  *
  465.  *  Concepts : Called each time a demo list box is
  466.  *             initialized.  A for 0 to 9 loop is converts
  467.  *             the INT to a string which is added to the
  468.  *             listbox via LM_INSERTITEM
  469.  *
  470.  *  API's : WinLoadString
  471.  *          WinSendMsg
  472.  *
  473.  *  Parameters : hwnd - Window handle of the list box.
  474.  *
  475.  *  Returns: TRUE if list box is loaded successfully, FALSE otherwise
  476.  *
  477.  ****************************************************************/
  478. BOOL LoadListBox(HWND hwnd)
  479. {
  480.    ULONG ulCounter;
  481.    CHAR pszTemp[MESSAGELEN];
  482.    SHORT sResult;
  483.  
  484.    for(ulCounter = 0; ulCounter < 10; ulCounter++)
  485.    {
  486.       if (!WinLoadString(hab, (HMODULE)0, (IDS_LISTBOX1 + ulCounter),
  487.                         MESSAGELEN, (PSZ)pszTemp))
  488.       {
  489.          MessageBox(hwndMain, IDMSG_CANNOTLOADSTRING, MB_OK | MB_ERROR, FALSE);
  490.          return FALSE;
  491.       }
  492.       sResult = (SHORT) WinSendMsg(hwnd, LM_INSERTITEM,
  493.                                MPFROMSHORT(LIT_SORTASCENDING),
  494.                                MPFROMP((PSZ)pszTemp));
  495.  
  496.       if (sResult == LIT_ERROR || sResult == LIT_MEMERROR)
  497.       {
  498.          MessageBox(hwndMain, IDMSG_CANNOTLOADSTRING, MB_OK | MB_ERROR, FALSE);
  499.  
  500.          return FALSE;
  501.       }
  502.     }
  503.     return TRUE;
  504.  
  505. }                                          /*    End of LoadListBox()       */
  506.  
  507.  
  508. /*********************************************************************
  509.  *  Name : PresParamDemoDlgProc
  510.  *
  511.  *  Description : Processes all messages sent to the PresParamDemo
  512.  *                dialog.
  513.  *
  514.  *  Concepts : Called for each message sent to the PresParamDemo
  515.  *             dialog box.  A switch statement branches to the
  516.  *             routines to be performed for each message
  517.  *             processed.  Any messages not specifically process
  518.  *             are passed to the default window procedure
  519.  *             WinDefDlgProc().
  520.  *
  521.  *  API's : WinDismissDlg
  522.  *          WinDefDlgProc
  523.  *
  524.  *  Parameters   : hwnd - Window handle to which message is addressed
  525.  *                 msg - Message type
  526.  *                 mp1 - First message parameter
  527.  *                 mp2 - Second message parameter
  528.  *
  529.  *  Returns: Dependent upon message sent
  530.  *
  531.  ****************************************************************/
  532. MRESULT EXPENTRY PresParamDemoDlgProc( HWND hwnd, USHORT msg,
  533.                                        MPARAM mp1, MPARAM mp2)
  534. {
  535.    switch(msg)
  536.    {
  537.       case WM_INITDLG:
  538.          /*
  539.           * If initialization fails, abort the dialog
  540.           */
  541.          if (!InitPresParamDemoDlg(hwnd))
  542.              WinDismissDlg(hwnd, FALSE);
  543.          return (MRESULT)FALSE;
  544.          break;
  545.  
  546.       case WM_COMMAND:
  547.          switch(SHORT1FROMMP(mp1))
  548.          {
  549.             case IDC_CANCEL:
  550.             /*
  551.              * If done, close the dialog
  552.              */
  553.                WinDismissDlg(hwnd, TRUE);
  554.                break;
  555.  
  556.             case IDC_APPLY:
  557.             /*
  558.              * Update the dialog box
  559.              */
  560.                UpdatePresParamDemoDlg(hwnd);
  561.                break;
  562.  
  563.             default:
  564.                break;
  565.          }
  566.          break;
  567.  
  568.       case WM_HELP:
  569.          ShowDlgHelp(hwnd);
  570.          break;
  571.  
  572.       default:
  573.          return(WinDefDlgProc(hwnd, msg, mp1, mp2));
  574.          break;
  575.    }
  576.    return (MRESULT)0;
  577. }                                      /* End of PresParamDemoDlgProc() */
  578.  
  579. /*********************************************************************
  580.  *  Name : InitPresParamDemoDlg
  581.  *
  582.  *  Description : Places the colors and fonts into the
  583.  *                PresParamDemoDlg's comboboxes.
  584.  *
  585.  *  Concepts : Called when the PP demo dialog is initialized.
  586.  *             LM_INSERTITEM is sent to each combobox for the
  587.  *             color or font string added to the combobox.
  588.  *
  589.  *  API's : WinLoadString
  590.  *          WinWindowFromID
  591.  *          WinSendMsg
  592.  *          GpiQueryFonts
  593.  *          WinGetPS
  594.  *          WinReleasePS
  595.  *          DosAllocMem
  596.  *          DosFreeMem
  597.  *
  598.  *  Parameters : hwnd - Window handle of the dialog
  599.  *
  600.  *  Returns: TRUE if initialization is successfull, FALSE if not
  601.  *
  602.  ****************************************************************/
  603. BOOL InitPresParamDemoDlg(HWND hwnd)
  604. {
  605.    HWND hwndTemp;
  606.    ULONG ulCounter;
  607.    MRESULT mresult;
  608.    PFONTMETRICS pfm, pfmSave;
  609.    LONG lTemp, lFonts;
  610.    HPS hps;
  611.    PSZ *ppszT;
  612.    BOOL bHaveFont;
  613.  
  614.    /*
  615.     * Load the color table
  616.     */
  617.    for (ulCounter = 0; ulCounter < NUMCOLORS; ulCounter++)
  618.    {
  619.       if (!WinLoadString(hab, (HMODULE)0, (ulCounter + IDS_FIRSTCOLOR),
  620.              COLORNAMELEN, (PSZ)apszPresParamColor[ulCounter]))
  621.       {
  622.          MessageBox(hwndMain, IDMSG_CANNOTLOADSTRING, MB_OK | MB_ERROR, FALSE);
  623.          return FALSE;
  624.       }
  625.    }
  626.    /*
  627.     * Load foreground color combo box
  628.     */
  629.    hwndTemp = WinWindowFromID(hwnd, IDC_FORECOLORLIST);
  630.  
  631.    for(ulCounter = 0; ulCounter < NUMCOLORS; ulCounter++)
  632.    {
  633.       mresult = WinSendMsg(hwndTemp, LM_INSERTITEM,
  634.                           MPFROMSHORT(LIT_SORTASCENDING),
  635.                           MPFROMP((PSZ)apszPresParamColor[ulCounter]));
  636.  
  637.       if (((SHORT)mresult) == LIT_ERROR || ((SHORT)mresult) == LIT_MEMERROR)
  638.       {
  639.          MessageBox(hwndMain, IDMSG_CANNOTLOADSTRING, MB_OK | MB_ERROR,
  640.               FALSE);
  641.          return FALSE;
  642.       }
  643.    }
  644.  
  645.    /*
  646.    * Load background color combo box
  647.    */
  648.    hwndTemp = WinWindowFromID(hwnd, IDC_BACKCOLORLIST);
  649.  
  650.    for(ulCounter = 0; ulCounter < NUMCOLORS; ulCounter++)
  651.    {
  652.       mresult = WinSendMsg(hwndTemp, LM_INSERTITEM,
  653.                             MPFROMSHORT(LIT_SORTASCENDING),
  654.                             MPFROMP((PSZ)apszPresParamColor[ulCounter]));
  655.  
  656.        if (((SHORT)mresult) == LIT_ERROR || ((SHORT)mresult) == LIT_MEMERROR)
  657.        {
  658.           MessageBox(hwndMain, IDMSG_CANNOTLOADSTRING, MB_OK | MB_ERROR,
  659.                 FALSE);
  660.           return FALSE;
  661.        }
  662.    }
  663.    /*
  664.     * Fonts.  Find all of the fonts of point size desired and normal
  665.     * weight.  Put the facenames in the combo box
  666.     */
  667.    hwndTemp = WinWindowFromID(hwnd, IDC_FONTLIST);
  668.    hps = WinGetPS(hwndTemp);
  669.  
  670.    /*
  671.     * Determine the number of fonts available
  672.     */
  673.    lFonts = 0;
  674.    lTemp = 0;
  675.    lFonts = GpiQueryFonts(hps, QF_PUBLIC, NULL, &lTemp,
  676.                   (ULONG)sizeof(FONTMETRICS), (PFONTMETRICS)NULL);
  677.  
  678.    if (lFonts == GPI_ALTERROR)
  679.    {
  680.        MessageBox(hwndMain, IDMSG_CANNOTLOADFONTS, MB_OK | MB_ERROR, FALSE);
  681.        WinReleasePS(hps);
  682.        return FALSE;
  683.    }
  684.  
  685.    /*
  686.     * Allocate buffer for fontmetric structures
  687.     */
  688.    if (DosAllocMem((PPVOID)&pfm, lFonts * (ULONG)sizeof(FONTMETRICS),
  689.            fALLOC))
  690.    {
  691.       MessageBox(hwndMain, IDMSG_CANNOTALLOCATEMEMORY, MB_OK | MB_ERROR,
  692.             FALSE);
  693.       WinReleasePS(hps);
  694.       return FALSE;
  695.    }
  696.    pfmSave = pfm;
  697.  
  698.    /*
  699.     * Get all fonts
  700.     */
  701.    lTemp = GpiQueryFonts(hps, QF_PUBLIC, NULL, &lFonts,
  702.                 (ULONG)sizeof(FONTMETRICS), (PFONTMETRICS)pfm);
  703.  
  704.    WinReleasePS(hps);
  705.  
  706.    if (lTemp == GPI_ALTERROR)
  707.    {
  708.       MessageBox(hwndMain, IDMSG_CANNOTLOADFONTS, MB_OK | MB_ERROR, FALSE);
  709.       return FALSE;
  710.    }
  711.  
  712.    /*
  713.     * Allocate buffer for array of string names, freeing the first
  714.     * buffer if necessary
  715.     */
  716.    if ((BOOL)apszPresParamFont)
  717.    {
  718.       ppszT = apszPresParamFont;
  719.       while ((BOOL)*ppszT)
  720.       {
  721.          DosFreeMem(*ppszT++);
  722.       }
  723.  
  724.       DosFreeMem(apszPresParamFont);
  725.    }
  726.  
  727.    if (DosAllocMem((PPVOID)&apszPresParamFont,
  728.           (lFonts + 1) * (ULONG)sizeof(PSZ), fALLOC))
  729.    {
  730.       MessageBox(hwndMain, IDMSG_CANNOTALLOCATEMEMORY, MB_OK | MB_ERROR,
  731.            FALSE);
  732.       DosFreeMem((PVOID)pfmSave);
  733.       apszPresParamFont = NULL;
  734.       return FALSE;
  735.    }
  736.  
  737.    /*
  738.     * Initialize array to NULL
  739.     */
  740.    lTemp = 0;
  741.    ppszT = apszPresParamFont;
  742.    while (lTemp++ < lFonts)
  743.        *ppszT++ = (PSZ)NULL;
  744.    *ppszT = (PSZ)NULL;
  745.  
  746.  
  747.    /*
  748.     * Walk through all fonts.  If the font matches the point size
  749.     * desired and has a weight and width class of normal (5) and
  750.     * no special attributes (e. g. italic, underline, etc.).  If
  751.     * it does, then add its string to the combo box
  752.     */
  753.    lNumFonts = 0;
  754.    ppszT = apszPresParamFont;
  755.  
  756.    while (lFonts--)
  757.    {
  758.       if (pfm->sNominalPointSize == FONTPOINTSIZE &&
  759.              pfm->usWeightClass == 5 && pfm->usWidthClass == 5 &&
  760.              pfm->fsSelection == 0)
  761.       {
  762.       /*
  763.        * Make sure we don't have this font.  If we don't,
  764.        * then add the font to the list
  765.        */
  766.          lTemp = 0;
  767.          bHaveFont = FALSE;
  768.          while (lTemp < lNumFonts)
  769.          {
  770.             if (!strcmp(pfm->szFacename, apszPresParamFont[(INT)lTemp]))
  771.             {
  772.                bHaveFont = TRUE;
  773.                break;
  774.             }
  775.             else
  776.                lTemp++;
  777.          }
  778.  
  779.          if (!bHaveFont)
  780.          {
  781.             if (DosAllocMem((PPVOID)ppszT,
  782.                 (LONG)(FACESIZE * sizeof(CHAR)), fALLOC))
  783.             {
  784.                MessageBox(hwndMain, IDMSG_CANNOTALLOCATEMEMORY,
  785.                   MB_OK | MB_ERROR, FALSE);
  786.                DosFreeMem((PVOID)pfmSave);
  787.                return FALSE;
  788.              }
  789.  
  790.              strcpy(*ppszT++, pfm->szFacename);
  791.              lNumFonts++;
  792.          }
  793.       }
  794.       pfm++;
  795.    }
  796.  
  797.    /*
  798.     * Install the name of each font into the combo box
  799.     */
  800.    ppszT = apszPresParamFont;
  801.    while ((BOOL)*ppszT)
  802.    {
  803.       mresult = WinSendMsg(hwndTemp, LM_INSERTITEM,
  804.                  MPFROMSHORT(LIT_SORTASCENDING), MPFROMP((PSZ)*ppszT++));
  805.  
  806.       if (((SHORT)mresult) == LIT_ERROR || ((SHORT)mresult) == LIT_MEMERROR)
  807.       {
  808.          MessageBox(hwndMain, IDMSG_CANNOTLOADSTRING, MB_OK | MB_ERROR,
  809.               FALSE);
  810.          DosFreeMem((PVOID)pfmSave);
  811.          return FALSE;
  812.       }
  813.    }
  814.  
  815.    /*
  816.     * Add "DefaulTemp" text onto the end
  817.     */
  818.    mresult = WinSendMsg(hwndTemp, LM_INSERTITEM,
  819.              MPFROMSHORT(LIT_SORTASCENDING),
  820.              MPFROMP(apszPresParamColor[IDS_DEFAULT - IDS_FIRSTCOLOR]));
  821.  
  822.    if (((SHORT)mresult) == LIT_ERROR || ((SHORT)mresult) == LIT_MEMERROR)
  823.    {
  824.       MessageBox(hwndMain, IDMSG_CANNOTLOADSTRING, MB_OK | MB_ERROR, FALSE);
  825.       DosFreeMem((PVOID)pfmSave);
  826.       return FALSE;
  827.    }
  828.    DosFreeMem((PVOID)pfmSave);
  829.    return TRUE;
  830. }                                      /* End of InitPresParamDemoDlg()   */
  831.  
  832. /*********************************************************************
  833.  *  Name : UpdatePresParamDemoDlg
  834.  *
  835.  *  Description : Sets/Removes the Presentation Parameter of the sample
  836.  *                text window depending upon the parameters chosen,
  837.  *
  838.  *  Concepts : Called when user wants to update the window.  The string
  839.  *             of each combobox is queried and then the color or font
  840.  *             is set depending upon the string chosen.
  841.  *
  842.  *  API's : WinWindowFromID
  843.  *          WinQueryWindowText
  844.  *          WinSendMsg
  845.  *          WinSetPresParams
  846.  *          WinQueryPresParams
  847.  *          WinRemovePresParams
  848.  *
  849.  *  Parameters : hwnd - Handle of Presentation Params dialog
  850.  *
  851.  *  Returns: TRUE if update is successfull, FALSE if not
  852.  *
  853.  ****************************************************************/
  854. BOOL UpdatePresParamDemoDlg(HWND hwnd)
  855. {
  856.    HWND hwndTemp, hwndSampleText, hwndSampleButton;
  857.    CHAR pszTemp[COLORNAMELEN];
  858.    BYTE abBuf[FACESIZE + PPFONTPOINTSIZE];
  859.    ULONG ulColor, ulPresParams;
  860.    SHORT sCounter;
  861.  
  862.    /*
  863.     * Get window handle of the sample text box
  864.     */
  865.    hwndSampleText = WinWindowFromID(hwnd, IDC_SAMPLETEXT);
  866.    hwndSampleButton = WinWindowFromID(hwnd, IDC_CHECKBOX);
  867.  
  868.    /*
  869.     * Get the text of the foreground color combobox
  870.    */
  871.    hwndTemp = WinWindowFromID(hwnd, IDC_FORECOLORLIST);
  872.  
  873.    if (WinQueryWindowText(hwndTemp, COLORNAMELEN, (PSZ)pszTemp))
  874.    {
  875.    /*
  876.     * Find the text in the list of color names
  877.     */
  878.       sCounter = 0;
  879.       while (sCounter < NUMCOLORS)
  880.       {
  881.          if (!strcmp(pszTemp, apszPresParamColor[sCounter]))
  882.          {
  883.             ulColor = aulColor[sCounter];
  884.             break;
  885.          }
  886.          else
  887.             sCounter++;
  888.       }
  889.  
  890.       /*
  891.        * If color is not default, set the color.  If the default is
  892.        * selected, then remove the color presentation parameter if
  893.        * it exists.  If the value is not a valid color, then don't
  894.        * don't do anything
  895.        */
  896.        if (sCounter < NUMCOLORS)
  897.        {
  898.           sCounter += IDS_FIRSTCOLOR;
  899.           if (sCounter < IDS_DEFAULT)
  900.           {
  901.              if (!WinSetPresParam(hwndSampleText, PP_FOREGROUNDCOLORINDEX,
  902.                    (ULONG)sizeof(LONG), (PVOID)&ulColor) ||
  903.                    !WinSetPresParam(hwndSampleButton,
  904.                    PP_FOREGROUNDCOLORINDEX, (ULONG)sizeof(LONG),
  905.                    (PVOID)&ulColor))
  906.              {
  907.                 MessageBox(hwndMain, IDMSG_CANNOTSETPP, MB_OK | MB_ERROR, FALSE);
  908.              }
  909.           }
  910.           else
  911.           {
  912.           /*
  913.            * If setting presentation parameter to the default, remove
  914.            * the presentation parameter, but only if it has been
  915.            * set
  916.            */
  917.               if (sCounter == IDS_DEFAULT &&
  918.                    WinQueryPresParam(hwndSampleText, PP_FOREGROUNDCOLORINDEX,
  919.                    0, &ulPresParams, (ULONG)sizeof(LONG), (PVOID)&ulColor,
  920.                    QPF_NOINHERIT) != 0)
  921.               {
  922.                  if (!WinRemovePresParam(hwndSampleText,
  923.                      PP_FOREGROUNDCOLORINDEX) ||
  924.                      !WinRemovePresParam(hwndSampleButton,
  925.                      PP_FOREGROUNDCOLORINDEX))
  926.                  {
  927.                     MessageBox(hwndMain, IDMSG_CANNOTSETPP, MB_OK | MB_ERROR,
  928.                          FALSE);
  929.                  }
  930.               }
  931.           }
  932.        }
  933.    }
  934.  
  935.    /*
  936.     * Do the same for the background color combobox
  937.     */
  938.    hwndTemp = WinWindowFromID(hwnd, IDC_BACKCOLORLIST);
  939.    if (WinQueryWindowText(hwndTemp, COLORNAMELEN, (PSZ)pszTemp))
  940.    {
  941.    /*
  942.     * Find the text in the list of color names
  943.    */
  944.       sCounter = 0;
  945.       while (sCounter < NUMCOLORS)
  946.       {
  947.          if (!strcmp(pszTemp, apszPresParamColor[sCounter]))
  948.          {
  949.             ulColor = aulColor[sCounter];
  950.             break;
  951.          }
  952.          else
  953.             sCounter++;
  954.       }
  955.  
  956.       /*
  957.        * If color is not default, set the color.  If the default is
  958.        * selected, then remove the color presentation parameter.  If
  959.        * the value is not a valid color, the don't do anything
  960.        */
  961.        if (sCounter < NUMCOLORS)
  962.        {
  963.           sCounter += IDS_FIRSTCOLOR;
  964.           if (sCounter < IDS_DEFAULT)
  965.           {
  966.              if (!WinSetPresParam(hwndSampleText, PP_BACKGROUNDCOLORINDEX,
  967.                  (ULONG)sizeof(LONG), (PVOID)&ulColor) ||
  968.                  !WinSetPresParam(hwndSampleButton, PP_BACKGROUNDCOLORINDEX,
  969.                  (ULONG)sizeof(LONG), (PVOID)&ulColor))
  970.              {
  971.                 MessageBox(hwndMain, IDMSG_CANNOTSETPP, MB_OK | MB_ERROR,
  972.                       FALSE);
  973.              }
  974.           }
  975.           else
  976.           {
  977.              if (sCounter == IDS_DEFAULT &&
  978.                   WinQueryPresParam(hwndSampleText,
  979.                   PP_BACKGROUNDCOLORINDEX, 0, &ulPresParams, (ULONG)sizeof(LONG),
  980.                   (PVOID)&ulColor, QPF_NOINHERIT) != 0)
  981.              {
  982.                 if (!WinRemovePresParam(hwndSampleText,
  983.                     PP_BACKGROUNDCOLORINDEX) ||
  984.                     !WinRemovePresParam(hwndSampleButton,
  985.                     PP_BACKGROUNDCOLORINDEX))
  986.                 {
  987.                    MessageBox(hwndMain, IDMSG_CANNOTSETPP, MB_OK | MB_ERROR,
  988.                          FALSE);
  989.                 }
  990.              }
  991.           }
  992.        }
  993.    }
  994.  
  995.    /*
  996.     * Get the text of the font combobox
  997.     */
  998.    hwndTemp = WinWindowFromID(hwnd, IDC_FONTLIST);
  999.    if (WinQueryWindowText(hwndTemp, FACESIZE, (PSZ)pszTemp))
  1000.    {
  1001.    /*
  1002.     * If Font selected is "Default", remove font pres. param.
  1003.     */
  1004.       if (!strcmp(pszTemp, apszPresParamColor[IDS_DEFAULT - IDS_FIRSTCOLOR]))
  1005.       {
  1006.          if (WinQueryPresParam(hwndSampleText, PP_FONTNAMESIZE, 0,
  1007.               &ulPresParams, (ULONG)(FACESIZE + PPFONTPOINTSIZE), (PVOID)abBuf,
  1008.               QPF_NOINHERIT) != 0)
  1009.          {
  1010.             if (!WinRemovePresParam(hwndSampleText, PP_FONTNAMESIZE) ||
  1011.                 !WinRemovePresParam(hwndSampleButton, PP_FONTNAMESIZE))
  1012.             {
  1013.                MessageBox(hwndMain, IDMSG_CANNOTSETPP, MB_OK | MB_ERROR,
  1014.                     FALSE);
  1015.             }
  1016.          }
  1017.       }
  1018.       else
  1019.       {
  1020.       /*
  1021.        * Font is not default.
  1022.        * AbBuf will hold the font point size and name in
  1023.        * the form <pt>.<name>.  First we fill abBuf with the
  1024.        * font point prefix and then append the font name
  1025.        * retrieved from the combobox.
  1026.        */
  1027.  
  1028.          if (!WinLoadString(hab, (HMODULE)0, IDS_PPFONTPOINT,
  1029.               COLORNAMELEN, (PSZ)abBuf))
  1030.          {
  1031.             MessageBox(hwndMain, IDMSG_CANNOTLOADSTRING, MB_OK | MB_ERROR,
  1032.                  FALSE);
  1033.             return FALSE;
  1034.          }
  1035.          strcat((PSZ)abBuf, pszTemp);
  1036.  
  1037.          if (!WinSetPresParam(hwndSampleText, PP_FONTNAMESIZE,
  1038.              (ULONG)strlen((PSZ)abBuf) + 1, (PVOID)abBuf) ||
  1039.              !WinSetPresParam(hwndSampleButton, PP_FONTNAMESIZE,
  1040.              (ULONG)strlen((PSZ)abBuf) + 1, (PVOID)abBuf))
  1041.          {
  1042.             MessageBox(hwndMain, IDMSG_CANNOTSETPP, MB_OK | MB_ERROR,
  1043.                  FALSE);
  1044.          }
  1045.       }
  1046.    }
  1047.    return TRUE;
  1048. }                                     /* End of UpdatePresParamDemoDlg() */
  1049.  
  1050. /*********************************************************************
  1051.  *  Name : ShowDlgHelp
  1052.  *
  1053.  *  Description : Displays the help panel for the current selected
  1054.  *                item in the dialog window
  1055.  *
  1056.  *  Concepts : Called each time a WM_HELP message is posted to a
  1057.  *             dialog gets the id value of the window and determine
  1058.  *             which help panel to display.  Then sends a message
  1059.  *             to the help instance to display the panel.  If the
  1060.  *             dialog or item is not included here, then the
  1061.  *             unknown dialog or unknown item panel is displayed.
  1062.  *
  1063.  *  API's : WinQueryFocus
  1064.  *          WinQueryWindowUShort
  1065.  *          WinWindowFromID
  1066.  *
  1067.  *  Parameters : hwnd - Handle of the dialog box
  1068.  *
  1069.  *  Returns: Void
  1070.  *
  1071.  ****************************************************************/
  1072. VOID ShowDlgHelp(HWND hwnd)
  1073. {
  1074.    SHORT idPanel, idDlg, idItem;
  1075.    HWND hwndFocus;
  1076.  
  1077.    /*
  1078.    * Get the id of the dialog box
  1079.    */
  1080.    idDlg = WinQueryWindowUShort(hwnd, QWS_ID);
  1081.  
  1082.    /*
  1083.     * Finds which window has the focus and gets its id
  1084.     */
  1085.    hwndFocus = WinQueryFocus(HWND_DESKTOP);
  1086.    idItem = WinQueryWindowUShort(hwndFocus, QWS_ID);
  1087.  
  1088.    switch(idDlg)
  1089.    {
  1090.       case IDD_BUTTONSDLG:
  1091.          switch(idItem)
  1092.          {
  1093.             case IDC_RADIO1:
  1094.             case IDC_RADIO2:
  1095.             case IDC_RADIO3:
  1096.                idPanel = PANEL_BUTTONSDLG_RADIO;
  1097.                break;
  1098.  
  1099.             case IDC_CHECKBOX:
  1100.                idPanel = PANEL_BUTTONSDLG_CHECKBOX;
  1101.                break;
  1102.  
  1103.             case IDC_3STATE:
  1104.                idPanel = PANEL_BUTTONSDLG_THREESTATE;
  1105.                break;
  1106.  
  1107.             case IDC_PUSHBUTTON:
  1108.                idPanel = PANEL_BUTTONSDLG_PUSHBUTTON;
  1109.                break;
  1110.  
  1111.             case IDC_OK:
  1112.                idPanel = PANEL_BUTTONSDLG_OK;
  1113.                break;
  1114.  
  1115.             case IDC_HELP:
  1116.                idPanel = PANEL_BUTTONSDLG_HELP;
  1117.                break;
  1118.  
  1119.             default:
  1120.                idPanel = PANEL_UNKNOWN;
  1121.                break;
  1122.          }
  1123.          break;
  1124.  
  1125.       case IDD_LISTBOXDLG:
  1126.          switch(idItem)
  1127.          {
  1128.             case IDC_LISTBOX:
  1129.                idPanel = PANEL_LISTBOXDLG_SINGLE;
  1130.                break;
  1131.  
  1132.             case IDC_MULTISELLISTBOX:
  1133.                idPanel = PANEL_LISTBOXDLG_MULTIPLE;
  1134.                break;
  1135.  
  1136.             case IDC_OK:
  1137.                idPanel = PANEL_LISTBOXDLG_OK;
  1138.                break;
  1139.  
  1140.             case IDC_HELP:
  1141.                idPanel = PANEL_LISTBOXDLG_HELP;
  1142.                break;
  1143.  
  1144.             default:
  1145.                idPanel = PANEL_UNKNOWN;
  1146.                break;
  1147.          }
  1148.          break;
  1149.  
  1150.       case IDD_COMBOBOXDLG:
  1151.          switch(idItem)
  1152.          {
  1153.             case IDC_SIMPLE:
  1154.                idPanel = PANEL_COMBOBOXDLG_SIMPLE;
  1155.                break;
  1156.  
  1157.             case IDC_DROPDOWN:
  1158.                idPanel = PANEL_COMBOBOXDLG_DROPDOWN;
  1159.                break;
  1160.  
  1161.             case IDC_DROPDOWNLIST:
  1162.                idPanel = PANEL_COMBOBOXDLG_DROPDOWNLIST;
  1163.                break;
  1164.  
  1165.             case IDC_OK:
  1166.                idPanel = PANEL_COMBOBOXDLG_OK;
  1167.                break;
  1168.  
  1169.             case IDC_HELP:
  1170.                idPanel = PANEL_COMBOBOXDLG_HELP;
  1171.                break;
  1172.  
  1173.             default:
  1174.                /*
  1175.                 * Check to see if window that has the focus is the
  1176.                 * entry field of the combobox.  If it is, then
  1177.                 * call the appropriate combobox help panel.  If
  1178.                 * not, then call the unknown panel
  1179.                 */
  1180.                if (WinWindowFromID(WinWindowFromID(hwnd, IDC_SIMPLE),
  1181.                    CBID_EDIT) == hwndFocus)
  1182.                {
  1183.                   idPanel = PANEL_COMBOBOXDLG_SIMPLE;
  1184.                }
  1185.                else
  1186.                   if (WinWindowFromID(WinWindowFromID(hwnd, IDC_DROPDOWN),
  1187.                      CBID_EDIT) == hwndFocus)
  1188.                   {
  1189.                        idPanel = PANEL_COMBOBOXDLG_DROPDOWN;
  1190.                   }
  1191.                   else
  1192.                        if (WinWindowFromID(
  1193.                            WinWindowFromID(hwnd, IDC_DROPDOWNLIST),
  1194.                            CBID_EDIT) == hwndFocus)
  1195.                        {
  1196.                           idPanel = PANEL_COMBOBOXDLG_DROPDOWNLIST;
  1197.                        }
  1198.                        else
  1199.                           idPanel = PANEL_UNKNOWN;
  1200.               break;
  1201.          }
  1202.          break;
  1203.  
  1204.       case IDD_ENTRYFIELDDLG:
  1205.          switch(idItem)
  1206.          {
  1207.             case IDC_ENTRY:
  1208.                idPanel = PANEL_ENTRYFIELDDLG_ENTRY;
  1209.                break;
  1210.  
  1211.             case IDC_MLE:
  1212.                idPanel = PANEL_ENTRYFIELDDLG_MLE;
  1213.                break;
  1214.  
  1215.             case IDC_OK:
  1216.                idPanel = PANEL_ENTRYFIELDDLG_OK;
  1217.                break;
  1218.  
  1219.             case IDC_HELP:
  1220.                idPanel = PANEL_ENTRYFIELDDLG_HELP;
  1221.                break;
  1222.  
  1223.             default:
  1224.                idPanel = PANEL_UNKNOWN;
  1225.                break;
  1226.          }
  1227.          break;
  1228.  
  1229.       case IDD_STATICDLG:
  1230.          switch(idItem)
  1231.          {
  1232.             case IDC_OK:
  1233.                idPanel = PANEL_STATICDLG_OK;
  1234.                break;
  1235.  
  1236.             case IDC_HELP:
  1237.                idPanel = PANEL_STATICDLG_HELP;
  1238.                break;
  1239.  
  1240.             default:
  1241.                idPanel = PANEL_UNKNOWN;
  1242.                break;
  1243.          }
  1244.          break;
  1245.  
  1246.       case IDD_PPDEMODLG:
  1247.          switch(idItem)
  1248.          {
  1249.             case IDC_FORECOLORLIST:
  1250.                idPanel = PANEL_PPDEMODLG_FORECOLORLIST;
  1251.                break;
  1252.  
  1253.             case IDC_BACKCOLORLIST:
  1254.                idPanel = PANEL_PPDEMODLG_BACKCOLORLIST;
  1255.                break;
  1256.  
  1257.             case IDC_FONTLIST:
  1258.                idPanel = PANEL_PPDEMODLG_FONTLIST;
  1259.                break;
  1260.  
  1261.             case IDC_CHECKBOX:
  1262.                idPanel = PANEL_PPDEMODLG_TESTBUTTON;
  1263.                break;
  1264.  
  1265.             case IDC_CANCEL:
  1266.                idPanel = PANEL_PPDEMODLG_CANCEL;
  1267.                break;
  1268.  
  1269.             case IDC_APPLY:
  1270.                idPanel = PANEL_PPDEMODLG_APPLY;
  1271.                break;
  1272.  
  1273.             case IDC_HELP:
  1274.                idPanel = PANEL_PPDEMODLG_HELP;
  1275.                break;
  1276.  
  1277.             default:
  1278.             /*
  1279.              * Check to see if window that has the focus is the
  1280.              * entry field of the combobox.  If it is, then
  1281.              * call the appropriate combobox help panel.  If
  1282.              * not, then call the unknown panel
  1283.              */
  1284.                if (WinWindowFromID(
  1285.                    WinWindowFromID(hwnd, IDC_FORECOLORLIST),
  1286.                    CBID_EDIT) == hwndFocus)
  1287.                {
  1288.                   idPanel = PANEL_PPDEMODLG_FORECOLORLIST;
  1289.                }
  1290.                else
  1291.                   if (WinWindowFromID(
  1292.                       WinWindowFromID(hwnd, IDC_BACKCOLORLIST),
  1293.                       CBID_EDIT) == hwndFocus)
  1294.                   {
  1295.                      idPanel = PANEL_PPDEMODLG_BACKCOLORLIST;
  1296.                   }
  1297.                   else
  1298.                      if(WinWindowFromID(
  1299.                         WinWindowFromID(hwnd, IDC_FONTLIST),
  1300.                         CBID_EDIT) == hwndFocus)
  1301.                      {
  1302.                         idPanel = PANEL_PPDEMODLG_FONTLIST;
  1303.                      }
  1304.                      else
  1305.                         idPanel = PANEL_UNKNOWN;
  1306.                break;
  1307.          }
  1308.          break;
  1309.  
  1310.       case IDD_CONTAINERDLG:
  1311.          switch(idItem)
  1312.          {
  1313.             case IDC_CONTAINER:
  1314.                idPanel = PANEL_CONTAINERDLG_CONTAINER;
  1315.                break;
  1316.  
  1317.             case IDC_OK:
  1318.                idPanel = PANEL_CONTAINERDLG_OK;
  1319.                break;
  1320.  
  1321.             case IDC_CANCEL:
  1322.                idPanel = PANEL_CONTAINERDLG_CANCEL;
  1323.                break;
  1324.  
  1325.             case IDC_HELP:
  1326.                idPanel = PANEL_CONTAINERDLG_HELP;
  1327.                break;
  1328.  
  1329.             default:
  1330.                idPanel = PANEL_UNKNOWN;
  1331.                break;
  1332.          }
  1333.          break;
  1334.       case IDD_NOTEBOOKDLG:
  1335.          switch(idItem)
  1336.          {
  1337.             case IDC_NOTEBOOK:
  1338.                idPanel = PANEL_NOTEBOOKDLG_NOTEBOOK;
  1339.                break;
  1340.  
  1341.             case IDC_OK:
  1342.                idPanel = PANEL_NOTEBOOKDLG_OK;
  1343.                break;
  1344.  
  1345.             case IDC_CANCEL:
  1346.                idPanel = PANEL_NOTEBOOKDLG_CANCEL;
  1347.                break;
  1348.  
  1349.             case IDC_HELP:
  1350.                idPanel = PANEL_NOTEBOOKDLG_HELP;
  1351.                break;
  1352.  
  1353.             default:
  1354.                idPanel = PANEL_UNKNOWN;
  1355.                break;
  1356.         }
  1357.         break;
  1358.       case IDD_SLIDERDLG:
  1359.          switch(idItem)
  1360.          {
  1361.             case IDC_VSLIDER:
  1362.                idPanel = PANEL_SLIDERDLG_VSLIDER;
  1363.                break;
  1364.  
  1365.             case IDC_HSLIDER:
  1366.                idPanel = PANEL_SLIDERDLG_HSLIDER;
  1367.                break;
  1368.  
  1369.             case IDC_OK:
  1370.                idPanel = PANEL_SLIDERDLG_OK;
  1371.                break;
  1372.  
  1373.             case IDC_CANCEL:
  1374.                idPanel = PANEL_SLIDERDLG_CANCEL;
  1375.                break;
  1376.  
  1377.             case IDC_HELP:
  1378.                idPanel = PANEL_SLIDERDLG_HELP;
  1379.                break;
  1380.  
  1381.             default:
  1382.                idPanel = PANEL_UNKNOWN;
  1383.                break;
  1384.          }
  1385.          break;
  1386.       case IDD_VALUESETDLG:
  1387.          switch(idItem)
  1388.          {
  1389.             case IDC_VALUESET:
  1390.                idPanel = PANEL_VALUESETDLG_VALUESET;
  1391.                break;
  1392.  
  1393.             case IDC_OK:
  1394.                idPanel = PANEL_VALUESETDLG_OK;
  1395.                break;
  1396.  
  1397.             case IDC_CANCEL:
  1398.                idPanel = PANEL_VALUESETDLG_CANCEL;
  1399.                break;
  1400.  
  1401.             case IDC_HELP:
  1402.                idPanel = PANEL_VALUESETDLG_HELP;
  1403.                break;
  1404.  
  1405.             default:
  1406.                idPanel = PANEL_UNKNOWN;
  1407.                break;
  1408.          }
  1409.          break;
  1410.       case IDD_SPINBUTTONDLG:
  1411.          switch(idItem)
  1412.          {
  1413.             case IDC_MASTER:
  1414.                idPanel = PANEL_SPINBUTTONDLG_MASTER;
  1415.                break;
  1416.  
  1417.             case IDC_SERVANT:
  1418.                idPanel = PANEL_SPINBUTTONDLG_SERVANT;
  1419.                break;
  1420.  
  1421.             case IDC_OK:
  1422.                idPanel = PANEL_SPINBUTTONDLG_OK;
  1423.                break;
  1424.  
  1425.             case IDC_CANCEL:
  1426.                idPanel = PANEL_SPINBUTTONDLG_CANCEL;
  1427.                break;
  1428.  
  1429.             case IDC_HELP:
  1430.                idPanel = PANEL_SPINBUTTONDLG_HELP;
  1431.                break;
  1432.  
  1433.             default:
  1434.                idPanel = PANEL_UNKNOWN;
  1435.                break;
  1436.          }
  1437.          break;
  1438.  
  1439.       case IDD_PRODINFO:
  1440.          idPanel = PANEL_ABOUTBOX;
  1441.          break;
  1442.  
  1443.       default:
  1444.          idPanel = PANEL_UNKNOWNDLG;
  1445.          break;
  1446.    }
  1447.    DisplayHelpPanel(idPanel);
  1448. }                                       /* End of ShowDlgHelp()        */
  1449.  
  1450. /*********************************************************************
  1451.  *  Name : InitializeValueSet
  1452.  *
  1453.  *  Description : Loads the demo Value Set with 4 different icons
  1454.  *                and with 4 colors derived form the color index.
  1455.  *
  1456.  *  Concepts : Called each time a demo Value Set is initialized A
  1457.  *             for 1 to 4 loop sets an Icon in each column of the
  1458.  *             First row of the Value Set via a VM_SETITEM
  1459.  *             message.  The Second row is set to a color by
  1460.  *             sending the VM_SETITEMATTR message.
  1461.  *
  1462.  *  API's : WinSendDlgItemMsg
  1463.  *
  1464.  *  Parameters : hwnd - Handle of the Valueset dialog.
  1465.  *
  1466.  *  Returns: TRUE if Value Set is loaded successfully, FALSE otherwise
  1467.  *
  1468.  ****************************************************************/
  1469. BOOL InitializeValueSet(HWND hwnd)
  1470. {
  1471.    USHORT usIndex;
  1472.    for (usIndex = 1; usIndex <= 4;usIndex++)
  1473.    {
  1474.      if ( !WinSendDlgItemMsg(hwnd, IDC_VALUESET, VM_SETITEM,
  1475.            MPFROM2SHORT(1,usIndex),
  1476.            MPFROMLONG( WinLoadPointer(HWND_DESKTOP, 0,
  1477.            (IDR_MAIN + usIndex)))))
  1478.          return FALSE;
  1479.  
  1480.      if ( !WinSendDlgItemMsg( hwnd,IDC_VALUESET, VM_SETITEMATTR,
  1481.           MPFROM2SHORT(2,usIndex),
  1482.           MPFROM2SHORT( VIA_COLORINDEX, TRUE )))
  1483.         return FALSE;
  1484.  
  1485.      if ( !WinSendDlgItemMsg(hwnd, IDC_VALUESET, VM_SETITEM,
  1486.           MPFROM2SHORT(2,usIndex),
  1487.           MPFROMSHORT(usIndex)))
  1488.         return FALSE;
  1489.    }
  1490.    return TRUE;
  1491. }                                       /* End of InitializeValueset    */
  1492. /*********************************************************************
  1493.  *  Name : InitializeSlider
  1494.  *
  1495.  *  Description :  Set the Sliders Tick size and Scale Text.
  1496.  *
  1497.  *  Concepts : Called each time a demo Slider controls ar initialized
  1498.  *             Ses the he initail value of the sliders output display
  1499.  *             to 0. A for 0 to 10 for loop sets the ruler text and
  1500.  *             tick size for both the Horizontal and Vertical Sliders
  1501.  *             via SLM_SETSCALETEXT and SLM_SETTICKSIZE message.
  1502.  *
  1503.  *  API's : WinSendDlgItemMsg
  1504.  *
  1505.  *  Parameters : hwnd - Handle of the Slider dialog.
  1506.  *
  1507.  *  Returns: TRUE if Sliders are initialized successfully, FALSE otherwise
  1508.  *
  1509.  *******************************************************************/
  1510. BOOL InitializeSlider(HWND hwnd)
  1511. {
  1512.    USHORT usIndex;
  1513.    CHAR   acBuffer[4];
  1514.    CHAR   *cData;
  1515.  
  1516.  
  1517.    cData = _ltoa(0,acBuffer,10);
  1518.    WinSetDlgItemText(hwnd,IDC_HSLIDERDATA, cData);
  1519.    WinSetDlgItemText(hwnd,IDC_VSLIDERDATA, cData);
  1520.    for (usIndex = 0;usIndex < 10 ;usIndex ++ )
  1521.    {
  1522.       _itoa(usIndex,acBuffer,10);
  1523.       if ( !WinSendDlgItemMsg(hwnd, IDC_HSLIDER, SLM_SETTICKSIZE,
  1524.                MPFROM2SHORT(usIndex, 5), NULL))
  1525.         return FALSE;
  1526.  
  1527.       if ( !WinSendDlgItemMsg(hwnd, IDC_HSLIDER, SLM_SETSCALETEXT,
  1528.                MPFROMSHORT(usIndex), MPFROMP(acBuffer)))
  1529.         return FALSE;
  1530.  
  1531.       if ( !WinSendDlgItemMsg(hwnd, IDC_VSLIDER, SLM_SETTICKSIZE,
  1532.                MPFROM2SHORT(usIndex, 5), NULL))
  1533.         return FALSE;
  1534.  
  1535.       if ( !WinSendDlgItemMsg(hwnd, IDC_VSLIDER, SLM_SETSCALETEXT,
  1536.                  MPFROMSHORT(usIndex), MPFROMP(acBuffer)))
  1537.         return FALSE;
  1538.    }
  1539.    return TRUE;
  1540. }                                       /* End of InitializeSlider      */
  1541.  
  1542. /*********************************************************************
  1543.  *  Name : InitializeSpinButton
  1544.  *
  1545.  *  Description : Set the intital values for the spin button controls.
  1546.  *
  1547.  *  Concepts : Sends a SPBM_SETARRAY to the Master Spin Button to set
  1548.  *             the values (text strings) available to the control.
  1549.  *             Sets the initial value to the array index of 0 by
  1550.  *             sending a SPBM_SETCURRENTVALUE.  The Servant Spin Button
  1551.  *             is initialized to the range 0 to 100 by sending a
  1552.  *             SPBM_SETLIMITS message.  Sends a SPBM_SETMASTER message
  1553.  *             to set the MASTER/SERVANT relationship between the two
  1554.  *             spin buttons.
  1555.  *
  1556.  *  API's : WinSendDlgItemMsg
  1557.  *          WinWindowFromID
  1558.  *
  1559.  *  Parameters : hwnd - Handle of the Spinnbutton dialog.
  1560.  *
  1561.  *  Returns: TRUE if Spinbuttons are initialized successfully, FALSE otherwise
  1562.  *
  1563.  ****************************************************************/
  1564. BOOL InitializeSpinButton(HWND hwnd)
  1565. {
  1566.    static PSZ   spinColors[] = {"White", "Black", "Blue", "Red"," Pink",
  1567.                      "Green", "Cyan", "Yellow", "Dark Grey", "Dark Blue",
  1568.                      "Dark Red", "Dark Pink", "Dark Green", "Dark Cyan",
  1569.                      "Brown", "Pale Grey"};
  1570.  
  1571.    if ( !WinSendDlgItemMsg( hwnd, IDC_MASTER, SPBM_SETARRAY, spinColors,
  1572.              MPFROMLONG(NUMSPINCOLORS)))
  1573.       return FALSE;
  1574.  
  1575.    if ( !WinSendDlgItemMsg( hwnd, IDC_MASTER, SPBM_SETCURRENTVALUE,
  1576.              MPFROMLONG(0), NULL))
  1577.       return FALSE;
  1578.  
  1579.    if ( !WinSendDlgItemMsg( hwnd, IDC_SERVANT, SPBM_SETLIMITS,
  1580.              MPFROMLONG(100), MPFROMLONG(0)))
  1581.       return FALSE;
  1582.  
  1583.    if ( !WinSendDlgItemMsg( hwnd, IDC_SERVANT, SPBM_SETCURRENTVALUE,
  1584.              MPFROMLONG(0), NULL))
  1585.       return FALSE;
  1586.  
  1587.    if (!WinSendDlgItemMsg(
  1588.            hwnd,
  1589.            IDC_SERVANT,
  1590.            SPBM_SETMASTER,
  1591.            MPFROMHWND( WinWindowFromID(hwnd, IDC_MASTER)),
  1592.            MPVOID)
  1593.       )
  1594.       return FALSE;
  1595.    return TRUE;
  1596. }                                       /* End of InitializeSpinbutton  */
  1597.  
  1598. /*********************************************************************
  1599.  *  Name : InitializeNotebook
  1600.  *
  1601.  *  Description : Set the intital pages for a notebook control.
  1602.  *
  1603.  *  Concepts : Called each time a demo NoteBook Control is
  1604.  *             initialized Sends a BKM_INSERTPAGE message to the
  1605.  *             notebook control to insert the first page into the
  1606.  *             control.  Sets the status line text for the first page
  1607.  *             by sending a BKM_SETSTATUSLINETEXT message.  Creates a
  1608.  *             window containing a bitmap and associates the whidow
  1609.  *             with the notebook by sending a BKM_SETPAGEWINDOWHWND
  1610.  *             message.  Repeats these steps with the execption of
  1611.  *             createing a MLE for use in the second notebook page.
  1612.  *
  1613.  *  API's : WinSendDlgItemMsg
  1614.  *          WinCreateWindow
  1615.  *          WinSendMsg
  1616.  *
  1617.  *  Parameters :  hwnd - Handle of the Notebook dialog
  1618.  *
  1619.  *  Returns: TRUE if The NoteBook is initialized successfully, FALSE otherwise
  1620.  *
  1621.  ****************************************************************/
  1622. BOOL InitializeNoteBook(HWND hwnd)
  1623. {
  1624.    HWND hwndPage;
  1625.    ULONG ulPageId;
  1626.    ULONG ipt = 0;
  1627.    CHAR pszMleBuffer[512];
  1628.    PSZ   pszNoteBookText =
  1629.    {"Applications written for the Presentation Manager have full\
  1630.     access to the complete set of user interface tools: menus,\
  1631.     icons, scroll bars, etc., and often present a WYSIWYG\
  1632.     (what-you-see-is-what-you-get) view of their data.\
  1633.     Presentation Manager programs often make extensive use\
  1634.     of a mouse and display, and they have access to all the\
  1635.     32-bit features of version 2.0."};
  1636.  
  1637.    /*
  1638.     * Insert the first page.
  1639.     */
  1640.    ulPageId = (LONG)WinSendDlgItemMsg(hwnd, IDC_NOTEBOOK,
  1641.         BKM_INSERTPAGE, NULL,
  1642.         MPFROM2SHORT((BKA_STATUSTEXTON | BKA_AUTOPAGESIZE | BKA_MAJOR),
  1643.         BKA_LAST));
  1644.  
  1645.    if ( !ulPageId)
  1646.      return FALSE;
  1647.  
  1648.    if ( !WinSendDlgItemMsg(hwnd, IDC_NOTEBOOK,
  1649.         BKM_SETSTATUSLINETEXT, MPFROMLONG(ulPageId),
  1650.         MPFROMP("Page 1 of 2")))
  1651.      return FALSE;
  1652.  
  1653.    if ( !WinSendDlgItemMsg(hwnd, IDC_NOTEBOOK,
  1654.         BKM_SETTABTEXT, MPFROMLONG(ulPageId),
  1655.         MPFROMP("~1")))
  1656.      return FALSE;
  1657.  
  1658.    hwndPage =
  1659.    WinCreateWindow(               /* parent-window handle                    */
  1660.       hwnd,                       /* pointer to registered class name        */
  1661.       WC_STATIC,                  /* pointer to window text                  */
  1662.       "#6",                       /* window style                            */
  1663.       WS_VISIBLE | SS_BITMAP,     /* horizontal position of window           */
  1664.       0,                          /* vertical position of window             */
  1665.       0,                          /* window width                            */
  1666.       0,                          /* window height                           */
  1667.       0,                          /* owner-window handle                     */
  1668.       NULLHANDLE,                 /* handle to sibling window                */
  1669.       HWND_TOP,                   /* window identifier                       */
  1670.       0,                          /* pointer to buffer                       */
  1671.       NULL,                       /* pointer to structure with pres. params. */
  1672.       NULL);
  1673.  
  1674.    if (!hwndPage)
  1675.      return FALSE;
  1676.  
  1677.    if ( !WinSendDlgItemMsg(hwnd, IDC_NOTEBOOK,
  1678.          BKM_SETPAGEWINDOWHWND, MPFROMLONG(ulPageId),
  1679.          MPFROMHWND(hwndPage)))
  1680.      return FALSE;
  1681.  
  1682.    /*
  1683.     * Insert the second page.
  1684.     */
  1685.     ulPageId = (LONG)WinSendDlgItemMsg(hwnd, IDC_NOTEBOOK,
  1686.          BKM_INSERTPAGE, NULL,
  1687.          MPFROM2SHORT((BKA_STATUSTEXTON | BKA_AUTOPAGESIZE | BKA_MAJOR),
  1688.          BKA_LAST));
  1689.  
  1690.    if (!ulPageId)
  1691.      return FALSE;
  1692.  
  1693.    if ( !WinSendDlgItemMsg(hwnd, IDC_NOTEBOOK,
  1694.          BKM_SETSTATUSLINETEXT, MPFROMLONG(ulPageId),
  1695.          MPFROMP("Page 2 of 2")))
  1696.      return FALSE;
  1697.  
  1698.    if ( !WinSendDlgItemMsg(hwnd, IDC_NOTEBOOK,
  1699.         BKM_SETTABTEXT, MPFROMLONG(ulPageId),
  1700.         MPFROMP("~2")))
  1701.      return FALSE;
  1702.  
  1703.    hwndPage =
  1704.    WinCreateWindow(
  1705.       hwnd,                       /* parent-window handle                    */
  1706.       WC_MLE,                     /* pointer to registered class name        */
  1707.       NULL,                       /* pointer to window text                  */
  1708.       WS_VISIBLE | MLS_WORDWRAP | /* window style                            */
  1709.          MLS_READONLY,
  1710.       0,                          /* horizontal position of window           */
  1711.       0,                          /* vertical position of window             */
  1712.       0,                          /* window width                            */
  1713.       0,                          /* window height                           */
  1714.       NULLHANDLE,                 /* owner-window handle                     */
  1715.       HWND_TOP,                   /* handle to sibling window                */
  1716.       0,                          /* window identifier                       */
  1717.       NULL,                       /* pointer to buffer                       */
  1718.       NULL);                      /* pointer to structure with pres. params. */
  1719.  
  1720.    if (!hwndPage)
  1721.      return FALSE;
  1722.  
  1723.    if ( !WinSendMsg(hwndPage, MLM_SETIMPORTEXPORT,
  1724.          MPFROMP(pszMleBuffer),
  1725.          MPFROMSHORT(sizeof(pszMleBuffer))))
  1726.      return FALSE;
  1727.  
  1728.      memset(pszMleBuffer,'\0',sizeof(pszMleBuffer));
  1729.      strcpy(pszMleBuffer, pszNoteBookText);
  1730.  
  1731.    if ( !WinSendMsg(hwndPage, MLM_IMPORT, &ipt,
  1732.          MPFROMSHORT(sizeof(pszMleBuffer))))
  1733.      return FALSE;
  1734.  
  1735.    if( !WinSendDlgItemMsg(hwnd, IDC_NOTEBOOK,
  1736.          BKM_SETPAGEWINDOWHWND, MPFROMLONG(ulPageId),
  1737.          MPFROMHWND(hwndPage)))
  1738.      return FALSE;
  1739.  
  1740.    return TRUE;
  1741. }                                       /* End of InitializeNotebook    */
  1742.  
  1743. /*********************************************************************
  1744.  *  Name : InitializeContainer
  1745.  *
  1746.  *  Description : Initialize and insert a record into the container.
  1747.  *
  1748.  *
  1749.  *  Concepts : Called each time a demo Container Control is initialized.
  1750.  *             Allocates and inserts a user record into a container.
  1751.  *             Allocates and inserst  details view information.
  1752.  *             Sets the containers info.
  1753.  *
  1754.  *  API's : WinLoadPointer
  1755.  *          WinSendDlgItemMsg
  1756.  *
  1757.  *  Parameters : hwnd - Handle of the container dialog.
  1758.  *
  1759.  *  Returns: TRUE if The Container is initialized successfully, FALSE otherwise
  1760.  *
  1761.  ****************************************************************/
  1762. BOOL InitializeContainer(HWND hwnd)
  1763. {
  1764.  
  1765.   USHORT            nRecords = 1;
  1766.   HPOINTER          hptr;
  1767.   ULONG             cbRecordData;
  1768.  
  1769.   hptr = WinLoadPointer(HWND_DESKTOP, 0, IDR_MAIN);
  1770.  
  1771.   cbRecordData = (LONG) (sizeof(USERRECORD) - sizeof(RECORDCORE));
  1772.   pUserRecord = WinSendDlgItemMsg(hwnd,IDC_CONTAINER,
  1773.                    CM_ALLOCRECORD, MPFROMLONG(cbRecordData) ,
  1774.                    MPFROMSHORT(nRecords));
  1775.  
  1776.   pUserRecord->recordCore.cb = sizeof(RECORDCORE);              /*RBS*/
  1777.   pUserRecord->recordCore.pszText = pszViewText;
  1778.   pUserRecord->recordCore.pszIcon = pszViewIcon;
  1779.   pUserRecord->recordCore.pszName = pszViewName;
  1780.   pUserRecord->recordCore.hptrIcon = hptr;
  1781.  
  1782.   pUserRecord->date.day = 11;
  1783.   pUserRecord->date.month = 11;
  1784.   pUserRecord->date.year = 11;
  1785.   pUserRecord->time.seconds    = 12;
  1786.   pUserRecord->time.minutes    = 12;
  1787.   pUserRecord->time.hours      = 12;
  1788.   pUserRecord->recordData = (PSZ)pszSampleData;
  1789.  
  1790.   recordInsert.cb = sizeof(RECORDINSERT);                   /*RBS*/
  1791.   recordInsert.pRecordParent= NULL;
  1792.   recordInsert.pRecordOrder = (PRECORDCORE)CMA_END;
  1793.   recordInsert.zOrder = CMA_TOP;
  1794.   recordInsert.cRecordsInsert = 1;
  1795.   recordInsert.fInvalidateRecord = TRUE;
  1796.  
  1797.   WinSendDlgItemMsg(hwnd,IDC_CONTAINER, CM_INSERTRECORD,
  1798.                    (PRECORDCORE)pUserRecord, &recordInsert);
  1799.  
  1800.   pFieldInfo = WinSendDlgItemMsg(hwnd, IDC_CONTAINER,
  1801.                         CM_ALLOCDETAILFIELDINFO,MPFROMLONG(3), NULL);
  1802.  
  1803.   firstFieldInfo = pFieldInfo;
  1804.  
  1805.   pFieldInfo->cb = sizeof(FIELDINFO);                       /*RBS*/
  1806.   pFieldInfo->flData = CFA_STRING | CFA_HORZSEPARATOR | CFA_CENTER |
  1807.                          CFA_SEPARATOR;
  1808.   pFieldInfo->flTitle = CFA_CENTER;
  1809.   pFieldInfo->pTitleData = (PVOID) pszColumnText1;
  1810.   pFieldInfo->offStruct = FIELDOFFSET(USERRECORD,recordData);
  1811.   pFieldInfo = pFieldInfo->pNextFieldInfo;
  1812.  
  1813.   pFieldInfo->cb = sizeof(FIELDINFO);                       /*RBS*/
  1814.   pFieldInfo->flData = CFA_DATE | CFA_HORZSEPARATOR | CFA_CENTER |
  1815.                          CFA_SEPARATOR;
  1816.   pFieldInfo->flTitle = CFA_CENTER;
  1817.   pFieldInfo->pTitleData =  (PVOID) pszColumnText2;
  1818.   pFieldInfo->offStruct = FIELDOFFSET(USERRECORD,date);
  1819.   pFieldInfo = pFieldInfo->pNextFieldInfo;
  1820.  
  1821.   pFieldInfo->cb = sizeof(FIELDINFO);                       /*RBS*/
  1822.   pFieldInfo->flData = CFA_TIME | CFA_HORZSEPARATOR | CFA_CENTER |
  1823.                          CFA_SEPARATOR;
  1824.   pFieldInfo->flTitle = CFA_CENTER;
  1825.   pFieldInfo->pTitleData = (PVOID) pszColumnText3;
  1826.   pFieldInfo->offStruct = FIELDOFFSET(USERRECORD,time);
  1827.  
  1828.  
  1829.   fieldInfoInsert.cb = (ULONG)(sizeof(FIELDINFOINSERT));    /*RBS*/
  1830.   fieldInfoInsert.pFieldInfoOrder = (PFIELDINFO)CMA_FIRST;
  1831.   fieldInfoInsert.cFieldInfoInsert = 3;
  1832.   fieldInfoInsert.fInvalidateFieldInfo = TRUE;              /*RBS*/
  1833.  
  1834.   pFieldInfoInsert = &fieldInfoInsert;
  1835.  
  1836.   WinSendDlgItemMsg(hwnd,IDC_CONTAINER, CM_INSERTDETAILFIELDINFO,
  1837.                     MPFROMP(firstFieldInfo),
  1838.                     MPFROMP(pFieldInfoInsert));
  1839.  
  1840.   WinSendDlgItemMsg(hwnd,IDC_CONTAINER,CM_SETCNRINFO,&cnrinfo,
  1841.                      MPFROMLONG(CMA_FLWINDOWATTR | CMA_CNRTITLE));
  1842.  
  1843. return TRUE;
  1844. }                                       /* End of InitializeContainer    */
  1845. /***********************************************************
  1846.  * Name         : SetSysMenu
  1847.  *
  1848.  * Description  : Procedure to remove unselectable items from
  1849.  *                the window system menu.
  1850.  *
  1851.  * Concepts     : This routine determines the number of items
  1852.  *                in the system menu, loops through those
  1853.  *                items removing disabled menu items and menu
  1854.  *                seperators.
  1855.  *
  1856.  * API's        : WinMessageBox
  1857.  *
  1858.  * Parameters   : None
  1859.  *
  1860.  * Return       : None
  1861.  *
  1862.  **************************************************************/
  1863. VOID SetSysMenu(HWND hwndDlg)
  1864. {
  1865.   SHORT sMenuItems;
  1866.   USHORT usItemid;
  1867.   MENUITEM menuItem;
  1868.   HWND  hwndSubMenu;
  1869.  
  1870.   /* Determine the definition of the system menu */
  1871.   WinSendDlgItemMsg(hwndDlg, FID_SYSMENU, MM_QUERYITEM,
  1872.                     MPFROM2SHORT((SHORT)SC_SYSMENU,FALSE),
  1873.                     MPFROMP(&menuItem));
  1874.  
  1875.   hwndSubMenu = menuItem.hwndSubMenu;
  1876.  
  1877.   /* Find the number of items in the in the submenu */
  1878.   sMenuItems = (SHORT)WinSendMsg(hwndSubMenu,
  1879.                                  MM_QUERYITEMCOUNT,NULL,NULL);
  1880.   /*
  1881.    * Loop through the submenu items and remove disabled
  1882.    * menu items and menu separators.
  1883.    */
  1884.   for (sMenuItems - 1 ; sMenuItems >= 0 ;sMenuItems-- )
  1885.   {
  1886.     /* Find the item ID for the current position. */
  1887.     usItemid = (USHORT)WinSendMsg(hwndSubMenu,MM_ITEMIDFROMPOSITION,
  1888.                          MPFROMSHORT(sMenuItems), NULL);
  1889.  
  1890.     /* Query the definition of the current item*/
  1891.     WinSendMsg(hwndSubMenu, MM_QUERYITEM,
  1892.                MPFROM2SHORT(usItemid,FALSE), MPFROMP(&menuItem));
  1893.  
  1894.    /*
  1895.     * If the menu item is disabled or the item has a style
  1896.     * of MIS_SEPARATOR - delete it.
  1897.     */
  1898.     if ((BOOL)(WinSendMsg(hwndSubMenu, MM_QUERYITEMATTR,
  1899.           MPFROM2SHORT(usItemid,FALSE), (MPARAM)MIA_DISABLED)) ||
  1900.           (menuItem.afStyle & MIS_SEPARATOR))
  1901.     {
  1902.       WinSendMsg(hwndSubMenu, MM_DELETEITEM,
  1903.                 MPFROM2SHORT(usItemid,FALSE),NULL);
  1904.     }
  1905.   }
  1906. }                                       /* End of SetSysMenu()           */
  1907.