home *** CD-ROM | disk | FTP | other *** search
/ Monster Media 1994 #1 / monster.zip / monster / PROG_C / CENVIW9.ZIP / CLIPBRD.LIB < prev    next >
Text File  |  1994-03-08  |  5KB  |  130 lines

  1. // ClibBrd.lib - Functions for reading from and writing
  2. // ver.1         to the Windows clipboard.
  3. //
  4. // This library provides the following routines:
  5. // 1) GetClipboardData(ClipboardDataFormat[,ClipboardDataSize])
  6. //     Copy data from the clipnoard, where:
  7. //       ClipboardDataFormat - one of the following data types
  8.             #define CF_TEXT             1
  9.             #define CF_BITMAP           2
  10.             #define CF_METAFILEPICT     3
  11.             #define CF_SYLK             4
  12.             #define CF_DIF              5
  13.             #define CF_TIFF             6
  14.             #define CF_OEMTEXT          7
  15.             #define CF_DIB              8
  16.             #define CF_PALETTE          9
  17.             #define CF_OWNERDISPLAY     0x0080
  18.             #define CF_DSPTEXT          0x0081
  19.             #define CF_DSPBITMAP        0x0082
  20.             #define CF_DSPMETAFILEPICT  0x0083
  21. //       ClipboardDataSize - sets to the size of data returned; optional
  22. //       Returns: NULL if no data in clipboard or not of correct type, else
  23. //                returns data in buffer or BLOb of size ClipboardDataSize
  24. //
  25. // 2) PutClipboardData(ClipboardData,ClipboardDataSize,ClipboardDataFormat)
  26. //     Copy data to the clipboard, where:
  27. //       ClipboardData - buffer or BLOb of data to copy to the clipboard.
  28. //                       If this is NULL then clipboard is emptied.
  29. //       ClipboardDataSize - size of data in ClipboardData, if this is zero
  30. //                           then the clipboard is emptied
  31. //       ClipboardDataFormat - one of the data types #define'ed above
  32. //       Returns: True if data successfully copied, else False
  33.  
  34. GetClipboardData(ClipboardDataFormat,ClipboardDataSize)
  35. {
  36.    _clipData = NULL; // assume failure
  37.    if ( OpenClipboard() ) {   
  38.       // get clipboard text memory handle
  39.       if ( _clipDataHandle = DynamicLink("USER","GETCLIPBOARDDATA",UWORD16,PASCAL,ClipboardDataFormat) ) {
  40.          // lock the global memory
  41.          if ( _clipDataPtr = DynamicLink("KERNEL","GLOBALLOCK",UWORD32,PASCAL,_clipDataHandle) ) {
  42.             if ( _clipDataSize = DynamicLink("KERNEL","GLOBALSIZE",UWORD32,PASCAL,_clipDataHandle) ) {
  43.                _clipData = peek(_clipDataPtr,_clipDataSize);
  44.                if ( 1 < va_arg() )
  45.                   ClipboardDataSize = _clipDataSize;
  46.             }
  47.             // free the global memory now that we're done with it
  48.             DynamicLink("KERNEL","GLOBALUNLOCK",SWORD16,PASCAL,_clipDataHandle);
  49.          }
  50.       }
  51.       CloseClipboard();
  52.    }
  53.    return( _clipData );
  54. }
  55.  
  56. PutClipboardData(ClipboardData,ClipboardDataSize,ClipboardDataFormat)
  57. {
  58.    bool PutClipSuccess = FALSE;  // assume failure
  59.    if ( NULL == ClipboardData  ||  0 == ClipboardDataSize ) {
  60.       // no data to put, so only needed to empty clipboard
  61.       _clipDataHandle = NULL;
  62.       PutClipSuccess = TRUE;
  63.    } else {
  64.       // allocate and fill a memory handle with this data
  65.       #define GMEM_MOVEABLE 0x0002
  66.       #define GMEM_ZEROINIT 0x0040
  67.       if ( _clipDataHandle = DynamicLink("KERNEL","GLOBALALLOC",UWORD16,PASCAL,
  68.                                          GMEM_MOVEABLE | GMEM_ZEROINIT,
  69.                                          HiWord(ClipboardDataSize),LoWord(ClipboardDataSize)) ) {
  70.          _clipDataPtr = DynamicLink("KERNEL","GLOBALLOCK",UWORD32,PASCAL,_clipDataHandle);
  71.          poke(_clipDataPtr,ClipboardData,ClipboardDataSize);
  72.          DynamicLink("KERNEL","GLOBALUNLOCK",SWORD16,PASCAL,_clipDataHandle);
  73.          PutClipSuccess = TRUE;
  74.       }
  75.    }
  76.    if ( OpenClipboard() ) {
  77.       // empty clipboard of its current contents
  78.       DynamicLink("USER","EMPTYCLIPBOARD",SWORD16,PASCAL);
  79.       // give memory handle to the clipboard
  80.       if ( NULL != _clipDataHandle )
  81.          DynamicLink("USER","SETCLIPBOARDDATA",UWORD16,PASCAL,ClipboardDataFormat,_clipDataHandle);
  82.       CloseClipboard();
  83.    } else
  84.       PutClipSucces = FALSE;
  85.    return PutClipSuccess;
  86. }
  87.  
  88. /******* ROUTINES USED BY THE ABOVE FUNCTIONS *******/
  89.  
  90. LoWord(dword)
  91. {
  92.    return dword & 0xFFFF
  93. }
  94.  
  95. HiWord(dword)
  96. {
  97.    return (dword >> 16) & 0xFFFF
  98. }
  99.  
  100. // make sure clipboard gets closed before we exit
  101.  
  102.    ClipboardIsOpen = FALSE;
  103.    atexit("CloseClipboardIfOpen");
  104.  
  105.    CloseClipboardIfOpen()
  106.    {
  107.       if ( ClipboardIsOpen )
  108.          CloseClipboard();
  109.    }
  110.  
  111. OpenClipboard()
  112. {
  113.    assert( !ClipboardIsOpen );
  114.    MultiTask(FALSE);
  115.    ClipboardIsOpen = DynamicLink("USER","OPENCLIPBOARD",SWORD16,PASCAL,
  116.                                  ScreenHandle());
  117.    if ( !ClipboardIsOpen )
  118.       MultiTask(TRUE);
  119.    return ClipboardIsOpen ;
  120. }
  121.  
  122. CloseClipboard()
  123. {
  124.    assert( ClipboardIsOpen );
  125.    ClipboardIsOpen = FALSE;
  126.    assert( DynamicLink("USER","CLOSECLIPBOARD",SWORD16,PASCAL) );
  127.    MultiTask(TRUE);
  128. }
  129.  
  130.