home *** CD-ROM | disk | FTP | other *** search
/ PC World 1998 June / PCWorld_1998-06_cd.bin / software / sharware / grafika / EROICA16 / HOTSPOT.C_ / HOTSPOT.C
C/C++ Source or Header  |  1998-01-15  |  20KB  |  686 lines

  1. /*-------------------------- Parallax Standard C_File ----------------------------
  2.       C_File: hotspot.c
  3.       
  4.       Purpose: This file contains the source code for the main
  5.                window procedure for the Eroica hotspot application.
  6.               
  7. --------------------------------------------------------------------------------
  8.           Copyright (c)1997 Parallax Software , All rights reserved.            
  9. ------------------------------------------------------------------------------*/
  10.  
  11. #pragma warning ( disable:4115 )       /* type name definition in parenthesis */
  12. #pragma warning ( disable:4201 )       /* nonstandard extension used: nameless struct/union */
  13. #pragma warning ( disable:4214 )       /* nonstandard extension used: bit field types other than int */
  14. #pragma warning ( disable:4514 )       /* unreferenced inline/local function has been removed */
  15.  
  16. #include <windows.h>
  17. #include <ddeml.h>
  18. #include <stdlib.h>
  19. #include <string.h>
  20. #include <mmsystem.h>
  21. #include <malloc.h>
  22. #ifdef _WIN32
  23. #include <shellapi.h>
  24. #endif
  25.  
  26. #include "hotspot.h"
  27.  
  28.  
  29. #define APPMUTEXNAME   "EroicaHotspotSampleModule"
  30.  
  31. #ifdef _WIN32
  32.  
  33. #define STRNCAT( a,b,c )    strncat( (LPSTR)(a), (LPSTR)(b), c )
  34. #define STRCAT( a,b )       strcat( (LPSTR)(a), (LPSTR)(b) )
  35. #define STRRCHR(a,b)        strrchr( (LPSTR)(a), (int)(b) )
  36. #define STRLEN(a)           strlen( (LPSTR)(a))
  37. #define STRCPY(a,b)         strcpy( (LPSTR)(a), (LPSTR)(b) )
  38. #define STRNCPY(a,b,c)      strncpy((LPSTR)(a), (LPSTR)(b), (size_t)(c))
  39. #define STRNCMP(a,b,c)      strncmp((LPSTR)(a), (LPSTR)(b), (size_t)(c))
  40. #define STRICMP(a,b  )      stricmp((LPSTR)(a), (LPSTR)(b))
  41. #define STRSTR(a,b)         strstr((LPSTR)(a), (LPSTR)(b))
  42.  
  43. #else
  44.  
  45. #define STRNCAT( a,b,c )    _fstrncat( (LPSTR)(a), (LPSTR)(b), c )
  46. #define STRCAT( a,b )       _fstrcat( (LPSTR)(a), (LPSTR)(b) )
  47. #define STRRCHR(a,b)        _fstrrchr( (LPSTR)(a), (int)(b) )
  48. #define STRLEN(a)           _fstrlen( (LPSTR)(a))
  49. #define STRCPY(a,b)         _fstrcpy( (LPSTR)(a), (LPSTR)(b) )
  50. #define STRNCPY(a,b,c)      _fstrncpy((LPSTR)(a), (LPSTR)(b), (size_t)(c))
  51. #define STRNCMP(a,b,c)      _fstrncmp((LPSTR)(a), (LPSTR)(b), (size_t)(c))
  52. #define STRICMP(a,b)        _fstricmp((LPSTR)(a), (LPSTR)(b))
  53. #define STRSTR(a,b)         _fstrstr((LPSTR)(a), (LPSTR)(b))
  54.  
  55. #endif
  56.  
  57. /* global variables */
  58. HANDLE ghInst      = NULL;           /* handle to this instance                   */
  59. HWND   ghWndMain   = NULL;           /* handle to main window                     */
  60. HCONV  ghConv = NULL;                 /* handle to DDE conversation     */
  61. DWORD  idInst = 0L;                  /* instance identifier */
  62. HSZ    ghszTopic;
  63. HSZ    ghszServer;
  64. HSZ    hszServerBase = NULL;
  65. HSZ    hszServerInst;
  66. LPSTR  gCmdLine;
  67.  
  68. /* callback global variables */
  69. int         done = 0;
  70. HDDEDATA    hDataXact = NULL;
  71. DWORD       dwXactID;
  72. int         dataLen = MAX_DATA;
  73. char        *pStr = NULL;
  74.  
  75.  
  76. /* Local messages */
  77. #define WM_HOTSPOT_MSG         (WM_USER + 1)
  78.  
  79.  
  80. /* ========================================= Parallax C Function ==================
  81.  
  82.    @Name: HandleHotspot
  83.    @Desc: 
  84.  
  85. ============================================================================== */
  86.  
  87. void HandleHotspot( LPSTR pData )
  88. {
  89.    HCONV hCmdConv;
  90.  
  91.    if ( pData == NULL ) {
  92.       return;
  93.    }
  94.    /* Parse the data into lines of DDE commands to be issued */
  95.  
  96.    while ( *pData != 0 ) {
  97.       int   len;
  98.       char  c;
  99.  
  100.       /* find length of current line */
  101.  
  102.       len = 0;
  103.       c = pData[len];
  104.       while ( c != 0 && c != '\n' && c != '\r' ) {
  105.          c = pData[ ++len ];
  106.       }
  107.  
  108.       if ( len != 0 ) {
  109.          pData[ len ] = 0;  /* terminate the line */
  110.  
  111.          if ( pData[0] == '#' ) {
  112.             /* echo text */
  113.             MessageBox( NULL, &pData[1], "Hotspot Message", MB_APPLMODAL | MB_ICONINFORMATION | MB_OK );
  114.          } else if ( pData[0] == '>' ) {
  115.             /* execute line */
  116.             WinExec( &pData[1], SW_SHOWNORMAL );
  117.          } else {
  118.             /* DDE command */
  119.             DdeClientTransaction( pData, (WORD)(len+1), ghConv, NULL, CF_TEXT, XTYP_EXECUTE, SYNCTIMEOUT, 0);
  120.          }
  121.  
  122.          /* fixup the end of line */
  123.          pData[len] = c; 
  124.          pData += len;
  125.       }
  126.  
  127.       if ( c != 0 ) {
  128.          /* ignore end of line character */
  129.          pData++; 
  130.       }
  131.    }
  132. }
  133.  
  134. /* ========================================= Parallax C Function ==================
  135.  
  136.    @Name: HandleHotspot0
  137.    @Desc: 
  138.  
  139. ============================================================================== */
  140.  
  141. void HandleHotspot0( LPSTR pData )
  142. {
  143.    HCONV    hCmdConv;
  144.  
  145.    /* Connect conversation */
  146.    hCmdConv = DdeConnect( idInst, ghszServer, ghszTopic, (LPVOID)NULL);
  147.    if ( hCmdConv == NULL ) {
  148.       goto cleanup;
  149.    }
  150.  
  151.    /* Locate data field */
  152.    if ( pData == NULL ) {
  153.       goto cleanup;
  154.    }
  155.  
  156.    /* Parse the data into lines of hotspot commands to be issued */
  157.    while ( *pData != 0 ) {
  158.       LPSTR    pArg, pArgEnd;
  159.       int      len;
  160.       char     c;
  161.  
  162.       /* find length of current line */
  163.  
  164.       len = 0;
  165.       c = pData[len];
  166.       while ( c != 0 && c != '\n' && c != '\r' ) {
  167.          c = pData[ ++len ];
  168.       }
  169.       pData[ len ] = 0;  /* terminate the line */
  170.       pArg = pData;
  171.       while ( *pArg != 0 && *pArg != '(' ) {
  172.          pArg++;
  173.       }
  174.       if ( *pArg == 0 ) {
  175.          pArg = NULL;
  176.       }
  177.  
  178.       if ( len > 0 ) {
  179.          pArgEnd = &pData[len-1];
  180.          while ( *pArgEnd != 0 && *pArgEnd != ')' ) {
  181.             pArgEnd--;
  182.          }
  183.          if ( *pArgEnd == 0 ) {
  184.             pArgEnd = NULL;
  185.          }
  186.       } else {
  187.          pArgEnd = NULL;
  188.       }
  189.  
  190.       if ( pData[0] == '[' && pArg != NULL && pArgEnd != NULL ) {
  191.  
  192.          *pArg = 0;    /* terminate the command */
  193.          *pArgEnd = 0; /* terminate the args */
  194.  
  195.          if ( STRNCMP( &pData[1], "echo", 4 ) == 0 ) {
  196.             /* echo text */
  197.             MessageBox( NULL, &pArg[1], "Hotspot Message", MB_APPLMODAL | MB_ICONINFORMATION | MB_OK );
  198.          } else if ( STRNCMP( &pData[1], "execute", 7 ) == 0 ) {
  199.             /* execute line */
  200.             WinExec( &pArg[1], SW_SHOWNORMAL );
  201.          } else if ( STRNCMP( &pData[1], "view", 4 ) == 0 ) {
  202.             /* DDE command */
  203.             char     ddecmd[60];
  204.             DWORD    result;
  205.  
  206.             wsprintf( ddecmd, "[OpenDocWin(0,0,\"%s\",\"\",0,0,0)]", &pArg[1] );
  207.             DdeClientTransaction( ddecmd, (WORD)STRLEN(ddecmd)+1, hCmdConv, NULL, CF_TEXT, XTYP_EXECUTE, SYNCTIMEOUT, &result);
  208.          }
  209.  
  210.          *pArg = '(';
  211.          *pArgEnd = ')';
  212.       }
  213.  
  214.       /* fixup the end of line */
  215.       pData[ len ] = c; 
  216.       pData += len;
  217.  
  218.       if ( c != 0 ) {
  219.          /* ignore end of line character */
  220.          pData++; 
  221.       }
  222.  
  223.    }
  224.  
  225. cleanup:
  226.    if ( hCmdConv != NULL ) {
  227.       DdeDisconnect( hCmdConv );
  228.    }
  229. }
  230.  
  231.  
  232. #ifdef _WIN32
  233.  
  234. #define MYWM_NOTIFYICON        (WM_USER + 2)
  235. #define IDM_TOOLMENU_CLOSE     (WM_USER + 3)
  236.  
  237.  
  238. /*========================================= Parallax C function ==================
  239.   @Name     : _CreateContextMenu
  240.   @Class    : static
  241.   @Synopsis : Creates the popup menu 
  242.   @Return   : handle of the created menu or NULL if fails
  243. ==============================================================================*/
  244.  
  245. static HMENU _CreateContextMenu( void ) 
  246. {
  247.     HMENU hm = CreatePopupMenu() ;
  248.  
  249.     if ( hm ) {
  250.        AppendMenu( hm, MF_STRING, IDM_TOOLMENU_CLOSE, "&Close" ) ;
  251.     }
  252.  
  253.     return ( hm ) ;
  254. } /* _CreateContextMenu() */
  255.  
  256. /*========================================= Parallax C function ==================
  257.   @Name     : On_MYWM_NOTIFYICON 
  258.   @Class    : static
  259.   @Synopsis : Handles messages from the taskbar icon
  260. ==============================================================================*/
  261.  
  262. static void On_MYWM_NOTIFYICON(WPARAM wParam, LPARAM lParam)
  263. {
  264.    UINT     uID = (UINT) wParam;
  265.    UINT     uMouseMsg = (UINT)lParam;
  266.    HMENU    hpopup = (HMENU)NULL ;
  267.  
  268.    if (uMouseMsg == WM_RBUTTONDOWN) {
  269.       hpopup = _CreateContextMenu() ;
  270.       if ( hpopup ) {
  271.          RECT  gMousePos;  
  272.  
  273.          SystemParametersInfo(SPI_GETWORKAREA, 0, &gMousePos, 0);
  274.          TrackPopupMenu( hpopup, TPM_RIGHTALIGN, gMousePos.right - 10, gMousePos.bottom - 30, 0, ghWndMain, NULL ) ;
  275.          DestroyMenu( hpopup ) ;
  276.       }
  277.    }
  278. }
  279. #endif
  280.  
  281. /* ========================================= Parallax C Function ==================
  282.  
  283.    @Name: MainWndProc
  284.    @Desc: 
  285.  
  286. ============================================================================== */
  287.  
  288. long FAR PASCAL MainWndProc(HWND hWnd, unsigned msg, WORD wParam, LONG lParam)
  289. {
  290.    static FARPROC  lpfnDdeCallBack;
  291.  
  292.    switch ( msg ) {
  293.  
  294.       case WM_CREATE:
  295.          /* poll out once a second to see if Eroica is active */
  296.          SetTimer( hWnd, 1, 1000, NULL );
  297.  
  298.          /* Ddeml initialization */
  299.          lpfnDdeCallBack = MakeProcInstance((FARPROC)DdeCallBack, ghInst);
  300.          if ( DdeInitialize( &idInst, (PFNCALLBACK)lpfnDdeCallBack, APPCMD_CLIENTONLY, 0L ) ) {
  301.             return(FALSE);
  302.          }
  303.          /* Topic Name.... */
  304.          ghszTopic = DdeCreateStringHandle(idInst, (LPSTR)"imaging", CP_WINANSI);
  305.  
  306.          /* Server Name..... */
  307.          ghszServer = DdeCreateStringHandle(idInst, (LPSTR)"Eroica", CP_WINANSI);
  308.  
  309.          pStr = (char*)malloc( dataLen );
  310.  
  311. #ifdef _WIN32
  312.          {
  313.             BOOL              res;
  314.             NOTIFYICONDATA    tnid;
  315.             HICON             hicon = LoadIcon(ghInst, "MAINICON");
  316.             
  317.             /* create the icon */
  318.             tnid.cbSize = sizeof(NOTIFYICONDATA);
  319.             tnid.hWnd = hWnd;
  320.             tnid.uID = 777; /* identifier */
  321.             tnid.uFlags = NIF_MESSAGE|NIF_ICON|NIF_TIP;
  322.             tnid.uCallbackMessage = MYWM_NOTIFYICON;
  323.             tnid.hIcon = hicon;
  324.             lstrcpyn(tnid.szTip,"Sample Hotspot Dispatcher",26);
  325.             res = Shell_NotifyIcon(NIM_ADD,&tnid);
  326.             if (hicon) {
  327.                DestroyIcon(hicon);
  328.             }
  329.          }
  330. #endif
  331.          break;
  332.  
  333.       case WM_TIMER:
  334.          if ( ghConv == NULL ) {
  335.             ghConv = DdeConnect( idInst, ghszServer, ghszTopic, (LPVOID)NULL);
  336.             if ( ghConv ) {
  337.                IMG_NotifyHotSpot( ghConv );
  338.             }
  339.          }
  340.          break;
  341.  
  342.       case WM_SYSCOMMAND:
  343.          switch ( wParam & 0xFFF0 ) {
  344.             case SC_MAXIMIZE:
  345.             case SC_RESTORE:
  346.                return( 0 );
  347.          }
  348.          break;
  349.  
  350.      case WM_DESTROY:
  351. #ifdef _WIN32
  352.          {
  353.             BOOL              res;
  354.             NOTIFYICONDATA    tnid;
  355.             
  356.             tnid.cbSize = sizeof(NOTIFYICONDATA);
  357.             tnid.hWnd = hWnd;
  358.             tnid.uID = 777; /* identifier */
  359.             res = Shell_NotifyIcon(NIM_DELETE,&tnid);
  360.          }
  361. #endif
  362.          if ( pStr != NULL ) {
  363.             free( pStr );
  364.             pStr = NULL;
  365.          }
  366.          DdeFreeStringHandle( idInst, ghszTopic );
  367.          DdeFreeStringHandle( idInst, ghszServer );
  368.          DdeFreeStringHandle( idInst, hszServerBase );
  369.          /* terminate all DDE conversations */
  370.          DdeUninitialize(idInst);
  371.          FreeProcInstance(lpfnDdeCallBack);
  372.          PostQuitMessage(0);
  373.          break;
  374.  
  375.       case WM_HOTSPOT_MSG:
  376.          {
  377.             char  *szHotspotData = (char *)(UINT) lParam;
  378.  
  379.             HandleHotspot( szHotspotData );
  380.             free( szHotspotData );
  381.          }
  382.          break;
  383.  
  384. #ifdef _WIN32
  385.       case MYWM_NOTIFYICON:
  386.          On_MYWM_NOTIFYICON(wParam, lParam);
  387.          break;
  388.  
  389.       case WM_COMMAND:
  390.          /* IDM_TOOLMENU_CLOSE */
  391.          SendMessage( ghWndMain, WM_CLOSE, 0, 0 ); 
  392.          break;
  393.  
  394. #endif
  395.    }
  396.  
  397.    return (DefWindowProc(hWnd, msg, wParam, lParam));
  398.  
  399. }
  400.  
  401. /* ========================================= Parallax C Function ==================
  402.  
  403.    @Name: WinMain
  404.    @Desc: 
  405.  
  406. ============================================================================== */
  407. #ifdef _WIN32
  408. int APIENTRY WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow) 
  409. #else
  410. int PASCAL WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow) 
  411. #endif
  412. {
  413.    MSG            msg;
  414.    static char    szMainMenu[]   = "MainMenu";
  415.    static char    szMainClass[]  = "HotspotClass";
  416.    BOOL           fail = FALSE;
  417.  
  418.  
  419. #if defined( _WIN32 )
  420.    HANDLE  hMutex;
  421.  
  422.    hMutex = CreateMutex( NULL, FALSE, APPMUTEXNAME );
  423.    if ( GetLastError() == ERROR_ALREADY_EXISTS ) {
  424.       fail = TRUE;
  425.    }
  426. #else
  427.    if ( hPrevInstance ) {
  428.      fail = TRUE;
  429.    }
  430. #endif
  431.  
  432.    if ( fail ) {
  433.      MessageBox( NULL, "Hotspot Sample is already running", "Hotspot Sample error", MB_ICONSTOP );
  434.      return( 0 );
  435.    }
  436.  
  437.    gCmdLine = lpszCmdLine;
  438.    if (nCmdShow); /* swallow arg */
  439.  
  440.    /* register class */
  441.    if ( !hPrevInstance ) {
  442.       WNDCLASS    wc;
  443.  
  444.       wc.style = 0;
  445.       wc.lpfnWndProc = (WNDPROC)MainWndProc;
  446.       
  447.       wc.cbClsExtra = 0;
  448.       wc.cbWndExtra = 0;
  449.       wc.hInstance = hInstance;
  450.       wc.hIcon = LoadIcon(hInstance, "MAINICON");
  451.       wc.hCursor = LoadCursor(NULL, IDC_ARROW);
  452.       wc.hbrBackground = GetStockObject( WHITE_BRUSH );
  453.       wc.lpszMenuName = szMainMenu;
  454.       wc.lpszClassName = szMainClass;
  455.  
  456.       if (!RegisterClass(&wc)) {
  457.          return( FALSE );
  458.       }
  459.    }
  460.  
  461.    ghInst = hInstance;
  462.  
  463. #ifdef _WIN32
  464.    ghWndMain = CreateWindow(szMainClass,
  465.                             "HOTSPOT",
  466.                             WS_EX_TOOLWINDOW | WS_CLIPCHILDREN,
  467.                             CW_USEDEFAULT,
  468.                             CW_USEDEFAULT,
  469.                             CW_USEDEFAULT,
  470.                             CW_USEDEFAULT,
  471.                             NULL,
  472.                             NULL,
  473.                             hInstance, 
  474.                             NULL);
  475. #else
  476.    ghWndMain = CreateWindow(szMainClass,
  477.                             "HOTSPOT",
  478.                             WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN,
  479.                             CW_USEDEFAULT,
  480.                             CW_USEDEFAULT,
  481.                             CW_USEDEFAULT,
  482.                             CW_USEDEFAULT,
  483.                             NULL,
  484.                             NULL,
  485.                             hInstance, 
  486.                             NULL);
  487. #endif
  488.  
  489.    if (!ghWndMain ) {
  490.       return (FALSE);
  491.    }
  492.  
  493. #ifdef _WIN32
  494.    ShowWindow(ghWndMain, SW_SHOWMINNOACTIVE);
  495.    ShowWindow(ghWndMain, SW_HIDE);
  496. #else
  497.    ShowWindow(ghWndMain, SW_SHOWMINNOACTIVE);
  498. #endif
  499.    UpdateWindow(ghWndMain);
  500.  
  501.    while ( GetMessage((LPMSG)&msg, NULL, 0, 0) ) {
  502.       TranslateMessage(&msg);      
  503.       DispatchMessage(&msg);       
  504.    }
  505.  
  506.    return (msg.wParam);      
  507.  
  508. /* ========================================= Parallax C Function ==================
  509.  
  510.    @Name: DdeCallBack
  511.    @Desc: 
  512.  
  513. ============================================================================== */
  514.  
  515. HOTSPOT_EPOINT (HDDEDATA) DdeCallBack(WORD wType, WORD wFmt, HCONV hConv, HSZ hsz1, HSZ hsz2, HDDEDATA hData, DWORD dwData1, DWORD dwData2)
  516. {
  517.    int   nbytes;
  518.  
  519.    /* unused formal parms */
  520.    dwData2;
  521.    wFmt;
  522.  
  523.    switch ( wType ) {
  524.  
  525.       case XTYP_ADVDATA:
  526.          nbytes = (int)DdeGetData( hData, NULL, 0, 0 );
  527.          if ( nbytes > dataLen ) {
  528.             char*    pTmp = (char*)realloc( pStr, nbytes );
  529.  
  530.             if ( pTmp != NULL ) {
  531.                pStr = pTmp;
  532.                dataLen = nbytes;
  533.             }
  534.          }
  535.  
  536.          if (DdeGetData( hData, pStr, dataLen, 0 ) > 0) {
  537.             char  item[80];
  538.  
  539.             /* get the topic from the transaction record. */
  540.             if (DdeQueryString( idInst, hsz2, item, 80, CP_WINANSI ) != 0)  {
  541.                if (STRICMP( item, "NotifyIM -- HSAActivated" ) == 0)  {
  542.                   /* if this is an HSA class activation, handle separately. */
  543.                   if (pStr) {
  544.                      HandleHotspot0( pStr );
  545.                   }
  546.                } else if (STRICMP( item, "NotifyIM -- HotSpotActivated" ) == 0)  {
  547.                   /* if this is a regular hotspot activation, handle it. */
  548.                   LPSTR pData = STRSTR( pStr, "(DATA)" );
  549.                   if ( pData != NULL ) {
  550.                      char  *szHotspotData;
  551.  
  552.                      pData += strlen( "(DATA)" );
  553.                      if ((szHotspotData = malloc( STRLEN( pData ) )) != NULL) {
  554.                         STRCPY( szHotspotData, pData );
  555.                         PostMessage( ghWndMain, WM_HOTSPOT_MSG, 0, (long)(UINT) szHotspotData );
  556.                      }
  557.                   }
  558.                }
  559.             }
  560.          }
  561.          break;
  562.  
  563.       case XTYP_REGISTER:
  564.          DdeKeepStringHandle(idInst, hsz1);
  565.          DdeKeepStringHandle(idInst, hsz2);
  566.  
  567.          hszServerBase = hsz1;
  568.          hszServerInst = hsz2;
  569.  
  570.          return (HDDEDATA)NULL;
  571.  
  572.       case XTYP_XACT_COMPLETE:
  573.          {
  574.             DWORD  buf_size;
  575.             LPSTR  img_buf;
  576.             PSTR   pimg_buf;
  577.  
  578.             if (dwXactID == dwData1) {
  579.                hDataXact = hData;
  580.                if (hDataXact) {
  581.                   buf_size = DdeGetData( hDataXact, (void FAR *)NULL, 0, 0L);
  582.                   buf_size++;
  583.                   pimg_buf = (PSTR)malloc( (WORD)buf_size );
  584.                   img_buf = (LPSTR)pimg_buf;
  585.                   if (img_buf) {
  586.                      DdeGetData( hDataXact, (LPSTR)img_buf, buf_size, 0L);
  587.                      free( pimg_buf );
  588.                   }
  589.                }
  590.                done = 1;
  591.             }
  592.          }
  593.          break;
  594.  
  595.       case XTYP_UNREGISTER:
  596.          return (HDDEDATA)NULL;
  597.  
  598.       case XTYP_DISCONNECT:
  599.          IMG_NotifyHotSpotStop( ghConv );
  600.          DdeDisconnect( ghConv );
  601.          ghConv = NULL;
  602.          if (!STRICMP( gCmdLine, "AUTOSTOP" )) {
  603.             PostMessage( ghWndMain, WM_CLOSE, 0, 0L );
  604.          }
  605.          return (HDDEDATA)NULL;
  606.  
  607.       default:
  608.          return (HDDEDATA)NULL;
  609.  
  610.    } 
  611.  
  612.    return (HDDEDATA)NULL;
  613. }    
  614.  
  615.  
  616. /* ========================================= Parallax C Function ==================
  617.  
  618.    @Name: IMG_NotifyHotSpot
  619.    @Desc: 
  620.  
  621. ============================================================================== */
  622.  
  623. int IMG_NotifyHotSpot( HCONV hConv )
  624. {
  625.    DWORD    result = 0;
  626.    HSZ      hszString;
  627.  
  628.    if ( hConv == NULL ) {
  629.       return( FALSE );
  630.    }
  631.  
  632.    hszString = DdeCreateStringHandle(idInst, "NotifyIM -- HotSpotActivated", CP_WINANSI);
  633.    DdeClientTransaction( NULL, 0, hConv, hszString, CF_TEXT, XTYP_ADVSTART, SYNCTIMEOUT, (DWORD FAR *)&result );
  634.    DdeFreeStringHandle( idInst, hszString );
  635.  
  636.    if ( result == DDE_FACK )  {
  637.       hszString = DdeCreateStringHandle(idInst, "NotifyIM -- HSAActivated", CP_WINANSI);
  638.       DdeClientTransaction( NULL, 0, hConv, hszString, CF_TEXT, XTYP_ADVSTART, SYNCTIMEOUT, (DWORD FAR *)&result );
  639.       DdeFreeStringHandle( idInst, hszString );
  640.       if ( result == DDE_FACK ) {
  641.          return( TRUE );
  642.       }
  643.    }
  644.    return( FALSE );
  645. }
  646.  
  647.  
  648.  
  649. /* ========================================= Parallax C Function ==================
  650.  
  651.    @Name: IMG_NotifyHotSpotStop
  652.    @Desc: 
  653.  
  654. ============================================================================== */
  655.  
  656. int IMG_NotifyHotSpotStop( HCONV hConv )
  657. {
  658.    DWORD    result = 0;
  659.    HSZ      hszString;
  660.  
  661.    if ( hConv == NULL ) {
  662.       return( FALSE );
  663.    }
  664.  
  665.    hszString = DdeCreateStringHandle(idInst, "NotifyIM -- HotSpotActivated", CP_WINANSI);
  666.    DdeClientTransaction( NULL, 0, hConv, hszString, CF_TEXT, XTYP_ADVSTOP, SYNCTIMEOUT, (DWORD FAR *)&result );
  667.    DdeFreeStringHandle( idInst, hszString );
  668.  
  669.    if ( result == DDE_FACK )  {
  670.       hszString = DdeCreateStringHandle(idInst, "NotifyIM -- HSAActivated", CP_WINANSI);
  671.       DdeClientTransaction( NULL, 0, ghConv, hszString, CF_TEXT, XTYP_ADVSTOP, SYNCTIMEOUT, (DWORD FAR *)&result );
  672.       DdeFreeStringHandle( idInst, hszString );
  673.       if ( result == DDE_FACK )  {
  674.          return( TRUE );
  675.       }
  676.    }
  677.    return( FALSE );
  678. }
  679.  
  680.  
  681. /* HOTSPOT.C */
  682. /* end of file */
  683.  
  684.  
  685.