didevimg.h
上传用户:sycq158
上传日期:2008-10-22
资源大小:15361k
文件大小:13k
源码类别:

游戏

开发平台:

Visual C++

  1. //-----------------------------------------------------------------------------
  2. // File: DIDevImg.h
  3. //
  4. // Desc: Header for CDIDevImage class, which encapsulates methods for drawing
  5. //       device images, callout strings, and object highlights.
  6. //
  7. // This code is provided to aid developers in creating custom interfaces for
  8. // device configuration. The provided interface is flexible enough for most
  9. // situations, but is freely modifyable.
  10. //
  11. // The CDIDevImage class acts as the interface to the UI client, and the 
  12. // exposed public methods should be called by the client to set the drawing
  13. // options and perform renderings. The CDIDIObject class is used as a helper
  14. // class, and the exposed public methods should not be called by client code.
  15. //
  16. // Copyright( c ) Microsoft Corporation. All rights reserved.
  17. //-----------------------------------------------------------------------------
  18. #ifndef __DIDEVIMG_H__
  19. #define __DIDEVIMG_H__
  20. #ifndef DIRECTINPUT_VERSION
  21. #define DIRECTINPUT_VERSION 0x0800
  22. #endif
  23. #include <windows.h>
  24. #include <dinput.h>
  25. #include <d3d9.h>
  26. #include <tchar.h>
  27. // macros
  28. #ifndef SAFE_DELETE
  29. #define SAFE_DELETE(p)  { if(p) { delete (p);     (p)=NULL; } }
  30. #endif //SAFE_DELETE
  31. #ifndef SAFE_DELETE_ARRAY
  32. #define SAFE_DELETE_ARRAY(p)  { if(p) { delete[] (p);     (p)=NULL; } }
  33. #endif //SAFE_DELETE_ARRAY
  34. #ifndef SAFE_RELEASE
  35. #define SAFE_RELEASE(p) { if(p) { (p)->Release(); (p)=NULL; } }
  36. #endif //SAFE_RELEASE
  37. // global constants
  38. #define DIDICONST_MAX_IMAGE_WIDTH                 1024
  39. #define DIDICONST_MAX_IMAGE_HEIGHT                1024
  40. #define DIDICONST_CUSTOM_VIEW_WIDTH                400
  41. #define DIDICONST_CUSTOM_VIEW_HEIGHT               300
  42. // SetCalloutState flags
  43. #define DIDICOS_HIGHLIGHTED                 0x00000001
  44. #define DIDICOS_INVISIBLE                   0x00000002
  45. #define DIDICOS_TOOLTIP                     0x00000004
  46. // SetOutputImageSize flags
  47. #define DIDISOIS_DEFAULT                    0x00000000
  48. #define DIDISOIS_RESIZE                     0x00000001
  49. #define DIDISOIS_MAINTAINASPECTUSINGWIDTH   0x00000002
  50. #define DIDISOIS_MAINTAINASPECTUSINGHEIGHT  0x00000004
  51. // Possible render targets
  52. enum DIDIRENDERTARGET
  53. {
  54.     DIDIRT_SURFACE,
  55.     DIDIRT_DC
  56. };
  57. // Custom HRESULTs
  58. #define DI_IMAGENOTFOUND     
  59.     MAKE_HRESULT(0, FACILITY_WIN32, ERROR_FILE_NOT_FOUND)
  60. // Forward references
  61. class CDIDIObject;
  62. typedef TCHAR MAXSTRING[MAX_PATH];
  63. //-----------------------------------------------------------------------------
  64. // Name: CDIDevImage
  65. // Desc: Handles device image drawing 
  66. //-----------------------------------------------------------------------------
  67. class CDIDevImage
  68. {
  69. public:
  70.     // __________________________
  71.     // Constructors / Destructors
  72.     CDIDevImage();
  73.     ~CDIDevImage();
  74.     // ______________
  75.     // Public Methods
  76.     HRESULT Init( LPDIRECTINPUTDEVICE8 pDID );
  77.     HRESULT SetCalloutState( DWORD dwObjId, DWORD dwCalloutState );
  78.     HRESULT GetCalloutState( DWORD dwObjId, LPDWORD pdwCalloutState );
  79.     HRESULT SetCalloutColors( DWORD dwObjId, COLORREF crColorNormal, COLORREF crColorHigh );
  80.     HRESULT GetCalloutColors( DWORD dwObjId, LPCOLORREF pcrColorNormal, LPCOLORREF pcrColorHigh );
  81.     HRESULT SetCalloutText( DWORD dwObjId, LPCTSTR strText );
  82.     HRESULT GetCalloutText( DWORD dwObjId, LPTSTR strText, DWORD dwSize );
  83.     HRESULT GetObjFromPoint( POINT Pt, LPDWORD pdwObjId );
  84.     HRESULT SetActiveView( DWORD dwView );
  85.     HRESULT GetActiveView( LPDWORD pdwView, LPDWORD pdwNumViews = NULL );
  86.     HRESULT GetViewForObj( DWORD dwObjId, LPDWORD pdwView );
  87.     HRESULT SetOutputImageSize( DWORD dwWidth, DWORD dwHeight, DWORD dwFlags );
  88.     HRESULT SetFont( HFONT hFont );
  89.     HRESULT SetColors( D3DCOLOR Background, COLORREF crCalloutNormal, COLORREF crCalloutHigh );
  90.     HRESULT Render( LPDIRECT3DTEXTURE9 pTexture );
  91.     HRESULT RenderToDC( HDC hDC );
  92.     friend BOOL CALLBACK EnumDeviceObjectsCB( LPCDIDEVICEOBJECTINSTANCE lpddoi, LPVOID pvRef );
  93. protected:
  94.     // _________________
  95.     // Protected Methods
  96.     VOID    CleanUp();
  97.     HRESULT LoadImageInfo( LPDIRECTINPUTDEVICE8 pDIDevice );
  98.     HRESULT RenderToTarget( LPVOID pvTarget, DIDIRENDERTARGET eTarget );
  99.     HRESULT RenderCustomToTarget( LPVOID pvTarget, DIDIRENDERTARGET eTarget );
  100.     HRESULT CreateCustomImageInfo( LPDIRECTINPUTDEVICE8 pDIDevice );
  101.     HRESULT LoadImages();
  102.     HRESULT BuildCustomUI();
  103.     HRESULT CreateScaledSurfaceCopy( LPDIRECT3DSURFACE9 pSurfaceSrc, DWORD dwWidthSrc, DWORD dwHeightSrc, 
  104.                                      FLOAT fxScale, FLOAT fyScale, LPDIRECT3DSURFACE9 *ppSurfaceDest );
  105.     VOID    CreateFont();
  106.     VOID    DestroyImages();
  107.     HRESULT GetCustomUISize( SIZE* pSize );
  108.     HRESULT AddObject( DWORD dwID );
  109.     CDIDIObject* GetObject( DWORD dwID );
  110.     // _________________
  111.     // Protected Members
  112.     BOOL                     m_bInitialized;    // Init method has been successfully run
  113.     BOOL                     m_bCustomUI;       // ImageInfo not found. UI is built by program
  114.     BOOL                     m_bInvalidUI;      // The custom UI needs to be recreated
  115.     MAXSTRING*               m_atszImagePath;   // Array of MAXSTRING strings for background images
  116.     HBITMAP*                 m_ahImages;        // Array of pointers to background bitmaps
  117.     DWORD                    m_dwActiveView;    // Index of the currently active view
  118.     DWORD                    m_dwNumViews;      // Total number of views for this devic3    
  119.     
  120.     D3DCOLOR                 m_BkColor;         // Background color for main device image
  121.     HFONT                    m_hFont;           // Font to be used when drawing all text
  122.     
  123.     CDIDIObject**            m_apObject;        // Array of pointers to CDIDIObject data objects
  124.     DWORD                    m_dwNumObjects;    // Total number of objects
  125.     
  126.     DWORD                    m_dwWidthPref;     // User-set preferred width
  127.     DWORD                    m_dwHeightPref;    // User-set preffered height
  128.     DWORD                    m_dwScaleMethod;   // Method to use when scaling to preferred size
  129.                     
  130. };
  131. //-----------------------------------------------------------------------------
  132. // Name: DIDICallout
  133. // Desc: Encapsulates information a specific view callout
  134. //-----------------------------------------------------------------------------
  135. struct DIDICallout
  136. {
  137.     RECT  rcInit;
  138.     RECT  rcScaled;
  139.     POINT aptLineInit[5];
  140.     POINT aptLineScaled[5];
  141.     DWORD dwNumPoints;
  142.     DWORD dwTextAlign;
  143. };
  144. //-----------------------------------------------------------------------------
  145. // Name: DIDIOverlay
  146. // Desc: Encapsulates information a specific view overlay
  147. //-----------------------------------------------------------------------------
  148. struct DIDIOverlay
  149. {
  150.     MAXSTRING strImagePath;
  151.     RECT     rcInit;
  152.     RECT     rcScaled;
  153.     HBITMAP  hImage;
  154. };
  155. //-----------------------------------------------------------------------------
  156. // Name: CDIDIObject
  157. // Desc: Encapsulates information about the device object (axis, button, POV)
  158. //-----------------------------------------------------------------------------
  159. class CDIDIObject
  160. {
  161. public:
  162.     // __________________________
  163.     // Constructors / Destructors
  164.     CDIDIObject( DWORD dwID, DWORD dwNumViews ); 
  165.     ~CDIDIObject();
  166.     // ______________
  167.     // Public Methods
  168.     VOID    SetOverlay( DWORD dwViewID, LPCTSTR tszImagePath, RECT rect );
  169.     VOID    SetCallout( DWORD dwViewID, DWORD dwNumPoints, POINT *aptLine, RECT rect, DWORD dwTextAlign );
  170.     VOID    SetCalloutState( DWORD dwCalloutState ) {m_dwState = dwCalloutState;}
  171.     DWORD   GetCalloutState() {return m_dwState;}
  172.     VOID    SetCalloutColors( COLORREF crColorNormal, COLORREF crColorHigh ) { m_crNormColor = crColorNormal; m_crHighColor = crColorHigh; }
  173.     VOID    GetCalloutColors( LPCOLORREF pcrColorNormal, LPCOLORREF pcrColorHigh ) { if( pcrColorNormal ) *pcrColorNormal = m_crNormColor; if( pcrColorHigh ) *pcrColorHigh = m_crHighColor; }
  174.     VOID    SetCalloutText( LPCTSTR strText );
  175.     VOID    GetCalloutText( LPTSTR strText, DWORD dwSize );
  176.     DWORD   GetID() { return m_dwID; }
  177.     VOID    GetName( LPTSTR strName, DWORD dwSize ) { _tcsncpy( strName, m_strName, dwSize ); }
  178.     VOID    SetName( LPCTSTR strName ) { _tcsncpy( m_strName, strName, MAX_PATH-4 ); }
  179.     VOID    DestroyImages();
  180.     HRESULT AllocateViews( DWORD dwNumViews );
  181.     VOID    ScaleView( DWORD dwViewID, FLOAT fxScale, FLOAT fyScale );
  182.     DIDICallout* GetCallout( DWORD dwViewID ) { return &m_aCallout[dwViewID]; }
  183.     DIDIOverlay* GetOverlay( DWORD dwViewID ) { return &m_aOverlay[dwViewID]; }
  184. private:
  185.     // _______________
  186.     // Private Members
  187.     DWORD         m_dwID;
  188.     MAXSTRING     m_strCallout;
  189.     MAXSTRING     m_strName;
  190.     COLORREF      m_crNormColor;
  191.     COLORREF      m_crHighColor;
  192.     DWORD         m_dwState;
  193.     DWORD         m_dwNumViews;
  194.     DIDICallout  *m_aCallout;
  195.     DIDIOverlay  *m_aOverlay;
  196. };
  197. //-----------------------------------------------------------------------------
  198. // Rendering constants and inline functions
  199. //-----------------------------------------------------------------------------
  200. const DWORD ALPHA_MASK = D3DCOLOR_ARGB(255, 0, 0, 0);
  201. const DWORD RED_MASK   = D3DCOLOR_ARGB(0, 255, 0, 0);
  202. const DWORD GREEN_MASK = D3DCOLOR_ARGB(0, 0, 255, 0);
  203. const DWORD BLUE_MASK  = D3DCOLOR_ARGB(0, 0, 0, 255);
  204. //-----------------------------------------------------------------------------
  205. // Name: GetAlpha, GetRed, GetGreen, GetBlue
  206. // Desc: Extracts the specified color component
  207. //-----------------------------------------------------------------------------
  208. inline BYTE GetAlpha( D3DCOLOR Color ) { return (BYTE)( Color >> 24 ); }
  209. inline BYTE   GetRed( D3DCOLOR Color ) { return (BYTE)( Color >> 16 ); }
  210. inline BYTE GetGreen( D3DCOLOR Color ) { return (BYTE)( Color >> 8  ); }
  211. inline BYTE  GetBlue( D3DCOLOR Color ) { return (BYTE)( Color );       }
  212. //-----------------------------------------------------------------------------
  213. // Name: ColorFromCR
  214. // Desc: Returns a D3DCOLOR from the given COLORREF
  215. //-----------------------------------------------------------------------------
  216. inline D3DCOLOR ColorFromCR( COLORREF cr ) 
  217.     return GetRValue(cr) << 16 | GetGValue(cr) << 8 | GetBValue(cr); 
  218. }
  219. //-----------------------------------------------------------------------------
  220. // Name: CRFromColor
  221. // Desc: Returns a COLORREF from the given D3DCOLOR
  222. //-----------------------------------------------------------------------------
  223. inline COLORREF CRFromColor( D3DCOLOR color ) 
  224.     return GetBlue(color) << 16 | GetGreen(color) << 8 | GetRed(color); 
  225. }
  226. //-----------------------------------------------------------------------------
  227. // Name: ScaleRect
  228. // Desc: Convenience inline function for scaling a RECT structure
  229. //-----------------------------------------------------------------------------
  230. inline VOID ScaleRect( const RECT* pRectSrc, RECT* pRectDest, FLOAT fxScale, FLOAT fyScale )
  231. {
  232.     pRectDest->top    = (LONG) ( fyScale * pRectSrc->top + 0.5 );
  233.     pRectDest->bottom = (LONG) ( fyScale * pRectSrc->bottom + 0.5 );
  234.     pRectDest->left   = (LONG) ( fxScale * pRectSrc->left + 0.5);
  235.     pRectDest->right  = (LONG) ( fxScale * pRectSrc->right + 0.5);
  236. }
  237. //-----------------------------------------------------------------------------
  238. // Name: ScalePoint
  239. // Desc: Convenience inline function for scaling a POINT structure
  240. //-----------------------------------------------------------------------------
  241. inline VOID ScalePoint( const POINT* pPointSrc, POINT* pPointDest, FLOAT fxScale, FLOAT fyScale )
  242. {
  243.     pPointDest->x    = (LONG) ( fxScale * pPointSrc->x + 0.5 );
  244.     pPointDest->y    = (LONG) ( fyScale * pPointSrc->y + 0.5 );
  245. }
  246. //-----------------------------------------------------------------------------
  247. // Helper Functions
  248. // These external functions don't require direct access to the private member
  249. // variables, but are used at one or more points within the class methods.
  250. //-----------------------------------------------------------------------------
  251. HRESULT ApplyOverlay( HBITMAP hbmpDest, CONST RECT* prcDest, HBITMAP hbmpSrc );
  252. HRESULT ApplyAlphaChannel( HBITMAP hbmpDest, HBITMAP hbmpAlpha, BOOL bOpaque );
  253. HRESULT FillBackground( HBITMAP hbmpDest, D3DCOLOR Fill );
  254. HRESULT CreateDIBSectionFromSurface( LPDIRECT3DSURFACE9 pSurface, HBITMAP* phBitmap, SIZE* pSize = NULL ); 
  255. HRESULT RestoreRect( HBITMAP hbmpDest, CONST RECT* prcDest, LPBYTE pSrcPixels );
  256. HRESULT DrawTooltip( HDC hdcRender, HDC hdcAlpha, LPCTSTR strTooltip, RECT* prcBitmap, 
  257.                      RECT* prcTruncated, COLORREF crFore, COLORREF crBack, COLORREF crBorder );
  258. IDirect3DSurface9* GetCloneSurface( int iWidth, int iHeight );
  259. BOOL CALLBACK EnumDeviceObjectsCB( LPCDIDEVICEOBJECTINSTANCE lpddoi, LPVOID pvRef );
  260. #endif  //__DIDEVIMG_H__