home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1997 May / Pcwk0597.iso / borland / cb / setup / cbuilder / data.z / DISPDIB.H < prev    next >
C/C++ Source or Header  |  1997-02-28  |  11KB  |  279 lines

  1. #pragma option -b
  2. /****************************************************************************/
  3. /*                                                                          */
  4. /*        DISPDIB.H - Include file for DisplayDib() function.               */
  5. /*                                                                          */
  6. /*        Note: You must include WINDOWS.H before including this file.      */
  7. /*                                                                          */
  8. /*        Copyright (c) 1990-1995, Microsoft Corp.  All rights reserved.    */
  9. /*                                                                          */
  10. /****************************************************************************/
  11.  
  12. // DisplayDib() error return codes
  13. #define DISPLAYDIB_NOERROR          0x0000  // success
  14. #define DISPLAYDIB_NOTSUPPORTED     0x0001  // function not supported
  15. #define DISPLAYDIB_INVALIDDIB       0x0002  // null or invalid DIB header
  16. #define DISPLAYDIB_INVALIDFORMAT    0x0003  // invalid DIB format
  17. #define DISPLAYDIB_INVALIDTASK      0x0004  // not called from current task
  18. #define DISPLAYDIB_STOP             0x0005  // stop requested
  19. #define DISPLAYDIB_NOTACTIVE        0x0006  // DisplayDibWindow not foreground
  20. #define DISPLAYDIB_BADSIZE          0x0007  //
  21.  
  22. // flags for <wFlags> parameter of DisplayDib()
  23. #define DISPLAYDIB_NOPALETTE        0x0010  // don't set palette
  24. #define DISPLAYDIB_NOCENTER         0x0020  // don't center image
  25. #define DISPLAYDIB_NOWAIT           0x0040  // don't wait before returning
  26. #define DISPLAYDIB_NOIMAGE          0x0080  // don't draw image
  27. #define DISPLAYDIB_ZOOM2            0x0100  // stretch by 2
  28. #define DISPLAYDIB_DONTLOCKTASK     0x0200  // don't lock current task
  29. #define DISPLAYDIB_TEST             0x0400  // testing the command
  30. #define DISPLAYDIB_NOFLIP           0x0800  // dont page flip
  31. #define DISPLAYDIB_BEGIN            0x8000  // start of multiple calls
  32. #define DISPLAYDIB_END              0x4000  // end of multiple calls
  33.  
  34. #define DISPLAYDIB_MODE             0x000F  // mask for display mode
  35. #define DISPLAYDIB_MODE_DEFAULT     0x0000  // default display mode
  36. #define DISPLAYDIB_MODE_320x200x8   0x0001  // 320-by-200
  37. #define DISPLAYDIB_MODE_320x240x8   0x0005  // 320-by-240
  38.  
  39. //
  40. // a Win32 app must use the window class the function
  41. // versions are not available
  42. //
  43. #ifndef _WIN32
  44.  
  45. // function prototypes
  46. UINT FAR PASCAL DisplayDib(LPBITMAPINFOHEADER lpbi, LPSTR lpBits, WORD wFlags);
  47. UINT FAR PASCAL DisplayDibEx(LPBITMAPINFOHEADER lpbi, int x, int y, LPSTR lpBits, WORD wFlags);
  48.  
  49. #define DisplayDibBegin() DisplayDib(NULL, NULL, DISPLAYDIB_BEGIN|DISPDIB_NOWAIT)
  50. #define DisplayDibEnd()   DisplayDib(NULL, NULL, DISPLAYDIB_END|DISPDIB_NOWAIT)
  51.  
  52. #endif
  53.  
  54. //
  55. //  DisplayDibWindow class.
  56. //
  57. //  simple interface to DISPDIB as a window class.
  58. //  draw images and create a fullscreen window in one easy step.
  59. //
  60. //  advantages over calling the APIs directly.
  61. //
  62. //      if you show the window it will handle enabling/disabling
  63. //      fullscreen mode when it has a activation.
  64. //
  65. //      while in fullscreen mode, window will be sized to
  66. //      cover entire display preventing other apps from getting
  67. //      clicked on. (when visible)
  68. //
  69. //      if window looses activation, fullscreen mode will be disabled
  70. //      DDM_DRAW will return DISPLAYDIB_NOTACTIVE if you try to draw
  71. //
  72. //      forwards all mouse and keyboard events to owner, easy way
  73. //      to take over entire screen.
  74. //
  75. //      alows interop with a Win32 application (via WM_COPYDATA)
  76. //      NOTE WM_COPYDATA does not actualy copy anything if the
  77. //      window belongs to the calling thread.  it will do a copy
  78. //      if the window is owned by another thread....
  79. //
  80. //  you can use a DisplayDibWindow in two ways.....
  81. //
  82. //      hidden window
  83. //
  84. //          if the window is hidden, you must use the
  85. //          DDM_BEGIN and DDM_END message to enable/disable
  86. //          fullscreen mode manualy when your app is activated deactivated.
  87. //
  88. //      visible toplevel window
  89. //
  90. //          if you show the window it will take over the entire screen
  91. //          and forward all mouse/keyboard input to its owner.
  92. //
  93. //          it will enter fullscreen automaticly when it is shown.
  94. //
  95. //          it will leave fullscreen and hide it self it another app
  96. //          grabs the focus.
  97. //
  98. //  class name:     "DisplayDibWindow"
  99. //                  class is registered when DISPDIB.DLL is loaded.
  100. //                  as a global class.
  101. //
  102. //  messages:
  103. //
  104. //      DDM_SETFMT  set new DIB format or program a new palette
  105. //
  106. //            fullscreen mode, will use best mode
  107. //                  for displaying the passed DIB format.
  108. //            defaul is 320x240x8 tripple buffered
  109. //
  110. //                  the palette will be programed with the color
  111. //                  table of the passed BITMAPINFOHEADER.
  112. //
  113. //                  the format is a BITMAPINFOHEADER followed by a color table.
  114. //
  115. //                  you must set a format before doing a begin, end or draw
  116. //                  you can set a 320x200 or a 320x24 mode by selecting
  117. //                  a DIB of the format you want.
  118. //
  119. //                  if you do a setfmt while fullscreen mode is active only the
  120. //                  the palette will be changed the new size (if any) wont
  121. //                  happen until the next begin.
  122. //
  123. //        wParam = 0
  124. //          lParam = LPBITMAPINFOHEADER
  125. //
  126. //          returns 0 if success else DISPLAYDIB_* error code.
  127. //
  128. //      DDM_DRAW    draws DIB data to fullscreen
  129. //                  format is assumed the same as format passed to
  130. //                  DDM_BEGIN or DDM_FMT
  131. //
  132. //          wParam = flags
  133. //          lParam = bits pointer.
  134. //
  135. //          returns 0 if success else DISPLAYDIB_* error code.
  136. //
  137. //      DDM_CLOSE   destroy window *and* free the DLL
  138. //
  139. //      DDM_BEGIN   enter DISPDIB mode.
  140. //          wParam = flags
  141. //          lParam = 0
  142. //
  143. //          returns 0 if success else DISPLAYDIB_* error code.
  144. //
  145. //      DDM_END     leave DISPDIB mode.
  146. //          wParam = flags
  147. //          lParam = 0
  148. //
  149. //          returns 0 if success else DISPLAYDIB_* error code.
  150. //
  151. //      WM_COPYDATA allows a Win32 app to send a DDM_ message, that requires
  152. //      a pointer.
  153. //
  154. //          wParam = hwnd of sender
  155. //          lParam = PCOPYDATASTRUCT
  156. //                  dwData      - LOWORD: DDM_* message value.
  157. //                  dwData      - HIWORD: wParam for message
  158. //                  lpData      - lParam (pointer to a BITMAPINFOHEADER or bits)
  159. //                  cbData      - size of data
  160. //
  161. //          returns   0 if success else DISPLAYDIB_* error code.
  162. //
  163.  
  164. #define DISPLAYDIB_WINDOW_CLASS     "DisplayDibWindow"
  165. #define DISPLAYDIB_DLL              "DISPDIB.DLL"
  166.  
  167. #define DDM_SETFMT      WM_USER+0
  168. #define DDM_DRAW        WM_USER+1
  169. #define DDM_CLOSE       WM_USER+2
  170. #define DDM_BEGIN       WM_USER+3
  171. #define DDM_END         WM_USER+4
  172.  
  173. //
  174. // inline function to send a message to a DisplayDibWindow
  175. //
  176. static __inline UINT DisplayDibWindowMessage(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam, DWORD cbSize)
  177. {
  178. #if defined(_WIN32) || defined(WIN32)
  179.         COPYDATASTRUCT cds;
  180.         cds.dwData = MAKELONG(msg, wParam);
  181.         cds.cbData = lParam ? cbSize : 0;
  182.         cds.lpData = (LPVOID)lParam;
  183.         return (UINT)SendMessage(hwnd, WM_COPYDATA, (WPARAM)(HWND)NULL, (LPARAM)(LPVOID)&cds);
  184. #else
  185.         return (UINT)SendMessage(hwnd, msg, wParam, lParam);
  186. #endif
  187. }
  188.  
  189. //
  190. // inline function to create a DisplayDibWindow
  191. //
  192. static __inline HWND DisplayDibWindowCreateEx(HWND hwndParent, HINSTANCE hInstance, DWORD dwStyle)
  193. {
  194. #if defined(_WIN32) || defined(WIN32)
  195.     DWORD show = 2;
  196.     DWORD zero = 0;
  197.     LPVOID params[4] = {NULL, &zero, &show, 0};
  198.  
  199.     if ((UINT)LoadModule(DISPLAYDIB_DLL, ¶ms) < (UINT)HINSTANCE_ERROR)
  200.         return NULL;    // loading DISPDIB did not work
  201. #else
  202.     if ((UINT)LoadLibrary(DISPLAYDIB_DLL) < (UINT)HINSTANCE_ERROR)
  203.         return NULL;    // loading DISPDIB did not work
  204. #endif
  205.  
  206.     return CreateWindow(DISPLAYDIB_WINDOW_CLASS,"",dwStyle,0, 0,
  207.             GetSystemMetrics(SM_CXSCREEN),GetSystemMetrics(SM_CYSCREEN),
  208.             hwndParent, NULL,
  209.             (hInstance ? hInstance : GetWindowInstance(hwndParent)), NULL);
  210. }
  211.  
  212. //
  213. //  helper macros for a DisplayDibWindow
  214. //
  215. //  DisplayDibWindowCreate
  216. //
  217. //      used to create a toplevel WS_POPUP window.
  218. //
  219. //  DisplayDibWindowCreateEx
  220. //
  221. //      used to create a non-toplevel window, of a custom style.
  222. //
  223. //  DisplayDibWindowSetFmt
  224. //
  225. //      macro to send the DDM_SETFMT message.
  226. //
  227. //  DisplayDibWindowDraw
  228. //
  229. //      macro to send the DDM_DRAW message
  230. //
  231. //  DisplayDibWindowBegin
  232. //
  233. //      macro used to show the window
  234. //
  235. //  DisplayDibWindowEnd
  236. //
  237. //      macro used to hide the window
  238. //
  239. //  DisplayDibWindowBeginEx
  240. //
  241. //      macro used to send a DDM_BEGIN message, used with hidden windows
  242. //
  243. //  DisplayDibWindowEndEx
  244. //
  245. //      macro used to send a DDM_END message, used with hidden windows
  246. //
  247. //  DisplayDibWindowClose
  248. //
  249. //      macro used to send a DDM_CLOSE message
  250. //      this will destroy the window and free the DLL.
  251. //
  252. //  NOTES
  253. //      warning DisplayDibWindowBegin/End will show the DisplayDibWindow
  254. //      this will steal actiation away from your app. all mouse keyboard
  255. //      input will go to the dispdib window and it will forward it to
  256. //      its owner (make sure you set the right owner on create)
  257. //
  258. //      this may cause a problem for your app, you can keep the window
  259. //      hidden be using the DDM_BEGIN/END messages in this case.
  260. //
  261. #define DisplayDibWindowCreate(hwndP, hInstance)        DisplayDibWindowCreateEx(hwndP, hInstance, WS_POPUP)
  262. #define DisplayDibWindowSetFmt(hwnd, lpbi)              DisplayDibWindowMessage(hwnd, DDM_SETFMT, 0, (LPARAM)(LPVOID)(lpbi), sizeof(BITMAPINFOHEADER) + 256 * sizeof(RGBQUAD))
  263. #define DisplayDibWindowDraw(hwnd, flags, bits, size)   DisplayDibWindowMessage(hwnd, DDM_DRAW, (WPARAM)(UINT)(flags), (LPARAM)(LPVOID)(bits), (DWORD)(size))
  264.  
  265. #ifdef __cplusplus
  266. #define DisplayDibWindowBegin(hwnd)                     ::ShowWindow(hwnd, SW_SHOWNORMAL)
  267. #define DisplayDibWindowEnd(hwnd)                       ::ShowWindow(hwnd, SW_HIDE)
  268. #define DisplayDibWindowBeginEx(hwnd, f)                ::SendMessage(hwnd, DDM_BEGIN, (WPARAM)(UINT)(f), 0)
  269. #define DisplayDibWindowEndEx(hwnd)                     ::SendMessage(hwnd, DDM_END, 0, 0)
  270. #define DisplayDibWindowClose(hwnd)                     ::SendMessage(hwnd, DDM_CLOSE, 0, 0)
  271. #else
  272. #define DisplayDibWindowBegin(hwnd)                     ShowWindow(hwnd, SW_SHOWNORMAL)
  273. #define DisplayDibWindowEnd(hwnd)                       ShowWindow(hwnd, SW_HIDE)
  274. #define DisplayDibWindowBeginEx(hwnd)                   SendMessage(hwnd, DDM_BEGIN, 0, 0)
  275. #define DisplayDibWindowEndEx(hwnd)                     SendMessage(hwnd, DDM_END, 0, 0)
  276. #define DisplayDibWindowClose(hwnd)                     SendMessage(hwnd, DDM_CLOSE, 0, 0)
  277. #endif
  278. #pragma option -b.
  279.