Tools.cpp
上传用户:czfddz
上传日期:2013-03-20
资源大小:1517k
文件大小:14k
源码类别:

酒店行业

开发平台:

C/C++

  1. /*########################################################################
  2. Filename:  tools.cpp
  3. ----------------------------------------------------
  4. Remarks: ...
  5. ----------------------------------------------------
  6.   ########################################################################*/
  7. #include "stdafx.h"
  8. #include "resource.h"
  9. #include "tools.h"
  10. #ifdef _DEBUG
  11. #undef THIS_FILE
  12. static char THIS_FILE[]=__FILE__;
  13. #define new DEBUG_NEW
  14. #endif
  15. typedef struct tagCOLOR
  16. {
  17. BYTE blue;
  18. BYTE green;
  19. BYTE red;
  20. BYTE alpha;
  21. }COLOR;
  22. COLORREF WINAPI AlphaBlendColor(COLORREF color, BYTE byAlpha)
  23. {
  24. COLOR *oldcolor = (COLOR*)(&color);
  25. oldcolor->alpha = 0; 
  26. oldcolor->red   = oldcolor->red   * byAlpha / 255;
  27. oldcolor->green = oldcolor->green * byAlpha / 255;
  28. oldcolor->blue  = oldcolor->blue  * byAlpha / 255;
  29. return color;
  30. }
  31. /*===============================================================
  32. 名称: 设置分层窗口透明或半透明属性.
  33. hWnd: 分层窗口句柄.
  34. crKey: 要显示为透明区域的颜色.当dwFlags为LWA_COLORKEY有效.
  35. bAlpha: 窗口的半透明度.当dwFlags为LWA_ALPHA有效.
  36. 说明:   当窗口被设置了WS_EX_LAYERED扩展风格才有效.
  37. =================================================================*/
  38. BOOL SetLayeredWindow(HWND hWnd, COLORREF crKey, BYTE bAlpha, DWORD dwFlags)
  39. {
  40. BOOL bRet = FALSE;
  41. //load USER32.dll-------------------------------------------------
  42. HMODULE hUserDll = NULL;
  43. hUserDll = ::LoadLibrary(_T("USER32.dll"));
  44. // Check that "USER32.dll" library has been loaded successfully...
  45. if (hUserDll != NULL)
  46. {
  47. typedef BOOL (WINAPI* lpfnSetAttributes)(HWND hWnd, COLORREF crKey, BYTE bAlpha, DWORD dwFlags);
  48. lpfnSetAttributes pFnlpfnSetAttributes  = NULL;
  49. pFnlpfnSetAttributes  = (lpfnSetAttributes)GetProcAddress(hUserDll, "SetLayeredWindowAttributes");
  50. if (pFnlpfnSetAttributes )
  51. {
  52. bRet = pFnlpfnSetAttributes(hWnd, crKey, bAlpha, dwFlags);
  53. }
  54. if (hUserDll != NULL) ::FreeLibrary(hUserDll);
  55. return bRet;
  56. /*========================================================================
  57. 说明: 检测系统是否开启了菜单阴影(主要针对于Windows XP, Windows 2003
  58. 及他更高的版本).
  59. ==========================================================================*/
  60. BOOL WINAPI IsShadowEnabled()
  61. {
  62. BOOL bEnabled = FALSE;
  63. if (SystemParametersInfo(SPI_GETDROPSHADOW, 0, &bEnabled, 0))
  64. {
  65. return bEnabled;
  66. }
  67. return FALSE;
  68. }
  69. DWORD WINAPI GetWinVersion()
  70. {
  71.     static DWORD WindowsVer = UnKnowWindowsVer;
  72.     if (WindowsVer != UnKnowWindowsVer)
  73.     {
  74.         return WindowsVer;
  75.     }
  76.     OSVERSIONINFO osvi;
  77.     ZeroMemory(&osvi, sizeof(OSVERSIONINFO));
  78.     osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
  79.     if (!GetVersionEx (&osvi))
  80.     {
  81.         return WindowsVer = UnKnowWindowsVer;
  82.     }
  83.     if (osvi.dwPlatformId == VER_PLATFORM_WIN32s)
  84.     {
  85.         return WindowsVer = Windows32s;
  86.     }
  87.     else if(osvi.dwPlatformId == VER_PLATFORM_WIN32_NT)
  88.     {
  89.         if (osvi.dwMajorVersion == 4L)
  90.         {
  91.             return WindowsVer = WindowsNT4;
  92.         }
  93.         else if (osvi.dwMajorVersion == 5L) 
  94.         {
  95. if (osvi.dwMinorVersion == 0L)
  96. {
  97. return WindowsVer = Windows2000;
  98. }
  99. else if (osvi.dwMinorVersion == 1L)
  100. {
  101. return WindowsVer = WindowsXP;
  102. }
  103. else
  104. {
  105. return WindowsVer = Windows2003;
  106. }
  107.         }
  108.         return WindowsVer = WindowsNT3;
  109.     }
  110.     ASSERT(osvi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS);
  111.     if (osvi.dwMajorVersion == 4L && osvi.dwMinorVersion == 10L)
  112.     {
  113.         return WindowsVer = Windows98;
  114.     }
  115.     if (osvi.dwMajorVersion == 4L && osvi.dwMinorVersion == 90L)
  116.     {
  117.         return WindowsVer = WindowsME;
  118.     }
  119.     return WindowsVer = Windows95;
  120. }
  121. /*========================================================================
  122. 说明: 截取屏幕上指定区域内的图像.
  123. ==========================================================================*/
  124. HBITMAP WINAPI GetScreenBitmap(LPCRECT pRect)
  125. {
  126.     HDC     hDC;
  127.     HDC     hMemDC;
  128.     HBITMAP hNewBitmap = NULL;
  129.     if ((hDC = ::GetDC(NULL)) != NULL )
  130.     {
  131.         if ((hMemDC = ::CreateCompatibleDC(hDC)) != NULL)
  132.         {
  133.             if ((hNewBitmap = ::CreateCompatibleBitmap(hDC, pRect->right - pRect->left, pRect->bottom - pRect->top)) != NULL)
  134.             {
  135.                 HBITMAP hOldBitmap = (HBITMAP)::SelectObject(hMemDC, hNewBitmap);
  136.                 ::BitBlt(hMemDC, 0, 0, pRect->right - pRect->left, pRect->bottom - pRect->top,
  137. hDC, pRect->left, pRect->top, SRCCOPY);
  138.                 ::SelectObject(hMemDC, (HGDIOBJ)hOldBitmap);
  139.             }
  140.             ::DeleteDC(hMemDC);
  141.         }
  142.         ::ReleaseDC(NULL, hDC);
  143.     }
  144.     return hNewBitmap;
  145. }
  146. /*========================================================================
  147. 说明: 指定Windows菜单句柄是否为自画风格菜单.
  148. ==========================================================================*/
  149. BOOL WINAPI IsOwnerDrawMenu(HMENU hMenu)
  150. {
  151.     MENUITEMINFO mii = {sizeof MENUITEMINFO, MIIM_TYPE };
  152.     ::GetMenuItemInfo(hMenu, 0, TRUE, &mii);
  153.     return (mii.fType & MFT_OWNERDRAW) != 0;
  154. }
  155. /*========================================================================
  156. 功能: 创建相应的图像列表所需的图像
  157. -------------------------------------------------------------
  158. hbitmap: 原始位图句柄
  159. crBackColor: 背景色
  160. nstyle: 要创建的图像的风格,它们为下列值之一:
  161. ----------------------------------------------------
  162. - 0: 创建禁止图像列表图像
  163. - 1: 创建正常图像列表图像
  164. - 2: 创建热图像列表图像
  165. ==========================================================================*/
  166. HBITMAP WINAPI CreateImage(HBITMAP hbitmap, int nstyle, BOOL bAlpha, COLORREF crBackColor, COLORREF crMarkColor, BOOL bFillMarkColor)
  167. {
  168. HBITMAP RetBmp = NULL;
  169.     if (hbitmap == NULL)
  170.     {  
  171. return NULL;
  172. }
  173. //源位图DC------------------------------------
  174.     HDC BufferDC = CreateCompatibleDC(NULL);      
  175.     if (BufferDC == NULL)
  176.     {
  177. return NULL;
  178. }
  179.     SelectObject(BufferDC, hbitmap);
  180. //目标DC--------------------------------------
  181.     HDC DirectDC = CreateCompatibleDC(NULL);      
  182.     if (DirectDC == NULL)
  183.     {
  184.   DeleteDC(BufferDC);
  185.   return NULL;
  186. }
  187.     // 获取源位图大小----------------------------
  188.     BITMAP bm;
  189.     GetObject(hbitmap, sizeof(bm), &bm);
  190. // 初始化BITMAPINFO信息----------------------
  191.     BITMAPINFO bitmapinfo; 
  192.     ZeroMemory(&bitmapinfo, sizeof(BITMAPINFO));
  193.     bitmapinfo.bmiHeader.biSize     = sizeof(BITMAPINFOHEADER);
  194.     bitmapinfo.bmiHeader.biWidth    = bm.bmWidth;
  195.     bitmapinfo.bmiHeader.biHeight   = bm.bmHeight;
  196.     bitmapinfo.bmiHeader.biPlanes   = 1;
  197.     bitmapinfo.bmiHeader.biBitCount = 32;
  198. //指向像素区指针--------
  199. BYTE *ptPixels;    
  200.     HBITMAP DirectBitmap = CreateDIBSection(DirectDC, (BITMAPINFO*)&bitmapinfo, 
  201.                                   DIB_RGB_COLORS, (void**)&ptPixels, NULL, 0);
  202. //背景颜色--------------
  203. BYTE oldRed   = GetRValue(crBackColor);
  204. BYTE oldGreen = GetGValue(crBackColor);
  205. BYTE oldBlue  = GetBValue(crBackColor);
  206. //透明色----------------
  207. BYTE markRed   = GetRValue(crMarkColor);
  208. BYTE markGreen = GetGValue(crMarkColor);
  209. BYTE markBlue  = GetBValue(crMarkColor);
  210. BYTE temp = 0;
  211. COLOR* ptPixel = (COLOR*)ptPixels;
  212.     if (DirectBitmap != NULL)
  213.     {
  214.         HGDIOBJ oldObject = SelectObject(DirectDC, DirectBitmap);
  215.         BitBlt(DirectDC, 0, 0, bm.bmWidth, bm.bmHeight, BufferDC, 0, 0, SRCCOPY);
  216. register int nbitcount = (bm.bmWidth * bm.bmHeight * 4);
  217.         for (register int i = 0; i < nbitcount;  i += 4)
  218.         {
  219. //透明区(alpha == 0)----------------------------------
  220. if (( bAlpha && ptPixel->alpha == 0) 
  221. ||  (!bAlpha && ptPixel->red   == markRed //red
  222.  && ptPixel->green == markGreen //green
  223.  && ptPixel->blue  == markBlue //blue
  224. )
  225.    ) 
  226. {
  227. if (bFillMarkColor)
  228. {
  229. ptPixel->blue  = 255;
  230. ptPixel->green = 0;
  231. ptPixel->red   = 255;
  232. }
  233. else
  234. {
  235. ptPixel->blue  = oldRed;
  236. ptPixel->green = oldGreen;
  237. ptPixel->red   = oldBlue;
  238. }
  239. }
  240. else 
  241. {
  242. //灰度化位图--------------------------------------
  243. if (nstyle == 0 )
  244. {
  245. temp = (BYTE)(ptPixel->red * 0.299 + ptPixel->green * 0.587 + ptPixels[i] * 0.114);
  246. temp = (BYTE)(255 - (255 - temp) * 0.8); 
  247. ptPixel->red = ptPixel->green = ptPixels[i] = temp;
  248. }
  249. //淡化位图----------------------------------------
  250. else if (nstyle == 2)
  251. {
  252. ptPixel->red   = (BYTE)(255 - (255 - ptPixel->red)   * 0.9); 
  253. ptPixel->green = (BYTE)(255 - (255 - ptPixel->green) * 0.9); 
  254. ptPixel->blue  = (BYTE)(255 - (255 - ptPixel->blue)  * 0.9); 
  255. }
  256. //Alpha混合(Alpha blend)---------------------------
  257. if (bAlpha)
  258. {
  259. ptPixel->red   = (oldRed   * (255 - ptPixel->alpha) + ptPixel->red   * ptPixel->alpha) / 255; 
  260. ptPixel->green = (oldGreen * (255 - ptPixel->alpha) + ptPixel->green * ptPixel->alpha) / 255; 
  261. ptPixel->blue  = (oldBlue  * (255 - ptPixel->alpha) + ptPixel->blue  * ptPixel->alpha) / 255; 
  262. }
  263. }
  264. ptPixel++;
  265.         }
  266.         SelectObject(DirectDC, oldObject);
  267.         RetBmp = DirectBitmap;
  268.     }
  269.     // 释放DC--------------------
  270.     DeleteDC(DirectDC);
  271.     DeleteDC(BufferDC);
  272.  
  273. return RetBmp;
  274. }
  275. /*========================================================================
  276. 说明: 用渐变色填充指定的矩形区域.
  277. ==========================================================================*/
  278. void FillGradient(CDC *pDC, CRect rect, const COLORREF& StartColor, const COLORREF& EndColor, BOOL bHor)
  279. {
  280. //绘制渐变色--------------------------------
  281. int r1 = GetRValue(StartColor);
  282. int g1 = GetGValue(StartColor);
  283. int b1 = GetBValue(StartColor);
  284. int r2 = GetRValue(EndColor);
  285. int g2 = GetGValue(EndColor);
  286. int b2 = GetBValue(EndColor);
  287. if (bHor)
  288. {
  289. float dr = ((float)(r2 - r1)) / (float)(rect.Width());
  290. float dg = ((float)(g2 - g1)) / (float)(rect.Width());
  291. float db = ((float)(b2 - b1)) / (float)(rect.Width());
  292. for (int i = rect.left; i < rect.right; i ++)
  293. {
  294. int r = r1 + (int)(dr*((float)(i - rect.left)));
  295. int g = g1 + (int)(dg*((float)(i - rect.left)));
  296. int b = b1 + (int)(db*((float)(i - rect.left)));
  297. CPen pen(PS_SOLID, 1, RGB(r, g, b));
  298. CPen *old = pDC->SelectObject(&pen);
  299. pDC->MoveTo(i, rect.top);
  300. pDC->LineTo(i, rect.bottom);
  301. pDC->SelectObject(old);
  302. }
  303. }
  304. else
  305. {
  306. float dr = ((float)(r2 - r1)) / (float)(rect.Height());
  307. float dg = ((float)(g2 - g1)) / (float)(rect.Height());
  308. float db = ((float)(b2 - b1)) / (float)(rect.Height());
  309. for (int i = rect.top; i < rect.bottom; i ++)
  310. {
  311. int r = r1 + (int)(dr*((float)(i - rect.top)));
  312. int g = g1 + (int)(dg*((float)(i - rect.top)));
  313. int b = b1 + (int)(db*((float)(i - rect.top)));
  314. CPen pen(PS_SOLID, 1, RGB(r, g, b));
  315. CPen *old = pDC->SelectObject(&pen);
  316. pDC->MoveTo(rect.left, i);
  317. pDC->LineTo(rect.right, i);
  318. pDC->SelectObject(old);
  319. }
  320. }
  321. }
  322. /*========================================================================
  323. 说明: 在指定的矩形区域内绘制阴影.
  324. ==========================================================================*/
  325. void DrawShadow(CDC *pDC, CRect rect)
  326. {
  327. COLORREF oldcolor = RGB(255, 255, 255);
  328. BYTE newValR, newValG, newValB;
  329. BYTE AlphaArray[] = {140, 170, 212, 240};
  330. BYTE AlphaArray2[] = {170, 205, 220, 240, 240, 250, 255};
  331. // 底部的阴影 -----------------------------------------
  332. int i, j;
  333. for (j = 0; j < 4; j++)
  334. {
  335. for (i = 6; i <= rect.right - 5; i++)
  336. {
  337. oldcolor = pDC->GetPixel(i, rect.bottom - (4 - j));
  338. newValR = GetRValue(oldcolor) * AlphaArray[j] / 255;  
  339. newValG = GetGValue(oldcolor) * AlphaArray[j] / 255;  
  340. newValB = GetBValue(oldcolor) * AlphaArray[j] / 255;  
  341. pDC->SetPixel(i, rect.bottom - (4 - j), RGB(newValR, newValG, newValB));
  342. }
  343. }
  344. // 右边的阴影 -----------------------------------------
  345. for (i = 0; i < 4; i++)
  346. {
  347. for (j = 6; j <= rect.bottom - 5; j++)
  348. {
  349. oldcolor = pDC->GetPixel(rect.right - (4 - i), j);
  350. newValR = GetRValue(oldcolor) * AlphaArray[i] / 255;  
  351. newValG = GetGValue(oldcolor) * AlphaArray[i] / 255;  
  352. newValB = GetBValue(oldcolor) * AlphaArray[i] / 255;  
  353. pDC->SetPixel(rect.right - (4 - i), j, RGB(newValR, newValG, newValB));
  354. }
  355. }
  356. // 其他部位的阴影 --------------------------------------
  357. for (i = 0; i < 4; i++)
  358. {
  359. for (j = 0; j < 4; j++)
  360. {
  361. if ((i + j) > 6) break;
  362. BYTE alpha = AlphaArray2[i + j];
  363. oldcolor = pDC->GetPixel(rect.right - 4 + i, rect.bottom - 4 + j);
  364. newValR = GetRValue(oldcolor) * alpha / 255;  
  365. newValG = GetGValue(oldcolor) * alpha / 255;  
  366. newValB = GetBValue(oldcolor) * alpha / 255;  
  367. pDC->SetPixel(rect.right - 4 + i, rect.bottom - 4 + j, RGB(newValR, newValG, newValB));
  368. oldcolor = pDC->GetPixel(rect.right - 4 + i, rect.top + 5 - j);
  369. newValR = GetRValue(oldcolor) * alpha / 255;  
  370. newValG = GetGValue(oldcolor) * alpha / 255;  
  371. newValB = GetBValue(oldcolor) * alpha / 255;  
  372. pDC->SetPixel(rect.right - 4 + i, rect.top + 5 - j, RGB(newValR, newValG, newValB));
  373. oldcolor = pDC->GetPixel(rect.left - i + 5, rect.bottom - 4 + j);
  374. newValR = GetRValue(oldcolor) * alpha / 255;  
  375. newValG = GetGValue(oldcolor) * alpha / 255;  
  376. newValB = GetBValue(oldcolor) * alpha / 255;  
  377. pDC->SetPixel(rect.left - i + 5, rect.bottom - 4 + j, RGB(newValR, newValG, newValB));
  378. }
  379. }
  380. }
  381. CString GetPathText(CString strPathName)
  382. {
  383. int count = strPathName.GetLength();
  384. for (int i = count - 1; i >= 0; i--)
  385. {
  386. if (strPathName[i] == '\')
  387. {
  388. break;
  389. }
  390. }
  391. return strPathName.Left(i + 1);
  392. }
  393. CString GetFileName(CString strPathName)
  394. {
  395. int count = strPathName.GetLength();
  396. for (int i = count - 1; i >= 0; i--)
  397. {
  398. if (strPathName[i] == '\')
  399. {
  400. break;
  401. }
  402. }
  403. return strPathName.Right(count - i - 1);
  404. }
  405. CString GetExFileName(CString strPathName)
  406. {
  407. int count = strPathName.GetLength();
  408. for (int i = count - 1; i >= 0; i--)
  409. {
  410. if (strPathName[i] == '\')
  411. {
  412. return CString("");
  413. }
  414. else if (strPathName[i] == '.')
  415. {
  416. break;
  417. }
  418. }
  419. return strPathName.Right(count - i - 1);
  420. }