GuiDrawLayer.cpp
上传用户:wlkj888
上传日期:2022-08-01
资源大小:806k
文件大小:25k
源码类别:

对话框与窗口

开发平台:

Visual C++

  1. /****************************************************************************
  2.  * *  
  3.  * GuiToolKit   *
  4.  *  (MFC extension) *  
  5.  * Created by Francisco Campos G. www.beyondata.com fcampos@beyondata.com *
  6.  *--------------------------------------------------------------------------*    
  7.  * *
  8.  * This program is free software;so you are free to use it any of your *
  9.  * applications (Freeware, Shareware, Commercial),but leave this header *
  10.  * intact. *
  11.  * *
  12.  * These files are provided "as is" without warranty of any kind. *
  13.  * *
  14.  *        GuiToolKit is forever FREE CODE !!!!! *
  15.  * *
  16.  *--------------------------------------------------------------------------*
  17.  * Created by: Francisco Campos G. *
  18.  * Bug Fixes and improvements : (Add your name) *
  19.  * -Francisco Campos *
  20.  * *
  21.  ****************************************************************************/
  22. #include "stdafx.h"
  23. #include "GuiDrawLayer.h"
  24. #include "resource.h"
  25. #ifdef _DEBUG
  26. #undef THIS_FILE
  27. static char THIS_FILE[]=__FILE__;
  28. #define new DEBUG_NEW
  29. #endif
  30. #pragma warning( disable : 4244 )
  31. DWORD GuiDrawLayer::m_SO=-1;
  32. BOOL  GuiDrawLayer::m_Theme=FALSE;
  33. DWORD GuiDrawLayer::m_Style=GUISTYLE_XP;
  34. //////////////////////////////////////////////////////////////////////
  35. // Construction/Destruction
  36. //////////////////////////////////////////////////////////////////////
  37. //-----------------------------------------------------------------------------
  38. BEGIN_MESSAGE_MAP(GuiTabbedButton, CGuiToolButton)
  39. ON_WM_LBUTTONDOWN()
  40. ON_WM_LBUTTONUP()
  41. ON_WM_TIMER()
  42. ON_WM_SYSCOLORCHANGE()
  43. END_MESSAGE_MAP()
  44. void GuiTabbedButton::OnSysColorChange( )
  45. {
  46. CGuiToolButton::OnSysColorChange( );
  47. }
  48. GuiTabbedButton::GuiTabbedButton()
  49. {
  50. bPress=FALSE;
  51. m_iMilliseconds=50;
  52. }
  53. GuiTabbedButton::~GuiTabbedButton()
  54. {
  55. }
  56. void GuiTabbedButton::OnLButtonUp(UINT nFlags, CPoint point)
  57. {
  58. // TODO: Add your message handler code here and/or call default
  59. CGuiToolButton::OnLButtonUp(nFlags, point);
  60. if (!bPress) return;
  61. bPress=FALSE;
  62. KillTimer(1001);
  63. }
  64. void GuiTabbedButton::OnLButtonDown(UINT nFlags, CPoint point)
  65. {
  66. // TODO: Add your message handler code here and/or call default
  67. CGuiToolButton::OnLButtonDown(nFlags, point);
  68. if (bPress) return;
  69. bPress=TRUE;
  70. SetTimer(1001,m_iMilliseconds,NULL);
  71. }
  72. void GuiTabbedButton::OnTimer(UINT nIDEvent)
  73. {
  74. // TODO: Add your message handler code here and/or call default
  75. CGuiToolButton::OnTimer(nIDEvent);
  76. if (bPress == FALSE) return;
  77. CRect rc;
  78. CPoint pt(GetMessagePos());
  79. ScreenToClient(&pt);
  80. GetClientRect(rc);
  81. if (rc.PtInRect(pt))
  82. {
  83. CWnd* pParent=GetParent();
  84. if (IsWindowEnabled())
  85. pParent->SendMessage(WM_COMMAND,GetDlgCtrlID());
  86. //bPress=FALSE;
  87. //KillTimer(1);
  88. }
  89. else
  90. {
  91. bPress=FALSE;
  92. KillTimer(1001);
  93. CGuiToolButton::OnTimer(nIDEvent);
  94. }
  95. }
  96. //------------------------------------------------------------------------------
  97. COLORREF GuiDrawLayer::DarkenColor( long lScale, COLORREF lColor)
  98.   long R = MulDiv(GetRValue(lColor),(255-lScale),255);
  99.   long G = MulDiv(GetGValue(lColor),(255-lScale),255);
  100.   long B = MulDiv(GetBValue(lColor),(255-lScale),255);
  101.   return RGB(R, G, B); 
  102. }
  103. GuiDrawLayer::GuiDrawLayer()
  104. {
  105. if (!m_img.Create(IDB_DOCKBAR,9,10,RGB(255,0,255)))
  106. {
  107. TRACE0("error");
  108. }
  109. m_iWidthDrowDown=GetSystemMetrics(SM_CXHTHUMB);
  110. CBitmap cbmp;
  111. BITMAP bmp;
  112. cbmp.LoadBitmap(IDB_GUI_DOCKBAR);
  113. cbmp.GetBitmap(&bmp);
  114. mHeight=CPoint(bmp.bmWidth,bmp.bmHeight);
  115. }
  116. COLORREF GuiDrawLayer::GetRGBColorWhite()
  117. {
  118. return RGB(255,255,255);
  119. }
  120. COLORREF GuiDrawLayer::GetRGBColorTabs()
  121. {
  122. BYTE byRvalue =GetRValue(GetRGBColorXP());
  123. BYTE byGvalue =GetGValue(GetRGBColorXP());
  124. BYTE byBvalue =GetBValue(GetRGBColorXP());
  125. // byRvalue =byRvalue>>2;
  126. // byGvalue =byGvalue>>2;
  127. // byBvalue =byBvalue>>2;
  128. int iMaximo=max(byRvalue,byGvalue);
  129. iMaximo=max(iMaximo,byBvalue);
  130. iMaximo= 255-iMaximo;
  131. iMaximo=iMaximo-(int)(iMaximo*0.51);
  132. return RGB(byRvalue+iMaximo,byGvalue+iMaximo,byBvalue+iMaximo);
  133. }
  134. /*BYTE byRvalue =GetRValue(::GetSysColor(COLOR_HIGHLIGHT));
  135. BYTE byGvalue =GetGValue(::GetSysColor(COLOR_HIGHLIGHT));
  136. BYTE byBvalue =GetBValue(::GetSysColor(COLOR_HIGHLIGHT));
  137. byRvalue =byRvalue>>2;
  138. byGvalue =byGvalue>>2;
  139. byBvalue =byBvalue>>2;
  140. int iMaximo=max(byRvalue,byGvalue);
  141. iMaximo=max(iMaximo,byBvalue);
  142. iMaximo= 255-iMaximo;
  143. iMaximo=iMaximo-(int)(iMaximo*0.14);
  144. return RGB(byRvalue+iMaximo,byGvalue+iMaximo,byBvalue+iMaximo);
  145. */
  146. COLORREF GuiDrawLayer::GetRGBSkinMenu()
  147. {
  148. BYTE byRvalue =GetRValue(GuiDrawLayer::GetRGBColorFace());
  149. BYTE byGvalue =GetGValue(GuiDrawLayer::GetRGBColorFace());
  150. BYTE byBvalue =GetBValue(GuiDrawLayer::GetRGBColorFace());
  151. byRvalue =byRvalue>>2;
  152. byGvalue =byGvalue>>2;
  153. byBvalue =byBvalue>>2;
  154. int iMaximo=max(byRvalue,byGvalue);
  155. iMaximo=max(iMaximo,byBvalue);
  156. iMaximo= 255-iMaximo;
  157. iMaximo=iMaximo-(int)(iMaximo*0.018);
  158. return RGB(byRvalue+iMaximo,byGvalue+iMaximo,byBvalue+iMaximo);
  159. }
  160. COLORREF GuiDrawLayer::GetRGBColorBTNHigh()
  161. {
  162. return ::GetSysColor(COLOR_BTNHIGHLIGHT);
  163. }
  164. COLORREF GuiDrawLayer::GetRGBColorGrayText()
  165. {
  166. BYTE byRvalue =0;
  167. BYTE byGvalue =0;
  168. BYTE byBvalue =0;
  169. byRvalue =byRvalue>>1;
  170. byGvalue =byGvalue>>1;
  171. byBvalue =byBvalue>>1;
  172. int iMaximo=max(byRvalue,byGvalue);
  173. iMaximo=max(iMaximo,byBvalue);
  174. iMaximo= 255-iMaximo;
  175. iMaximo=iMaximo-(int)(iMaximo*0.60);
  176. return RGB(byRvalue+iMaximo,byGvalue+iMaximo,byBvalue+iMaximo);
  177. }
  178. COLORREF GuiDrawLayer::GetRGBColorFace(DWORD dwStyle)
  179. {
  180. if (GuiDrawLayer::m_Theme && dwStyle!=GUISTYLE_XP)
  181. {
  182. HDC hdc=GetDC(NULL);
  183. COLORREF clrNear=GetNearestColor(hdc,GuiDrawLayer::GetRGBCaptionXP());
  184. ReleaseDC(NULL,hdc);
  185. if (clrNear==13595707)
  186. return RGB(173,201,243);
  187. else if(clrNear==8039069)
  188. return RGB(220,222,185);
  189. else if(clrNear==13221564)
  190. return RGB(231,227,241);
  191. }
  192. return ::GetSysColor(COLOR_BTNFACE);
  193. }
  194. COLORREF GuiDrawLayer::GetRGBColorShadow(DWORD  IsTh2003)
  195. {
  196. HDC hdc=GetDC(NULL);
  197. COLORREF clrNear=GetNearestColor(hdc,GuiDrawLayer::GetRGBCaptionXP());
  198. ReleaseDC(NULL,hdc);
  199. if (IsTh2003== GUISTYLE_2003)
  200. return GuiDrawLayer::m_Theme && clrNear != 13221564 ? GuiDrawLayer::GetRGBCaptionXP() : clrNear == 13221564 ? RGB(124,120,141): ::GetSysColor(COLOR_BTNSHADOW);
  201. return  ::GetSysColor(COLOR_BTNSHADOW);
  202. }
  203. COLORREF GuiDrawLayer::GetRGBPressBXP()
  204. {
  205. COLORREF clrPress = ::GetSysColor (COLOR_HIGHLIGHT);
  206. BYTE byRvalue =GetRValue(::GetSysColor(COLOR_HIGHLIGHT));
  207. BYTE byGvalue =GetGValue(::GetSysColor(COLOR_HIGHLIGHT));
  208. BYTE byBvalue =GetBValue(::GetSysColor(COLOR_HIGHLIGHT));
  209. byRvalue =byRvalue>>2;
  210. byGvalue =byGvalue>>2;
  211. byBvalue =byBvalue>>2;
  212. int iMaximo=max(byRvalue,byGvalue);
  213. iMaximo=max(iMaximo,byBvalue);
  214. iMaximo= 255-iMaximo;
  215. iMaximo=iMaximo-(int)(iMaximo*0.21);
  216. return RGB(byRvalue+iMaximo,byGvalue+iMaximo,byBvalue+iMaximo);
  217. }
  218. COLORREF GuiDrawLayer::GetRGBMenu()
  219. {
  220. COLORREF clrPress = ::GetSysColor (COLOR_BTNSHADOW);
  221. BYTE byRvalue =GetRValue(::GetSysColor(COLOR_HIGHLIGHT));
  222. BYTE byGvalue =GetGValue(::GetSysColor(COLOR_HIGHLIGHT));
  223. BYTE byBvalue =GetBValue(::GetSysColor(COLOR_HIGHLIGHT));
  224. byRvalue =byRvalue>>3;
  225. byGvalue =byGvalue>>3;
  226. byBvalue =byBvalue>>3;
  227. int iMaximo=max(byRvalue,byGvalue);
  228. iMaximo=max(iMaximo,byBvalue);
  229. iMaximo= 255-iMaximo;
  230. iMaximo=iMaximo-(int)(iMaximo*0.47);
  231. return RGB(byRvalue+iMaximo,byGvalue+iMaximo,byBvalue+iMaximo);
  232. }
  233. COLORREF GuiDrawLayer::GetRGBTitleMenu()
  234. {
  235. COLORREF clrPress = ::GetSysColor (COLOR_BTNSHADOW);
  236. BYTE byRvalue =GetRValue(::GetSysColor(clrPress));
  237. BYTE byGvalue =GetGValue(::GetSysColor(clrPress));
  238. BYTE byBvalue =GetBValue(::GetSysColor(clrPress));
  239. byRvalue =byRvalue>>2;
  240. byGvalue =byGvalue>>2;
  241. byBvalue =byBvalue>>2;
  242. int iMaximo=max(byRvalue,byGvalue);
  243. iMaximo=max(iMaximo,byBvalue);
  244. iMaximo= 255-iMaximo;
  245. iMaximo=iMaximo-(int)(iMaximo*0.8);
  246. return RGB(byRvalue+iMaximo,byGvalue+iMaximo,byBvalue+iMaximo);
  247. }
  248. COLORREF GuiDrawLayer::GetRGBCaptionXP()
  249. {
  250. BYTE byRvalue =GetRValue(::GetSysColor(COLOR_HIGHLIGHT));
  251. BYTE byGvalue =GetGValue(::GetSysColor(COLOR_HIGHLIGHT));
  252. BYTE byBvalue =GetBValue(::GetSysColor(COLOR_HIGHLIGHT));
  253. return RGB(byRvalue+10,byGvalue+10,byBvalue+10);
  254. }
  255. COLORREF GuiDrawLayer::GetRGBFondoXP()
  256. {
  257. BYTE byRvalue =GetRValue(::GetSysColor(COLOR_HIGHLIGHT));
  258. BYTE byGvalue =GetGValue(::GetSysColor(COLOR_HIGHLIGHT));
  259. BYTE byBvalue =GetBValue(::GetSysColor(COLOR_HIGHLIGHT));
  260. byRvalue =byRvalue>>2;
  261. byGvalue =byGvalue>>2;
  262. byBvalue =byBvalue>>2;
  263. int iMaximo=max(byRvalue,byGvalue);
  264. iMaximo=max(iMaximo,byBvalue);
  265. iMaximo= 255-iMaximo;
  266. iMaximo=iMaximo-(int)(iMaximo*0.14);
  267. return RGB(byRvalue+iMaximo,byGvalue+iMaximo,byBvalue+iMaximo);
  268. }
  269. BOOL GuiDrawLayer::IsGrayed()
  270. {
  271. BYTE byRvalue =GetRValue(::GetSysColor(COLOR_3DFACE));
  272. BYTE byGvalue =GetGValue(::GetSysColor(COLOR_3DFACE));
  273. BYTE byBvalue =GetBValue(::GetSysColor(COLOR_3DFACE));
  274. if ((byRvalue ==byGvalue) && (byGvalue == byBvalue) &&
  275.  (byBvalue > 190 && byBvalue < 193) || (byBvalue == 216))
  276. return TRUE;
  277. else
  278. return FALSE;
  279. }
  280. COLORREF GuiDrawLayer::GetRGBColorXP()
  281. {
  282. COLORREF clr3DFace = ::GetSysColor (COLOR_3DFACE);
  283. return RGB (((3*GetRValue (clr3DFace)+240)/4)+1,
  284. ((3*GetGValue (clr3DFace)+240)/4)+1,
  285. ((3*GetBValue (clr3DFace)+240)/4)+1);
  286. }
  287. GuiDrawLayer::~GuiDrawLayer()
  288. {
  289. }
  290. HICON GuiDrawLayer::LoadIconLib(UINT uIcon)
  291. {
  292. HINSTANCE hIrs = AfxFindResourceHandle(MAKEINTRESOURCE(uIcon),
  293. RT_GROUP_ICON);
  294. return (HICON)::LoadImage(hIrs, MAKEINTRESOURCE(uIcon), IMAGE_ICON,16, 16, 0);
  295. }
  296. void GuiDrawLayer::DrawArrow(CDC* pDC,CRect m_rc,BOOL m_bDown)
  297. {
  298. int difh =m_rc.Height()-mHeight.y;
  299. difh/=2;
  300. m_rc.left=m_rc.right-m_iWidthDrowDown;
  301. m_img.Draw(pDC,m_bDown?0:2,CPoint(m_rc.left+2,m_rc.top+difh),ILD_TRANSPARENT);
  302. }
  303. void GuiDrawLayer::DrawCheck(CDC* pDC,CRect m_rcTemp)
  304. {
  305. int iMediaAltura=(m_rcTemp.Height()/2)-2;
  306. int iMedioBox= m_rcTemp.Width()/2;
  307. CPen cp(PS_SOLID,1,GuiDrawLayer::GetRGBCaptionXP());
  308. CPen *pOld=pDC->SelectObject(&cp);
  309. pDC->MoveTo(m_rcTemp.left+1,m_rcTemp.top+iMediaAltura+3);
  310. pDC->LineTo(m_rcTemp.left+3,m_rcTemp.bottom-2);
  311. pDC->MoveTo(m_rcTemp.left+3,m_rcTemp.bottom-2);
  312. pDC->LineTo(m_rcTemp.right-1,m_rcTemp.top+2);
  313. pDC->MoveTo(m_rcTemp.left+1,m_rcTemp.top+iMediaAltura+2);
  314. pDC->LineTo(m_rcTemp.left+3,m_rcTemp.bottom-3);
  315. pDC->MoveTo(m_rcTemp.left+3,m_rcTemp.bottom-3);
  316. pDC->LineTo(m_rcTemp.right-1,m_rcTemp.top+1);
  317. pDC->MoveTo(m_rcTemp.left+1,m_rcTemp.top+iMediaAltura+1);
  318. pDC->LineTo(m_rcTemp.left+3,m_rcTemp.bottom-4);
  319. pDC->MoveTo(m_rcTemp.left+3,m_rcTemp.bottom-4);
  320. pDC->LineTo(m_rcTemp.right-1,m_rcTemp.top);
  321. pDC->SelectObject(pOld);
  322. }
  323. HICON GuiDrawLayer::GetIcon(int nIcon)
  324. {
  325. return m_img.ExtractIcon(nIcon);
  326. }
  327. //function of Bruno Podetti
  328. void GuiDrawLayer::DrawShade( CRect Rect,CPoint screen,CDC* pDC)
  329. //  if(!SystemParametersInfo(SPI_GETDROPSHADOW,0,&bEnabled,0))
  330.   //  return;
  331.   // Get the size of the menu... 
  332.   
  333.   long winW = Rect.Width(); 
  334.   long winH = Rect.Height(); 
  335.   long xOrg = screen.x;  
  336.   long yOrg = screen.y;
  337.   // Get the desktop hDC... 
  338.   HDC hDcDsk = GetWindowDC(0) ;
  339.   
  340.   int X,Y;
  341.   // Simulate a shadow on right edge... 
  342.   for (X=1; X<=2 ;X++)
  343.   { 
  344.     for (Y=0; Y<2 ;Y++)
  345.     {
  346.       SetPixel(pDC->m_hDC,winW-X,Y, GetPixel(hDcDsk,xOrg+winW-X,yOrg+Y) );
  347.     }
  348.     for (Y=4; Y<8 ;Y++)
  349.     {
  350.       COLORREF c = GetPixel(hDcDsk, xOrg + winW - X, yOrg + Y) ;
  351.       SetPixel(pDC->m_hDC,winW-X,Y,DarkenColor(3 * X * (Y - 3), c)) ;
  352.     }
  353.     for (Y=8; Y<=(winH-5) ;Y++)
  354.     {
  355.       COLORREF c = GetPixel(hDcDsk, xOrg + winW - X, yOrg + Y) ;
  356.       SetPixel(pDC->m_hDC, winW - X, Y, DarkenColor(15 * X, c) );
  357.     }
  358.     for (Y=(winH-4); Y<=(winH-1) ;Y++)
  359.     {
  360.       COLORREF c = GetPixel(hDcDsk, xOrg + winW - X, yOrg + Y) ;
  361.       SetPixel( pDC->m_hDC, winW - X, Y, DarkenColor(3 * X * -(Y - winH), c)) ;
  362.     }
  363.   } 
  364.   // Simulate a shadow on the bottom edge... 
  365.   for(Y=1; Y<=2 ;Y++)
  366.   {
  367.     for(X=0; X<=2 ;X++)
  368.     {
  369.       SetPixel(pDC->m_hDC,X,winH-Y, GetPixel(hDcDsk,xOrg+X,yOrg+winH-Y)) ;
  370.     }
  371.     for(X=4; X<=7 ;X++)
  372.     {
  373.       COLORREF c = GetPixel(hDcDsk, xOrg + X, yOrg + winH - Y) ;
  374.       SetPixel(pDC->m_hDC, X, winH - Y, DarkenColor(3 * (X - 3) * Y, c)) ;
  375.     }
  376.     for(X=8; X<=(winW-5) ;X++)
  377.     {
  378.       COLORREF  c = GetPixel(hDcDsk, xOrg + X, yOrg + winH - Y); 
  379.       SetPixel(pDC->m_hDC, X, winH - Y, DarkenColor(15 * Y, c)) ;
  380.     }
  381.   }   
  382.   // Release the desktop hDC... 
  383.   ReleaseDC(0,hDcDsk);
  384. }
  385. CGuiControlBarButton::CGuiControlBarButton()
  386. {
  387. bTypeButton=GUINORMAL;
  388. m_bEnabled=TRUE;
  389. }
  390. CGuiControlBarButton::~CGuiControlBarButton()
  391. {
  392. }
  393. void CGuiControlBarButton::SetTypeButton(GuiType bTypeb)
  394. {
  395. bTypeButton=bTypeb;
  396. }
  397. void CGuiControlBarButton::SetEnabled(BOOL bEnabled)
  398. {
  399. m_bEnabled=bEnabled;
  400. }
  401. void CGuiControlBarButton::Paint(CDC* pDC,int st,CRect rc,COLORREF clrFondo,BOOL isBackDark)
  402. {
  403. CBrush cb;
  404. if (clrFondo==NULL_BRUSH)
  405. cb.CreateStockObject(NULL_BRUSH);
  406. else if(bTypeButton==GUINORMAL) 
  407. cb.CreateSolidBrush(clrFondo);
  408. else
  409. {
  410. if (m_bEnabled)
  411. if (st == OVERBTN)
  412. cb.CreateSolidBrush(GuiDrawLayer::GetRGBFondoXP());
  413. else if(st == PRESSBTN)
  414. cb.CreateSolidBrush(GuiDrawLayer::GetRGBPressBXP());
  415. else
  416. cb.CreateSolidBrush(clrFondo);
  417. }
  418. if (m_bEnabled)
  419. {
  420. pDC->FillRect(rc,&cb);
  421. if (st == OVERBTN)
  422. pDC->Draw3dRect(rc,bTypeButton==GUINORMAL?::GetSysColor(COLOR_BTNHIGHLIGHT):GuiDrawLayer::GetRGBCaptionXP(),
  423.    bTypeButton==GUINORMAL?::GetSysColor(COLOR_BTNSHADOW):GuiDrawLayer::GetRGBCaptionXP());
  424. if (st == PRESSBTN)
  425. pDC->Draw3dRect(rc,bTypeButton==GUINORMAL?::GetSysColor(COLOR_BTNSHADOW):GuiDrawLayer::GetRGBCaptionXP(),
  426. bTypeButton==GUINORMAL?::GetSysColor(COLOR_BTNHIGHLIGHT):GuiDrawLayer::GetRGBCaptionXP());
  427. }
  428. if(bTypeButton==GUINORMAL) 
  429. m_imgList.Draw(pDC,isBackDark? m_nIcon+1:m_nIcon, 
  430. CPoint(rc.left+1,rc.top+2), ILD_TRANSPARENT);
  431. else
  432. {
  433. HICON m_Icon=m_imgList.ExtractIcon(!isBackDark?m_nIcon:m_nIcon+1);
  434. //if (m_bEnabled)
  435. IMAGEINFO* pImageInfo = new IMAGEINFO;
  436. m_imgList.GetImageInfo(m_nIcon,pImageInfo);
  437. CRect rcbt=pImageInfo->rcImage;
  438. int difh= rc.Height()-rcbt.Height();
  439. int difw= rc.Width()-rcbt.Width();
  440. if (difh< 0) difh=0;
  441. if (difw< 0) difw=1;
  442. difh/=2;
  443. difw/=2;
  444. m_imgList.Draw(pDC,m_nIcon, CPoint(rc.left+1+difw,bTypeButton==GUINORMAL?rc.top+difh+1:rc.top+difh+1),m_bEnabled?ILD_TRANSPARENT:ILD_BLEND25);
  445. delete pImageInfo;
  446. DestroyIcon (m_Icon);
  447. }
  448. cb.DeleteObject();
  449. }
  450. void CGuiControlBarButton::SetData(int nIcon,LPCTSTR lpMsg)
  451. {
  452. m_nIcon=nIcon;
  453. m_lpMsg=lpMsg;
  454. }
  455. void  CGuiControlBarButton::SetImageList(UINT nBitmapID, int cx, int nGrow, COLORREF crMask)
  456. {
  457. CBitmap cbmp;
  458. BITMAP bmp;
  459. m_imgList.Create(nBitmapID,cx,nGrow,crMask);
  460. cbmp.LoadBitmap(nBitmapID);
  461. cbmp.GetBitmap(&bmp);
  462. m_imgList.Add(&cbmp,crMask);
  463. }
  464. //-----------------------------------------------------------------------------------
  465. //-----------------------------------------------------------------------------------
  466. CGradient::CGradient(CSize Size)
  467. {
  468. m_Size=Size;
  469. m_dcMem=NULL;
  470. }
  471. CGradient::~CGradient()
  472. {
  473. if(m_dcMem!=NULL)
  474. delete m_dcMem;
  475. }
  476. CSize CGradient::GetDimensions()
  477. {
  478. return m_Size;
  479. }
  480. void  CGradient::SetDimensions(CSize Size)
  481. {
  482. m_Size=Size;
  483. }
  484. void CGradient::PrepareVertical(CDC* pDC,DWORD m_StyleDisplay,COLORREF m_clr, int nRate)
  485. {
  486. BYTE byRvalue =GetRValue(m_clr);//+(nRate==30 ?10:(15));
  487. BYTE byGvalue =GetGValue(m_clr);//+(nRate==30 ?10:(15));
  488. BYTE byBvalue =GetBValue(m_clr);//+(nRate==30 ?10:(15));
  489. if (GuiDrawLayer::m_Theme && m_StyleDisplay!= GUISTYLE_XP )
  490. {
  491. COLORREF clrNear=pDC->GetNearestColor(GuiDrawLayer::GetRGBCaptionXP());
  492. if (clrNear==13595707)
  493. PrepareVertical(pDC,222,234,253,141,178,223);
  494. else if(clrNear==8039069)
  495. PrepareVertical(pDC,243,251,221,179,194,138);
  496. else if(clrNear==13221564)
  497. PrepareVertical(pDC,248,248,250,165,160,184);
  498. }
  499. else
  500. PrepareVertical(pDC,250,250,249,byRvalue-30,byGvalue-30,byBvalue-30);
  501. }
  502. void CGradient::PrepareCaption(CDC* pDC,DWORD m_StyleDisplay)
  503. {
  504. BYTE byRvalue ;
  505. BYTE byGvalue ;
  506. BYTE byBvalue ;
  507. if (GuiDrawLayer::m_Theme && m_StyleDisplay!= GUISTYLE_XP)
  508. {
  509. PrepareVertical(pDC,248,248,205,249,200,102);
  510. return;
  511. }
  512. else if (m_StyleDisplay == GUISTYLE_2003)
  513. {
  514. byRvalue =GetRValue(GuiDrawLayer::GetRGBPressBXP());
  515. byGvalue =GetGValue(GuiDrawLayer::GetRGBPressBXP());
  516. byBvalue =GetBValue(GuiDrawLayer::GetRGBPressBXP());
  517. }
  518. else
  519. {
  520. byRvalue =GetRValue(GuiDrawLayer::GetRGBColorShadow());
  521. byGvalue =GetGValue(GuiDrawLayer::GetRGBColorShadow());
  522. byBvalue =GetBValue(GuiDrawLayer::GetRGBColorShadow());
  523. }
  524. PrepareVertical(pDC,byRvalue,byGvalue,byBvalue,byRvalue-30,byGvalue-30,byBvalue-30);
  525. }
  526. void CGradient::PrepareCaptionVert(CDC* pDC,DWORD m_StyleDisplay)
  527. {
  528. BYTE byRvalue ;
  529. BYTE byGvalue ;
  530. BYTE byBvalue ;
  531. if (GuiDrawLayer::m_Theme && m_StyleDisplay!= GUISTYLE_XP)
  532. {
  533. PrepareHorizontal(pDC,249,200,102,248,248,205);
  534. return;
  535. }
  536. else if (m_StyleDisplay == GUISTYLE_2003)
  537. {
  538. byRvalue =GetRValue(GuiDrawLayer::GetRGBPressBXP());
  539. byGvalue =GetGValue(GuiDrawLayer::GetRGBPressBXP());
  540. byBvalue =GetBValue(GuiDrawLayer::GetRGBPressBXP());
  541. }
  542. else
  543. {
  544. byRvalue =GetRValue(GuiDrawLayer::GetRGBColorShadow());
  545. byGvalue =GetGValue(GuiDrawLayer::GetRGBColorShadow());
  546. byBvalue =GetBValue(GuiDrawLayer::GetRGBColorShadow());
  547. }
  548. PrepareHorizontal(pDC,byRvalue,byGvalue,byBvalue,byRvalue-30,byGvalue-30,byBvalue-30);
  549. }
  550. void CGradient::PrepareTabs(CDC* pDC, COLORREF m_clrL,COLORREF m_clrH)
  551. {
  552. BYTE byRvalueL =GetRValue(m_clrL);
  553. BYTE byGvalueL =GetGValue(m_clrL);
  554. BYTE byBvalueL =GetBValue(m_clrL);
  555. BYTE byRvalueH =GetRValue(m_clrH);
  556. BYTE byGvalueH =GetGValue(m_clrH);
  557. BYTE byBvalueH =GetBValue(m_clrH);
  558. PrepareVertical(pDC,byRvalueL,byGvalueL,byBvalueL,byRvalueH,byGvalueH,byBvalueH);
  559. }
  560. void CGradient::PrepareReverseVert(CDC* pDC,DWORD m_StyleDisplay,COLORREF m_clr)
  561. {
  562. BYTE byRvalue =GetRValue(m_clr)+10;
  563. BYTE byGvalue =GetGValue(m_clr)+10;
  564. BYTE byBvalue =GetBValue(m_clr)+10;
  565. if (GuiDrawLayer::m_Theme && m_StyleDisplay!= GUISTYLE_XP)
  566. {
  567. COLORREF clrNear=pDC->GetNearestColor(GuiDrawLayer::GetRGBCaptionXP());
  568. if (clrNear==13595707)
  569. PrepareVertical(pDC,141,178,223,222,234,253);
  570. else if(clrNear==8039069)
  571. PrepareVertical(pDC,179,194,138,243,251,221);
  572. else if(clrNear==13221564)
  573. PrepareVertical(pDC,165,160,184,248,248,250);
  574. }
  575. else
  576. PrepareVertical(pDC,byRvalue-30,byGvalue-30,byBvalue-30,byRvalue,byGvalue,byBvalue);
  577. }
  578. void CGradient::PrepareReverseVertTab(CDC* pDC,DWORD m_StyleDisplay,COLORREF m_clr)
  579. {
  580. BYTE byRvalue =GetRValue(m_clr)+10;
  581. BYTE byGvalue =GetGValue(m_clr)+10;
  582. BYTE byBvalue =GetBValue(m_clr)+10;
  583. if (GuiDrawLayer::m_Theme && m_StyleDisplay!= GUISTYLE_XP)
  584. {
  585. COLORREF clrNear=pDC->GetNearestColor(GuiDrawLayer::GetRGBCaptionXP());
  586. if (clrNear==13595707)
  587. PrepareVertical(pDC,216,228,243,255,255,255);
  588. else if(clrNear==8039069)
  589. PrepareVertical(pDC,233,237,220,255,255,255);
  590. else if(clrNear==13221564)
  591. PrepareVertical(pDC,234,233,239,255,255,255);
  592. }
  593. else
  594. PrepareVertical(pDC,byRvalue-30,byGvalue-30,byBvalue-30,byRvalue,byGvalue,byBvalue);
  595. }
  596. void CGradient::PrepareReverseColorTab(CDC* pDC,DWORD m_StyleDisplay, COLORREF m_clrL, COLORREF m_clrH)
  597. {
  598. BYTE byRvalueL =GetRValue(m_clrL);
  599. BYTE byGvalueL =GetGValue(m_clrL);
  600. BYTE byBvalueL =GetBValue(m_clrL);
  601. BYTE byRvalueH =GetRValue(m_clrH);
  602. BYTE byGvalueH =GetGValue(m_clrH);
  603. BYTE byBvalueH =GetBValue(m_clrH);
  604. PrepareVertical(pDC,byRvalueL,byGvalueL,byBvalueL,byRvalueH,byGvalueH,byBvalueH);
  605. }
  606. void CGradient::PrepareReverseHor(CDC* pDC,DWORD m_StyleDisplay,COLORREF m_clr)
  607. {
  608. BYTE byRvalue =GetRValue(m_clr)+10;
  609. BYTE byGvalue =GetGValue(m_clr)+10;
  610. BYTE byBvalue =GetBValue(m_clr)+10;
  611. if (GuiDrawLayer::m_Theme && m_StyleDisplay!= GUISTYLE_XP)
  612. {
  613. COLORREF clrNear=pDC->GetNearestColor(GuiDrawLayer::GetRGBCaptionXP());
  614. if (clrNear==13595707)
  615. PrepareHorizontal(pDC,222,234,253,141,178,223);
  616. else if(clrNear==8039069)
  617. PrepareHorizontal(pDC,243,251,221,179,194,138);
  618. else if(clrNear==13221564)
  619. PrepareHorizontal(pDC,248,248,250,165,160,184);
  620. }
  621. else
  622. PrepareHorizontal(pDC,byRvalue,byGvalue,byBvalue,byRvalue-30,byGvalue-30,byBvalue-30);
  623. }
  624. void CGradient::PrepareHorizontal(CDC* pDC,DWORD m_StyleDisplay,COLORREF m_clr)
  625. {
  626. BYTE byRvalue =GetRValue(m_clr)+10;
  627. BYTE byGvalue =GetGValue(m_clr)+10;
  628. BYTE byBvalue =GetBValue(m_clr)+10;
  629. if (GuiDrawLayer::m_Theme && m_StyleDisplay!= GUISTYLE_XP)
  630. {
  631. COLORREF clrNear=pDC->GetNearestColor(GuiDrawLayer::GetRGBCaptionXP());
  632. if (clrNear==13595707)
  633. PrepareHorizontal(pDC,141,178,223,222,234,253);
  634. else if(clrNear==8039069)
  635. PrepareHorizontal(pDC,179,194,138,243,251,221);
  636. else if(clrNear==13221564)
  637. PrepareHorizontal(pDC,165,160,184,248,248,250);
  638. }
  639. else
  640. PrepareHorizontal(pDC,byRvalue-30,byGvalue-30,byBvalue-30,byRvalue,byGvalue,byBvalue);
  641. }
  642. void CGradient::PrepareVertical(CDC *pDC,UINT RTop,UINT GTop,UINT BTop,UINT RBot,UINT GBot,UINT BBot)
  643. {
  644. //Here we will create a memory bitmap and draw the colored bitmap on it
  645. //using my pretty Algorithm for generating colors.
  646. //if we have already a drawn DC then delete it so we will not have a
  647. //memory leak
  648. if(m_dcMem!=NULL)
  649. {
  650. delete m_dcMem;
  651. }
  652. //create the Memory Bitmap
  653. CBitmap Bitmap;
  654. m_dcMem=new CDC; //new Device Context
  655. m_dcMem->CreateCompatibleDC(pDC); //Make it Compatible with pDC
  656. m_dcMem->SetMapMode(MM_TEXT); //Pixels Mapping Mode
  657. //Make the Bitmap compatible with the memory DC
  658. Bitmap.CreateCompatibleBitmap(pDC,m_Size.cx,m_Size.cy);
  659. //Select the bitmap into the memory DC
  660. m_dcMem->SelectObject(&Bitmap);
  661. ////////////////////////////////////////////////////////////////
  662. ////Drawing The Gradient in a MemDC
  663. ////////////////////////////////////////////////////////////////
  664. //ALGORITHM:
  665. //We will have the RGB values of the color at which we will start
  666. //and the RGB values of the color at which we will end
  667. //we will fill 256 rectangles using all colors that lie between
  668. //these two colors. this is done by moving the R,G, and B values slowly
  669. //from the Starting color to the Ending Color.
  670. //For example: if we have RTop=100 and RBot=150 then we will draw 256
  671. //rectangles colored with the R-values of 100,100+(150-100)/256,
  672. //100+2*(150-100)/256,100+3*(150-100)/256,...
  673. //and the same will happen to G and B values.
  674. //rStep,gStep, and bStep are variables that will be used
  675. //to hold the values at which R,G,B will be changed respectivily
  676. //For example: if we have RTop=100 and RBot=150 then 
  677. //rStep=(150-100)/256 so when we start at R=100 and draw 256 rectangles
  678. //we will end at R=150 when we finish drawing these rectangles
  679. double rStep,gStep,bStep;
  680. double rCount,gCount,bCount;
  681. double RectHeight=m_Size.cy/256.0;
  682. const int NUM_COLORS=256;
  683. //We will start counting from TopColor to BottomColor
  684. //So we give an initial value of the TopColor
  685. rCount=RTop;
  686. gCount=GTop;
  687. bCount=BTop;
  688. //Calcualte the step of R,G,B values
  689. rStep=-((double)RTop-RBot)/NUM_COLORS;
  690. gStep=-((double)GTop-GBot)/NUM_COLORS;
  691. bStep=-((double)BTop-BBot)/NUM_COLORS;
  692. for(int ColorCount=0;ColorCount<NUM_COLORS;ColorCount++)
  693. {
  694. //Draw using current RGB values and Change RGB values
  695. //to represent the next color in the chain
  696. m_dcMem->FillRect(CRect(0,ColorCount*RectHeight,m_Size.cx,(ColorCount+1)*RectHeight),&CBrush(RGB(rCount,gCount,bCount)));
  697. rCount+=rStep;
  698. gCount+=gStep;
  699. bCount+=bStep;
  700. }
  701. }
  702. void CGradient::PrepareHorizontal(CDC *pDC,UINT RLeft,UINT GLeft,UINT BLeft,UINT RRight,UINT GRight,UINT BRight)
  703. {
  704. if(m_dcMem!=NULL)
  705. {
  706. delete m_dcMem;
  707. }
  708. CBitmap Bitmap;
  709. m_dcMem=new CDC;
  710. m_dcMem->CreateCompatibleDC(pDC);
  711. m_dcMem->SetMapMode(MM_TEXT);
  712. Bitmap.CreateCompatibleBitmap(pDC,m_Size.cx,m_Size.cy);
  713. m_dcMem->SelectObject(&Bitmap);
  714. ////////////////////////////////////////////////////////////////
  715. ////Drawing The Gradient in a MemDC
  716. double rStep,gStep,bStep;
  717. double rCount,gCount,bCount;
  718. double RectWidth=m_Size.cx/256.0;
  719. const int NUM_COLORS=256;
  720. rCount=RRight;
  721. gCount=GRight;
  722. bCount=BRight;
  723. rStep=-((double)RRight-RLeft)/NUM_COLORS;
  724. gStep=-((double)GRight-GLeft)/NUM_COLORS;
  725. bStep=-((double)BRight-BLeft)/NUM_COLORS;
  726. for(int ColorCount=0;ColorCount<NUM_COLORS;ColorCount++)
  727. {
  728. m_dcMem->FillRect(CRect(ColorCount*RectWidth,0,(ColorCount+1)*RectWidth,m_Size.cy),&CBrush(RGB(rCount,gCount,bCount)));
  729. rCount+=rStep;
  730. gCount+=gStep;
  731. bCount+=bStep;
  732. }
  733. }
  734. void CGradient::Draw(CDC *pDC, int xDest,int yDest,int xSrc, int ySrc, int Width, int Height,DWORD Rop)
  735. {
  736. //Use BitBlt to Draw on a DC
  737. pDC->BitBlt(xDest,yDest,Width,Height,m_dcMem,xSrc,ySrc,Rop);
  738. }