home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / iedhelp.zip / IEDHELP.C < prev    next >
Text File  |  1995-02-15  |  19KB  |  685 lines

  1. /****************************************************************************\
  2. *                                                                            *
  3. *  MODULE NAME:IEDHELP.C                                                     *
  4. *                                                                            *
  5. *        IBM Confidential                                                    *
  6. *                                                                            *
  7. *        Copyright (c) IBM Corporation 1994                                  *
  8. *                                                                            *
  9. *        All Rights Reserved                                                 *
  10. \****************************************************************************/
  11. #define LINT_ARGS            /* argument checking enabled */
  12.  
  13. #define INCL_WINWINDOWMGR    /* General window management             */
  14. #define INCL_WINMESSAGEMGR    /* Message management                 */
  15. #define INCL_WININPUT        /* Mouse and keyboard input             */
  16. #define INCL_WINDIALOGS     /* Dialog boxes                  */
  17. #define INCL_WINSTATICS     /* Static controls                 */
  18. #define INCL_WINFRAMEMGR    /* Frame manager                 */
  19. #define INCL_WINFRAMECTLS    /* Frame controls (title bars & size border) */
  20. #define INCL_WINACCELERATORS    /* Keyboard accelerators             */
  21. #define INCL_WINBUTTONS     /* Button controls                 */
  22. #define INCL_WINENTRYFIELDS    /* Entry Fields                  */
  23. #define INCL_WINMENUS        /* Menu controls                 */
  24. #define INCL_WINSCROLLBARS    /* Scroll bar controls                 */
  25. #define INCL_WINSYS        /* System values (and colors)             */
  26. #define INCL_WINLISTBOXES    /* List box controls                 */
  27. #define INCL_GPIBITMAPS     /* Bitmaps and Pel Operations             */
  28. #define INCL_WINPOINTERS    /* Mouse pointers                 */
  29. #define INCL_WINCURSORS
  30. #define INCL_GPIPRIMITIVES    /* Drawing Primitives and Primitive Attributes*/
  31. #define INCL_WINTRACKRECT
  32. #define INCL_WINRECTANGLES
  33. #define INCL_GPICONTROL
  34. #define INCL_GPITRANSFORMS
  35. #define INCL_GPILCIDS
  36. #define INCL_WINTIMER
  37. #define INCL_WINHELP
  38.  
  39. #include <os2.h>
  40. #include <stdio.h>
  41. #include <stdlib.h>
  42. #include <string.h>
  43. #include <ctype.h>
  44.  
  45. #define HELP_MAIN
  46. #include "iedtype.h"
  47. #include "iedmain.h"
  48. #include "iedmisc.h"
  49. #include "iedrc.h"
  50. #include "iedhlpid.h"
  51. #include "iedtoc.h"
  52. #include "iedgram.h"
  53. #include "iedclist.h"
  54. #include "ieddrag.h"
  55. #include "iedhelp.h"
  56.  
  57.  
  58. VOID PanelHelp (pDocInfo, hwndHelpInstance)
  59. PDOCINFO pDocInfo;
  60. HWND hwndHelpInstance;
  61. {
  62.    ULONG ulMarked;
  63.    ULONG ulDrag = 0;
  64.    USHORT usX;
  65.    USHORT usY;
  66.    HWND hwnd;
  67.    USHORT usPanelID = HELP_PANEL;
  68.  
  69.    if (!hwndHelpInstance)
  70.    {
  71.       return;
  72.    }
  73.  
  74.    if (pDocInfo->pMarkData && pDocInfo->pMarkData->pBeginLine)
  75.    {
  76.       ulMarked = TRUE;
  77.    }
  78.    else
  79.    {
  80.       ulMarked = FALSE;
  81.    }
  82.  
  83.    if (pObject2)
  84.    {
  85.       hwnd = GetWindowUnderMousePointer (pObject2, &usX, &usY, &ulDrag);
  86.       if (pObject2->ulSourceObject & OBJECT_MARKED_PANEL)
  87.       {
  88.      usPanelID = HELP_PANEL_MARKED_DRAG;
  89.       }
  90.       else
  91.       {
  92.      usPanelID = HELP_PANEL_DRAG;
  93.       }
  94.  
  95.    }
  96.    else
  97.    {
  98.       if (ulMarked)
  99.       {
  100.      usPanelID = HELP_PANEL_MARKED;
  101.       }
  102.    }
  103.    WinSendMsg (hwndHelpInstance, HM_DISPLAY_HELP,
  104.                (MPARAM)usPanelID, (MPARAM)HMPANELTYPE_NUMBER);
  105. }
  106.  
  107.  
  108. VOID InitHelpObject (hwndAssociate)
  109. HWND hwndAssociate;
  110. {
  111.    HELPINIT hmiHelpData;          /* Help initialization structure*/
  112.                       /* size of initialization structure*/
  113.    hmiHelpData.cb            = sizeof(HELPINIT);
  114.                       /* store HM return code from init. */
  115.    hmiHelpData.ulReturnCode        = 0;
  116.    hmiHelpData.pszTutorialName        = NULL;
  117.                       /* indicates help table is defined */
  118.                       /* in the RC file.             */
  119.    hmiHelpData.phtHelpTable        = (PVOID)(0xffff0000 | MAIN_HELPTABLE);
  120.                       /* action bar is not tailored      */
  121.    hmiHelpData.hmodAccelActionBarModule = NULLHANDLE;
  122.    hmiHelpData.idAccelTable        = 0;
  123.    hmiHelpData.idActionBar        = 0;
  124.    GetRcString (chMsg, IDS_MSG_288);
  125.    hmiHelpData.pszHelpWindowTitle    = chMsg;
  126.    hmiHelpData.hmodHelpTableModule    = hModule;
  127.    hmiHelpData.fShowPanelId         = 0;
  128.    hmiHelpData.pszHelpLibraryName    = "HWHLP.HLP";
  129.  
  130.  
  131.    /********************************************/
  132.    /* Create Instance of IPF               */
  133.    /*                           */
  134.    /* pass Anchor Block handle and address of  */
  135.    /* IPF initialization structure, and check  */
  136.    /* that creation was successful.           */
  137.    /********************************************/
  138.  
  139.    hmiHelpData.ulReturnCode = 0;
  140.    hwndHelpInstance = WinCreateHelpInstance(hAB, &hmiHelpData);
  141.  
  142.    if (!hwndHelpInstance)
  143.    {
  144.       if (hmiHelpData.ulReturnCode)
  145.          DisplayIDMsg (NULL, IDS_MSG_24, MB_OK);
  146.       return;
  147.    }
  148.    else
  149.    {
  150.       if (hmiHelpData.ulReturnCode)
  151.       {
  152.          DisplayIDMsg (NULL, IDS_MSG_24, MB_OK);
  153.      WinDestroyHelpInstance(hwndHelpInstance);
  154.      return;
  155.       }
  156.    }
  157.  
  158.       /* register object window class */
  159.    if (!WinRegisterClass( hAB,
  160.           (PCH    )"CLA_HELP_OBJECT",
  161.           (PFNWP)HelpObjectProc,
  162.           0,
  163.           0))
  164.    {
  165.       WinDestroyHelpInstance(hwndHelpInstance);
  166.       return;
  167.    }
  168.       /* create comunication window */
  169.    hwndObject = WinCreateWindow ((HWND)hwndAssociate,
  170.                  (PSZ)"CLA_HELP_OBJECT",
  171.                  (PSZ)"",
  172.                  (ULONG)NULL,
  173.                  0,
  174.                  0,
  175.                  0,
  176.                  0,
  177.                  (HWND)hwndAssociate,
  178.                  HWND_BOTTOM,
  179.                  (USHORT)-1,
  180.                  (PVOID)NULL,
  181.                  (PVOID)NULL);
  182.  
  183.    if (!hwndObject)
  184.    {
  185.       WinDestroyHelpInstance(hwndHelpInstance);
  186.       return;
  187.    }
  188.  
  189.       /* associate help instance with the associated window */
  190.    WinAssociateHelpInstance (hwndHelpInstance ,hwndAssociate);
  191.    WinSendMsg (hwndHelpInstance, HM_SET_OBJCOM_WINDOW, (MPARAM)hwndObject, NULL);
  192. }
  193.  
  194. MRESULT EXPENTRY HelpObjectProc( hWnd, msg, mp1, mp2 )
  195. HWND   hWnd;
  196. ULONG msg;
  197. MPARAM mp1;
  198. MPARAM mp2;
  199. {
  200.    switch (msg)
  201.    {
  202.       case HM_INFORM:
  203.      break;
  204.    }
  205.    return (WinDefWindowProc( hWnd, msg, mp1, mp2 ) );
  206. }
  207.  
  208. VOID DestroyHelpObject ()
  209. {
  210.    if (hwndObject)
  211.    {
  212.       WinDestroyWindow (hwndObject);
  213.       hwndObject = NULLHANDLE;
  214.    }
  215.    if (hwndHelpInstance)
  216.    {
  217.       WinDestroyHelpInstance(hwndHelpInstance);
  218.       hwndHelpInstance = NULLHANDLE;
  219.    }
  220. }
  221.  
  222. BOOL DisplayHelp (hwnd)
  223. HWND hwnd;
  224. {
  225.    USHORT usPanelID = 0;
  226.    USHORT usWndID;
  227.  
  228.                                                       /* ->@@HWD */
  229.    usWndID = WinQueryWindowUShort (hwnd, QWS_ID);
  230.    if (usWndID == (USHORT)FID_CLIENT)
  231.    {
  232.       hwnd = WinQueryWindow (hwnd, QW_PARENT);
  233.       usWndID = WinQueryWindowUShort (hwnd, QWS_ID);
  234.    }
  235.                                                       /* @@HWD<- */
  236.    switch (usWndID)
  237.    {
  238.                                                      /* ->@@ACT */
  239.       case IDD_CTRL          :
  240.          usPanelID = IDH_DLG_CTRL;
  241.          break;
  242.                                                      /* ->@@ACT */
  243.  
  244.       case IDD_CTRL_GROUP    :
  245.          usPanelID = IDH_CTRL_GROUP;
  246.          break;
  247.  
  248.       case IDD_NEWFILE       :
  249.          usPanelID = IDH_IDD_NEWFILE;
  250.          break;
  251.       case IDD_DOCATTR       :
  252.          usPanelID = IDH_IDD_DOCATTR;
  253.          break;
  254.       case IDD_PRINT         :
  255.          usPanelID = IDH_IDD_PRINT;
  256.          break;
  257.       case IDD_SEARCH        :
  258.          usPanelID = IDH_IDD_SEARCH;
  259.          break;
  260.       case IDD_ATTR          :
  261.          usPanelID = IDH_IDD_ATTR;
  262.          break;
  263.       case IDD_BITMAP        :
  264.          usPanelID = IDH_IDD_BITMAP;
  265.          break;
  266.       case IDD_ANIMATEATTR   :
  267.          usPanelID = IDH_IDD_ANIMATEATTR;
  268.          break;
  269.       case DLG_ARTWORK       :
  270.          usPanelID = IDH_DLG_ARTWORK;
  271.          break;
  272.       case IDD_INDEX         :
  273.          usPanelID = IDH_IDD_INDEX;
  274.          break;
  275.       case IDD_INDEX2        :
  276.          usPanelID = IDH_IDD_INDEX2;
  277.          break;
  278.       case IDD_SYNONYMDEF    :
  279.          usPanelID = IDH_IDD_SYNONYMDEF;
  280.          break;
  281.       case IDD_TABLE         :
  282.          usPanelID = IDH_IDD_TABLE;
  283.          break;
  284.       case IDD_LABEL_FRAME   :
  285.          usPanelID = IDH_IDD_LABEL_FRAME;
  286.          break;
  287.       case IDD_TBL_LAYOUT    :
  288.          usPanelID = IDH_IDD_TBL_LAYOUT;
  289.          break;
  290.       case IDD_HIDEKEY       :
  291.          usPanelID = IDH_IDD_HIDEKEY;
  292.          break;
  293.       case IDD_UPDATE_BMP       :
  294.          usPanelID = IDH_IDD_UPDATE_BITMAP;
  295.          break;
  296.       case IDD_PREF          :
  297.          usPanelID = IDH_IDD_PREF;
  298.          break;
  299.       case IDD_PANELLINK     :
  300.          usPanelID = IDH_IDD_PANELLINK;
  301.          break;
  302.       case IDD_LAUNCHLINK    :
  303.          usPanelID = IDH_IDD_LAUNCHLINK;
  304.          break;
  305.       case IDD_INFORMLINK    :
  306.          usPanelID = IDH_IDD_INFORMLINK;
  307.          break;
  308.       case IDD_LINKVIDEO    :
  309.          usPanelID = IDH_IDD_LINKVIDEO;
  310.          break;
  311.       case IDD_LINKAUDIO    :
  312.          usPanelID = IDH_IDD_LINKAUDIO;
  313.          break;
  314.       case IDD_PANELATTR     :
  315.          usPanelID = IDH_IDD_PANELATTR;
  316.          break;
  317.       case IDD_ACVIEWPORT    :
  318.          usPanelID = IDH_IDD_ACVIEWPORT;
  319.          break;
  320.       case IDD_DDFATTR       :
  321.          usPanelID = IDH_IDD_DDFATTR;
  322.          break;
  323.       case IDD_DATAFILE      :
  324.          usPanelID = IDH_IDD_DATAFILE;
  325.          break;
  326.       case IDD_FONT          :
  327.          usPanelID = IDH_IDD_FONT;
  328.          break;
  329.       case IDD_AUTOSTREAM    :
  330.          usPanelID = IDH_IDD_AUTOSTREAM;
  331.          break;
  332.       case IDD_COMPONENT     :
  333.          usPanelID = IDH_IDD_COMPONENT;
  334.          break;
  335.       case IDD_COMPONENT2    :
  336.          usPanelID = IDH_IDD_COMPONENT2;
  337.          break;
  338.       case IDD_ELE_PRTOPT    :
  339.          usPanelID = IDH_IDD_ELE_PRTOPT;
  340.          break;
  341.       case IDD_PANELDEF      :
  342.          usPanelID = IDH_IDD_PANELDEF;
  343.          break;
  344.       case IDD_SYMBOL        :
  345.          usPanelID = IDH_IDD_SYMBOL;
  346.          break;
  347.       case IDD_SAVESTYLEFILE :
  348.          usPanelID = IDH_SAVESTYLEFILE;
  349.          break;
  350.  
  351.       case IDD_OUTLINER :
  352.          usPanelID = IDH_IDD_OUTLINE;
  353.          break;
  354.  
  355.       case IDD_SPELL_OPTION :
  356.          usPanelID = IDH_IDD_SPELLOPTION;
  357.          break;
  358.  
  359.       case IDD_SPELLCHECK :
  360.          usPanelID = IDH_IDD_SPELLCHECK;
  361.          break;
  362.  
  363.       case IDD_ALIGN :
  364.          usPanelID = IDH_IDD_ALIGN;
  365.          break;
  366.  
  367.       case IDD_IMP_IPF :
  368.          usPanelID = IDH_IDD_IMPORT_IPF;
  369.          break;
  370.  
  371.       case IDD_IMP_BKM :
  372.          usPanelID = IDH_IDD_IMPORT_BKM;
  373.          break;
  374.  
  375.       case IDD_IMP_RTF :
  376.          usPanelID = IDH_IDD_IMPORT_RTF;
  377.          break;
  378.  
  379.       case IDD_EXP_IPF :
  380.          usPanelID = IDH_IDD_EXPORT_IPF;
  381.          break;
  382.  
  383.       case IDD_EXP_BKM :
  384.          usPanelID = IDH_IDD_EXPORT_BKM;
  385.          break;
  386.  
  387.       case IDD_EXP_HLP :
  388.          usPanelID = IDH_IDD_EXPORT_HLP;
  389.          break;
  390.  
  391.  
  392.       case IDD_EXP_INF :
  393.          usPanelID = IDH_IDD_EXPORT_INF;
  394.          break;
  395.  
  396.       case IDD_EXP_HTML :
  397.          usPanelID = IDH_IDD_EXPORT_HTML;
  398.          break;
  399.  
  400.       case WINDOW_ID_STATUS  :
  401.          break;
  402.       case WINDOW_ID_COLOR   :
  403.          usPanelID = IDH_WND_COLOR;
  404.          break;
  405.       case WINDOW_ID_TRASH + CLOSE_TRASH :
  406.       case WINDOW_ID_TRASH + OPEN_TRASH  :
  407.          usPanelID = IDH_WND_TRASH;
  408.          break;
  409.       case WINDOW_ID_ANIMATE :
  410.          break;
  411.       case WINDOW_ID_CANIMATE:
  412.          break;
  413.       case WINDOW_ID_PALETTE    :
  414.          break;
  415.       case WINDOW_ID_EDIT       :
  416.          usPanelID = IDH_WND_AUTOLINK;
  417.          break;
  418.       case WINDOW_ID_DIR        :
  419.          usPanelID = IDH_WND_DIR;
  420.          break;
  421.       case WINDOW_ID_FILE       :
  422.          usPanelID = IDH_WND_FILE;
  423.          break;
  424.       case WINDOW_ID_NEW_FILE   :
  425.          usPanelID = IDH_WND_NEWFILE;
  426.          break;
  427.       case WINDOW_ID_LAYOUT     :
  428.          usPanelID = 0;
  429.          break;
  430.       case WINDOW_ID_LOCK       :
  431.          usPanelID = IDH_WND_LOCK;
  432.          break;
  433.  
  434.  
  435.    }
  436.    if (usPanelID)
  437.    {
  438.       HWND hwndOwner;
  439.       WinSendMsg (hwndHelpInstance, HM_SET_ACTIVE_WINDOW,
  440.                (MPARAM)hwnd, (MPARAM)NULL);
  441.       WinSendMsg (hwndHelpInstance, HM_DISPLAY_HELP,
  442.                (MPARAM)usPanelID, (MPARAM)HMPANELTYPE_NUMBER);
  443.       hwndOwner = WinQueryWindow (hwnd, QW_OWNER);
  444.       WinSendMsg (hwndHelpInstance, HM_SET_ACTIVE_WINDOW,
  445.                (MPARAM)hwndOwner, (MPARAM)NULL);
  446.       return TRUE;
  447.    }
  448.    return FALSE;
  449. }
  450.  
  451. BOOL DisplayHelp2 (HWND hwnd,
  452.                    USHORT usWndID)
  453. {
  454.    USHORT usPanelID = 0;
  455.  
  456.    switch (usWndID)
  457.    {
  458.       case IDD_IMPSTYLE_FILE :
  459.          usPanelID = IDH_IMPSTYLE_FILE;
  460.          break;
  461.  
  462.       case IDD_SAVEAS_FILE:
  463.          usPanelID = IDH_SAVEAS;
  464.          break;
  465.  
  466.       case IDD_SAVE_ANMT_FILE:
  467.          usPanelID = IDH_AN_FSAVE;
  468.          break;
  469.  
  470.       case IDD_FONT :
  471.          usPanelID = IDH_IDD_FONT;
  472.          break;
  473.    }
  474.    if (usPanelID)
  475.    {
  476.       HWND hwndOwner;
  477.  
  478.       //WinSetActiveWindowAssociateHelpInstance (hwndHelpInstance ,hwnd);
  479.       WinSendMsg (hwndHelpInstance, HM_SET_ACTIVE_WINDOW,
  480.                (MPARAM)hwnd, (MPARAM)NULL);
  481.       WinSendMsg (hwndHelpInstance, HM_DISPLAY_HELP,
  482.                (MPARAM)usPanelID, (MPARAM)HMPANELTYPE_NUMBER);
  483.       hwndOwner = WinQueryWindow (hwnd, QW_OWNER);
  484.       WinSendMsg (hwndHelpInstance, HM_SET_ACTIVE_WINDOW,
  485.                (MPARAM)hwndOwner, (MPARAM)NULL);
  486.  
  487.       return TRUE;
  488.    }
  489.    return FALSE;
  490. }
  491.  
  492. BOOL DisplayHelp3 (USHORT usPanelID)
  493. {
  494.    WinSendMsg (hwndHelpInstance, HM_DISPLAY_HELP,
  495.                (MPARAM)usPanelID, (MPARAM)HMPANELTYPE_NUMBER);
  496.    return TRUE;
  497. }
  498.  
  499.    /* this displayhelp only handles custom list window helps */
  500. BOOL DisplayHelp4 (hwnd)
  501. HWND hwnd;
  502. {
  503.    USHORT usPanelID = 0;
  504.    USHORT usWndID;
  505.  
  506.    hwnd = WinQueryWindow (hwnd, QW_PARENT);
  507.    usWndID = WinQueryWindowUShort (hwnd, QWS_ID);
  508.  
  509.    switch (usWndID)
  510.    {
  511.       case WINDOW_ID_LIST    :
  512.          usPanelID = IDH_WND_PANELLIST;
  513.          break;
  514.       case WINDOW_ID_PANEL   :
  515.          usPanelID = IDH_WND_PANEL;
  516.          break;
  517.       case WINDOW_ID_BMP_LIST:
  518.          usPanelID = IDH_WND_BMPLIST;
  519.          break;
  520.       case WINDOW_ID_MMC_ANMT:
  521.          usPanelID = IDH_WND_ANMT;
  522.          break;
  523.       case WINDOW_ID_CANIMATE:
  524.          break;
  525.       case WINDOW_ID_COMLIST :
  526.          usPanelID = IDH_WND_ELELIST;
  527.          break;
  528.       case WINDOW_ID_FONTLIST   :
  529.          usPanelID = IDH_WND_FONTLIST;
  530.          break;
  531.       case WINDOW_ID_CTRLLIST   :
  532.          usPanelID = IDH_WND_PUSHBUTTONLIST;
  533.          break;
  534.       case WINDOW_ID_AUTOSTRLIST:
  535.          usPanelID = IDH_WND_PREFIXLIST;
  536.          break;
  537.       case WINDOW_ID_PNLPROPERTYLIST:
  538.          usPanelID = IDH_WND_PANELSTYLIST;
  539.          break;
  540.       case WINDOW_ID_CONTENTS   :
  541.          usPanelID = IDH_WND_TOC;
  542.          break;
  543.       case WINDOW_ID_INDEX      :
  544.          usPanelID = IDH_WND_INDEX;
  545.          break;
  546.       case WINDOW_ID_AUTOLINK   :
  547.          usPanelID = IDH_WND_AUTOLINK;
  548.          break;
  549.       case WINDOW_ID_SYNONYMLIST:
  550.          usPanelID = IDH_WND_SYNLIST;
  551.          break;
  552.       case WINDOW_ID_LAYOUT     :
  553.          usPanelID = 0;
  554.          break;
  555.       case WINDOW_ID_SYMBOLLIST :
  556.          usPanelID = IDH_WND_SYMBOLLIST;
  557.          break;
  558.    }
  559.    if (usPanelID)
  560.    {
  561.       WinSendMsg (hwndHelpInstance, HM_DISPLAY_HELP,
  562.                (MPARAM)usPanelID, (MPARAM)HMPANELTYPE_NUMBER);
  563.       return TRUE;
  564.    }
  565.    return FALSE;
  566. }
  567.  
  568. BOOL ShowBubbleHelp (USHORT usRcID, PSZ pszHelpMsg, ULONG ulFlag)
  569. {
  570.    if (usBubbleWidth == NO_SHOW_BUBBLE)
  571.    {
  572.       return;
  573.    }
  574.    if (!pszHelpMsg)
  575.    {
  576.       GetRcString (chMsg, usRcID);
  577.       pszHelpMsg = chMsg;
  578.    }
  579.    if (usBubbleWidth)
  580.    {
  581.       DestroyBubbleHelp ();
  582.    }
  583.    CreateBubbleHelp (pszHelpMsg, ulFlag);
  584.  
  585.    return TRUE;
  586. }
  587.  
  588. BOOL CreateBubbleHelp (PSZ pszHelpMsg, ULONG ulFlag)
  589. {
  590.    POINTL Pt5[5];
  591.    POINTL pt;
  592.    RECTL Rect;
  593.    ULONG Len;
  594.    USHORT usTextHeight;
  595.    HPS   hps;
  596.    CHAR  chName[48];
  597.    FONTMETRICS    Metrics;
  598.  
  599.    WinQueryPointerPos (HWND_DESKTOP, &pt);
  600.  
  601.    WinQueryPresParam (HWND_DESKTOP, PP_FONTNAMESIZE, 0, NULL, 48L, chName, 0);
  602.    WinSetPresParam (HWND_DESKTOP, PP_FONTNAMESIZE, 8L, (PVOID)"8.Helv");
  603.    hps = WinGetScreenPS (HWND_DESKTOP);
  604.    Len = strlen(pszHelpMsg);
  605.    GpiQueryTextBox (hps, (ULONG)Len, pszHelpMsg, 5L, (PPOINTL) Pt5);
  606.    usBubbleWidth = (USHORT)Pt5[TXTBOX_CONCAT].x;
  607.    if (ulFlag & HELP_DOWN_POS)
  608.    {
  609.      Rect.yTop = pt.y - 20;
  610.      Rect.xLeft = pt.x - (usBubbleWidth >> 1) - (usStdCharWidth >> 1);
  611.    }
  612.    else if (ulFlag & HELP_RIGHT_POS)
  613.    {
  614.      Rect.yTop = pt.y + (usStdCharHeight >> 1);
  615.      Rect.xLeft = pt.x + 20;
  616.    }
  617.    Rect.yBottom = Rect.yTop - usStdCharHeight;
  618.    if (Rect.xLeft < 0)
  619.    {
  620.       Rect.xLeft = 0;
  621.    }
  622.    if (Rect.yBottom < 0)
  623.    {
  624.       Rect.yBottom = 0;
  625.    }
  626.    Rect.xRight = Rect.xLeft + usBubbleWidth + usStdCharWidth;
  627.  
  628.    BubbleHelpPos.x = Rect.xLeft;
  629.    BubbleHelpPos.y = Rect.yBottom;
  630.  
  631.    WinFillRect (hps, &Rect, CLR_YELLOW);
  632.  
  633.    GpiSetColor (hps, CLR_BLACK);
  634.    pt.x = Rect.xLeft;
  635.    pt.y = Rect.yBottom;
  636.    GpiSetCurrentPosition( hps, &pt);
  637.    pt.x = Rect.xRight - 1;
  638.    pt.y = Rect.yTop - 1;
  639.    GpiBox( hps, DRO_OUTLINE, &pt, 0L, 0L);
  640.  
  641.    DrawShadow (hps, &Rect, 2, 2, CLR_BLACK);
  642.  
  643.    GpiQueryFontMetrics (hps, (LONG)sizeof(FONTMETRICS), &Metrics);
  644.    usTextHeight = (USHORT)(Metrics.lMaxBaselineExt + Metrics.lExternalLeading);
  645.    pt.x = Rect.xLeft + (usStdCharWidth >> 1);
  646.    pt.y = Rect.yBottom + ((Rect.yTop - Rect.yBottom - usTextHeight) >> 1) +
  647.           Metrics.lMaxDescender;
  648.    GpiCharStringAt(hps, &pt, (LONG)Len, pszHelpMsg);
  649.  
  650.    WinReleasePS (hps);
  651.    WinSetPresParam (HWND_DESKTOP, PP_FONTNAMESIZE, 48L, (PVOID)chName);
  652.  
  653.    return TRUE;
  654. }
  655.  
  656. VOID DestroyBubbleHelp ()
  657. {
  658.    RECTL Rect;
  659.    HPS   hps;
  660.  
  661.    if (usBubbleWidth == NO_SHOW_BUBBLE)
  662.    {
  663.       return;
  664.    }
  665.  
  666.    if (!usBubbleWidth)
  667.    {
  668.       return;
  669.    }
  670.    hps = WinGetScreenPS (HWND_DESKTOP);
  671.  
  672.    Rect.yBottom = BubbleHelpPos.y - 2;
  673.    Rect.yTop = Rect.yBottom + usStdCharHeight + 2;
  674.    Rect.xLeft = BubbleHelpPos.x;
  675.    Rect.xRight = Rect.xLeft + usBubbleWidth + usStdCharWidth + 2;
  676.    GpiSetViewingLimits (hps, &Rect);
  677.    WinInvalidateRect (HWND_DESKTOP, &Rect, TRUE);
  678.    usBubbleWidth = 0;
  679.    usBubbleIndex = 0xFFFF;
  680.  
  681.    WinReleasePS (hps);
  682. }
  683.  
  684.  
  685.