SkinBase.h
上传用户:weijiexitu
上传日期:2007-01-18
资源大小:54k
文件大小:7k
源码类别:

菜单

开发平台:

WINDOWS

  1. // SkinBase.h: interface for the CSkinBase class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #if !defined(AFX_SKINBASE_H__D53DE9FD_C2BF_49DB_8B16_4F7874CA2579__INCLUDED_)
  5. #define AFX_SKINBASE_H__D53DE9FD_C2BF_49DB_8B16_4F7874CA2579__INCLUDED_
  6. #if _MSC_VER > 1000
  7. #pragma once
  8. #endif // _MSC_VER > 1000
  9. #include <Mmsystem.h>
  10. #pragma comment(lib, "winmm.lib") // for PlaySound
  11. // os
  12. enum
  13. {
  14. SBOS_95,
  15. SBOS_98,
  16. SBOS_ME,
  17. SBOS_NT4,
  18. SBOS_2K,
  19. SBOS_XP,
  20. SBOS_XPP, // after xp
  21. };
  22. // for transparency
  23. typedef WINGDIAPI BOOL (WINAPI *PFNTRANSPARENTBLT)(HDC,int,int,int,int,HDC,int,int,int,int,UINT);
  24. // for gradient fill
  25. typedef WINGDIAPI BOOL (WINAPI *PFNGRADIENTFILL)(HDC,PTRIVERTEX,ULONG,PVOID,ULONG,ULONG);
  26. class CSkinBase
  27. {
  28. public:
  29. CSkinBase();
  30. virtual ~CSkinBase();
  31. // helper methods
  32. static BOOL FontIsPresent(LPCTSTR szFaceName);
  33. static int GetOS();
  34. static HRGN BitmapToRegion(CBitmap* pBmp, COLORREF cTransparentColor);
  35. static HMENU MakeMenuCopy(const CMenu* pSrc);
  36. static BOOL CopyBitmap(const CBitmap* pSrc, CBitmap* pDest);
  37. static BOOL CopyMenu(const CMenu* pSrc, CMenu* pDest);
  38. static BOOL ExtractResource(UINT nID, LPCTSTR szType, CString& sTempFilePath, HINSTANCE hInst = NULL);
  39. static CWnd* GetChildWnd(CWnd* pParent, LPCTSTR szClass, int nID = -1);
  40. static CString GetTipText(LPCTSTR szText, BOOL bToolbar);
  41. static BOOL ConvertToGrayScale(CBitmap* pBitmap, COLORREF crMask);
  42. static BOOL DoSysMenu(CWnd* pWnd, CPoint ptCursor, LPRECT prExclude = NULL, BOOL bCopy = FALSE);
  43. static void InitSysMenu(CMenu* pMenu, CWnd* pWnd);
  44. static HICON GetWindowIcon(CWnd* pWnd);
  45. static COLORREF BlendColors(COLORREF crA, COLORREF crB, float fAmountA = 0.5f);
  46. static COLORREF VaryColor(COLORREF crColor, float fFactor);
  47. // special blt functions which handle transparency
  48. static BOOL BitBlt(CDC* pDCDest, 
  49. int nXOriginDest, int nYOriginDest, int nWidthDest, int hHeightDest,
  50. CDC* pDCSrc, int nXOriginSrc, int nYOriginSrc, 
  51. UINT uROP = SRCCOPY,     
  52. COLORREF crTransparent = -1);
  53. static BOOL StretchBlt(CDC* pDCDest, 
  54. int nXOriginDest, int nYOriginDest, int nWidthDest, int hHeightDest,
  55. CDC* pDCSrc, int nXOriginSrc, int nYOriginSrc, int nWidthSrc, int nHeightSrc,     
  56. UINT uROP = SRCCOPY,     
  57. COLORREF crTransparent = -1);
  58. // gradient fill from top->bottom or left->right
  59. static BOOL GradientFill(CDC* pDCDest, LPRECT lpRect, COLORREF crFrom, COLORREF crTo, BOOL bHorz);
  60. // returns the actual text height
  61. static int FormatText(CDC* pDC, CString& sText, CRect& rect, UINT uDTFlags);
  62. static CSize GetTextExtent(CDC* pDC, LPCTSTR szText); // takes & into account
  63. static void EnableTheming(BOOL bEnable); // under xp
  64. static BOOL IsThemingEnabled() { return s_bThemingEnabled; }
  65. static BOOL CreateThemeManifest(LPCTSTR szName, LPCTSTR szDescription);
  66. private:
  67. static int s_nOSVer;
  68. static BOOL s_bSupportsFastTransparentBlt;
  69. static PFNTRANSPARENTBLT s_pfnFastTransparentBlt;
  70. static BOOL s_bSupportsFastGradientFill;
  71. static PFNGRADIENTFILL s_pfnFastGradientFill;
  72. static BOOL s_bThemingEnabled;
  73. static BOOL SupportsFastTransparentBlt();
  74. static BOOL TransparentBltFast(CDC* pDCDest, 
  75. int nXOriginDest, int nYOriginDest, int nWidthDest, int hHeightDest,
  76. CDC* pDCSrc, 
  77. int nXOriginSrc, int nYOriginSrc, int nWidthSrc, int nHeightSrc,     
  78. UINT crTransparent);
  79. static BOOL SupportsFastGradientFill();
  80. static BOOL GradientFillFast(CDC* pDCDest, LPRECT lpRect, COLORREF crFrom, COLORREF crTo, BOOL bHorz);
  81. // fallbacks for win9x
  82. static BOOL TransparentBltSlow(CDC* pDCDest, 
  83. int nXOriginDest, int nYOriginDest, int nWidthDest, int hHeightDest,
  84. CDC* pDCSrc, 
  85. int nXOriginSrc, int nYOriginSrc, int nWidthSrc, int nHeightSrc,     
  86. UINT crTransparent);
  87. static BOOL GradientFillSlow(CDC* pDCDest, LPRECT lpRect, COLORREF crFrom, COLORREF crTo, BOOL bHorz);
  88. static BOOL TransparentBlt(CDC* pDCDest, 
  89. int nXOriginDest, int nYOriginDest, int nWidthDest, int hHeightDest,
  90. CDC* pDCSrc, 
  91. int nXOriginSrc, int nYOriginSrc, int nWidthSrc, int nHeightSrc,     
  92. UINT crTransparent);
  93. };
  94. // helper structs
  95. enum
  96. {
  97. IM_HOT,
  98. IM_COLD,
  99. IM_DOWN,
  100. IM_DISABLED,
  101. IM_LAST
  102. };
  103. struct ImageInfo
  104. {
  105. ImageInfo()
  106. Reset();
  107. }
  108. ImageInfo(int nIm)
  109. Reset();
  110. nImage[IM_HOT] = nIm; 
  111. }
  112. int GetImage(int nType, BOOL bWrap = TRUE)
  113. {
  114. if (nType < IM_HOT || nType >= IM_LAST)
  115. return -1;
  116. switch (nType)
  117. {
  118. case IM_HOT:
  119. return nImage[IM_HOT];
  120. default:
  121. return (!bWrap || nImage[nType] != -1) ? nImage[nType] : nImage[IM_HOT];
  122. }
  123. }
  124. void Reset()
  125. {
  126. for (int nIm = 0; nIm < IM_LAST; nIm++) 
  127. nImage[nIm] = -1; 
  128. }
  129. int nImage[IM_LAST];
  130. };
  131. enum
  132. {
  133. SND_ON,
  134. SND_OFF,
  135. SND_CLICK,
  136. SND_LAST
  137. };
  138. struct SoundInfo
  139. {
  140. SoundInfo()
  141. Reset();
  142. }
  143. void SetSounds(UINT uSoundIDs[SND_LAST])
  144. {
  145. Reset();
  146. for (int nSnd = 0; nSnd < SND_LAST; nSnd++) 
  147. uSoundID[nSnd] = uSoundIDs[nSnd]; 
  148. }
  149. void SetSounds(CString sSoundPaths[SND_LAST])
  150. {
  151. Reset();
  152. for (int nSnd = 0; nSnd < SND_LAST; nSnd++) 
  153. sSoundPath[nSnd] = sSoundPaths[nSnd]; 
  154. }
  155. BOOL PlaySound(int nType)
  156. {
  157. #ifdef _USRDLL
  158. // If this is a DLL, need to set up MFC state
  159. AFX_MANAGE_STATE(AfxGetStaticModuleState());
  160. #endif
  161. UINT uFlags = SND_ASYNC | SND_NODEFAULT;
  162. // try to play the filename
  163. if (!sSoundPath[nType].IsEmpty() && sndPlaySound(sSoundPath[nType], uFlags))
  164. return TRUE;
  165. // else try to play an embedded sound
  166. CString sSoundFile;
  167. if (uSoundID[nType] && 
  168. (CSkinBase::ExtractResource(uSoundID[nType], "WAVE", sSoundFile) ||
  169. CSkinBase::ExtractResource(uSoundID[nType], "WAV", sSoundFile)))
  170. {
  171. if (sndPlaySound(sSoundFile, uFlags))
  172. {
  173. // cache pathname 
  174. sSoundPath[nType] = sSoundFile;
  175. uSoundID[nType] = 0;
  176. return TRUE;
  177. }
  178. }
  179. return FALSE;
  180. }
  181. BOOL PlaySoundWrap(int nType)
  182. {
  183. if (!PlaySound(nType))
  184. {
  185. // try the others
  186. switch (nType)
  187. {
  188. case SND_ON:
  189. return (PlaySound(SND_OFF) || PlaySound(SND_CLICK));
  190. case SND_OFF:
  191. return (PlaySound(SND_ON) || PlaySound(SND_CLICK));
  192. case SND_CLICK:
  193. return (PlaySound(SND_ON) || PlaySound(SND_OFF));
  194. default:
  195. return FALSE;
  196. }
  197. }
  198. return TRUE;
  199. }
  200. void Reset()
  201. {
  202. for (int nSnd = 0; nSnd < SND_LAST; nSnd++) 
  203. {
  204. uSoundID[nSnd] = 0; 
  205. sSoundPath[nSnd].Empty(); 
  206. }
  207. }
  208. UINT uSoundID[SND_LAST];
  209. CString sSoundPath[SND_LAST];
  210. };
  211. struct FontInfo
  212. {
  213. FontInfo(LPCTSTR szName = NULL, int nSize = 0, LPCTSTR szPath = NULL)
  214. { sFaceName = szName; sFilePath = szPath; nPointSize = nSize; 
  215. nHeight = 0; bBold = bItalic = bUnderline = FALSE; }
  216. CString sFaceName;
  217. CString sFilePath; // ttf file
  218. int nPointSize; // point sizes may be different for different fonts
  219. int nHeight; // in pixels
  220. BOOL bBold;
  221. BOOL bItalic;
  222. BOOL bUnderline;
  223. };
  224. #endif // !defined(AFX_SKINBASE_H__D53DE9FD_C2BF_49DB_8B16_4F7874CA2579__INCLUDED_)