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