/* * NineGrid bitmap rendering (ported from UxTheme) */ #ifndef DUI_UTIL_NINEGRID_H_INCLUDED #define DUI_UTIL_NINEGRID_H_INCLUDED #pragma once namespace DirectUI { //--------------------------------------------------------------------------- //#include "uxtheme.h" // need MARGINS struct from here typedef struct _MARGINS { int cxLeftWidth; // width of left border that retains its size int cxRightWidth; // width of right border that retains its size int cyTopHeight; // height of top border that retains its size int cyBottomHeight; // height of bottom border that retains its size } MARGINS, *PMARGINS; //#include "tmschema.h" // need SIZINGTYPE, VALIGN, HALIGN enums from here enum SIZINGTYPE { ST_TRUESIZE, ST_STRETCH, ST_TILE, ST_TILEHORZ, ST_TILEVERT, ST_TILECENTER }; enum HALIGN { HA_LEFT, HA_CENTER, HA_RIGHT }; enum VALIGN { VA_TOP, VA_CENTER, VA_BOTTOM }; //--------------------------------------------------------------------------- #ifndef HEIGHT #define HEIGHT(rc) ((rc).bottom - (rc).top) #endif //--------------------------------------------------------------------------- #ifndef WIDTH #define WIDTH(rc) ((rc).right - (rc).left) #endif //--------------------------------------------------------------------------- enum MBSIZING { MB_COPY, MB_STRETCH, MB_TILE }; //------------------------------------------------------------------------------------ struct BRUSHBUFF { int iBuffLen; BYTE *pBuff; }; //--------------------------------------------------------------------------- struct MBINFO { DWORD dwSize; // size of this struct (versioning support) HDC hdcDest; HDC hdcSrc; RECT rcClip; // don't draw outside this rect HBITMAP hBitmap; //---- for quick tiling ---- BRUSHBUFF *pBrushBuff; //---- options ---- DWORD dwOptions; // subset DrawNineGrid() option flags POINT ptTileOrigin; // for MBO_TILEORIGIN BITMAPINFOHEADER *pbmHdr; // for MBO_DIRECTBITS BYTE *pBits; // for MBO_DIRECTBITS COLORREF crTransparent; // for MBO_TRANSPARENT _BLENDFUNCTION AlphaBlendInfo; // for MBO_ALPHABLEND HBRUSH *pCachedBrushes; // for DNG_CACHEBRUSHES int iCacheIndex; // which brush to use }; //--------------------------------------------------------------------------- //---- DrawNineGrid() "dwOptions" bits ---- //---- shared with MultiBlt() ---- #define DNG_ALPHABLEND (1 << 0) // use AlphaBlendInfo #define DNG_TRANSPARENT (1 << 1) // transparancy defined by crTransparent #define DNG_TILEORIGIN (1 << 2) // use ptTileOrigin #define DNG_DIRECTBITS (1 << 3) // use pbmHdr & pBits #define DNG_CACHEBRUSHES (1 << 4) // use/set pCachedBrushes #define DNG_MANUALTILING (1 << 5) // loop thru BitBlt's #define DNG_DIRECTBRUSH (1 << 6) // create brushes from temp. extracted DIB's #define DNG_FLIPGRIDS (1 << 7) // all grid images should be flipped //---- used only by DrawNineGrid() ---- #define DNG_OMITBORDER (1 << 16) // don't draw border #define DNG_OMITCONTENT (1 << 17) // don't draw middle #define DNG_SOLIDBORDER (1 << 18) // sample borders and draw as solid colors #define DNG_SOLIDCONTENT (1 << 19) // sample content as draw as solid color #define DNG_BGFILL (1 << 20) // use crFill for ST_TRUESIZE //------------------------------------------------------------------------------------ struct NGINFO { DWORD dwSize; // size of this struct (versioning support) HDC hdcDest; RECT rcClip; // don't draw outside this rect SIZINGTYPE eImageSizing; HBITMAP hBitmap; RECT rcSrc; // where to get bits from RECT rcDest; // where to draw bits to int iDestMargins[4]; int iSrcMargins[4]; //---- for quick tiling ---- BRUSHBUFF *pBrushBuff; //---- options ---- DWORD dwOptions; POINT ptTileOrigin; // for DNG_TILEORIGIN BITMAPINFOHEADER *pbmHdr; // for DNG_DIRECTBITS BYTE *pBits; // for DNG_DIRECTBITS COLORREF crTransparent; // for DNG_TRANSPARENT _BLENDFUNCTION AlphaBlendInfo; // for DNG_ALPHABLEND HBRUSH *pCachedBrushes; // for DNG_CACHEBRUSHES COLORREF *pcrBorders; // for DNG_SOLIDBORDERS, DNG_SOLIDCONTENT //---- for ST_TRUESIZE images smaller than rcDest ---- COLORREF crFill; VALIGN eVAlign; HALIGN eHAlign; }; //--------------------------------------------------------------------------- HRESULT MultiBlt(MBINFO *pmb, MBSIZING eSizing, int iDestX, int iDestY, int iDestW, int iDestH, int iSrcX, int iSrcY, int iSrcW, int iSrcH); HRESULT DrawNineGrid(NGINFO *png); //--------------------------------------------------------------------------- } // namespace DirectUI #endif // DUI_UTIL_NINEGRID_H_INCLUDED