MyToolBar.cpp
上传用户:jzscgs158
上传日期:2022-05-25
资源大小:8709k
文件大小:21k
源码类别:

百货/超市行业

开发平台:

Visual C++

  1. #include "stdafx.h"
  2. #include "MyToolBar.h"
  3. #ifdef _DEBUG
  4. #define new DEBUG_NEW
  5. #undef THIS_FILE
  6. static char THIS_FILE[] = __FILE__;
  7. #endif
  8. struct CToolBarData
  9. {
  10. WORD wVersion;
  11. WORD wWidth;
  12. WORD wHeight;
  13. WORD wItemCount;
  14. //WORD aItems[wItemCount]
  15. WORD* items()
  16. { return (WORD*)(this+1); }
  17. };
  18. void TransparentBltEx( HDC hdcDest,    
  19.   int nXOriginDest,  
  20.   int nYOriginDest,  
  21.   int nWidthDest,    
  22.   int nHeightDest,   
  23.   HDC hdcSrc,        
  24.   int nXOriginSrc,   
  25.   int nYOriginSrc,   
  26.   int nWidthSrc,     
  27.   int nHeightSrc,    
  28.   UINT crTransparent 
  29.   )
  30. {
  31. HBITMAP hOldImageBMP, hImageBMP = CreateCompatibleBitmap(hdcDest, nWidthDest, nHeightDest); // 创建兼容位图
  32. HBITMAP hOldMaskBMP, hMaskBMP = CreateBitmap(nWidthDest, nHeightDest, 1, 1, NULL); // 创建单色掩码位图
  33. HDC hImageDC = CreateCompatibleDC(hdcDest);
  34. HDC hMaskDC = CreateCompatibleDC(hdcDest);
  35. hOldImageBMP = (HBITMAP)SelectObject(hImageDC, hImageBMP);
  36. hOldMaskBMP = (HBITMAP)SelectObject(hMaskDC, hMaskBMP);
  37. if (nWidthDest == nWidthSrc && nHeightDest == nHeightSrc)
  38. BitBlt(hImageDC, 0, 0, nWidthDest, nHeightDest, hdcSrc, nXOriginSrc, nYOriginSrc, SRCCOPY);
  39. else
  40. StretchBlt(hImageDC, 0, 0, nWidthDest, nHeightDest, 
  41. hdcSrc, nXOriginSrc, nYOriginSrc, nWidthSrc, nHeightSrc, SRCCOPY);
  42. SetBkColor(hImageDC, crTransparent);
  43. BitBlt(hMaskDC, 0, 0, nWidthDest, nHeightDest, hImageDC, 0, 0, SRCCOPY);
  44. SetBkColor(hImageDC, RGB(0,0,0));
  45. SetTextColor(hImageDC, RGB(255,255,255));
  46. BitBlt(hImageDC, 0, 0, nWidthDest, nHeightDest, hMaskDC, 0, 0, SRCAND);
  47. SetBkColor(hdcDest,RGB(255,255,255));
  48. SetTextColor(hdcDest,RGB(0,0,0));
  49. BitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hMaskDC, 0, 0, SRCAND);
  50. // or
  51. BitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hImageDC, 0, 0, SRCPAINT);
  52. SelectObject(hImageDC, hOldImageBMP);
  53. DeleteDC(hImageDC);
  54. SelectObject(hMaskDC, hOldMaskBMP);
  55. DeleteDC(hMaskDC);
  56. DeleteObject(hImageBMP);
  57. DeleteObject(hMaskBMP);
  58. }
  59. /////////////////////////////////////////////////////////////////////////////
  60. // CMyToolBar
  61. IMPLEMENT_DYNAMIC(CMyToolBar,CToolBar)
  62. BEGIN_MESSAGE_MAP(CMyToolBar, CToolBar)
  63. //{{AFX_MSG_MAP(CMyToolBar)
  64. ON_WM_ERASEBKGND()
  65. ON_WM_WINDOWPOSCHANGING()
  66. ON_WM_PAINT()
  67. //}}AFX_MSG_MAP
  68. END_MESSAGE_MAP()
  69. CMyToolBar::CMyToolBar()
  70. {
  71. m_bBKStyle=bs_RGB;
  72. m_clrBack=RGB(161,192,245);
  73. m_bkbrush.CreateSolidBrush(RGB(161,192,245));
  74. }
  75. CMyToolBar::~CMyToolBar()
  76. {
  77. try{
  78. delete[] m_pbtButtonStyle;
  79. }
  80. catch(...)
  81. {}
  82. }
  83. /////////////////////////////////////////////////////////////////////////////
  84. // CMyToolBar message handlers
  85. void CMyToolBar::EraseNonClient()
  86. {
  87. // get window DC that is clipped to the non-client area
  88. CWindowDC dc(this);
  89. CRect rectClient;
  90. GetClientRect(rectClient);
  91. CRect rectWindow;
  92. GetWindowRect(rectWindow);
  93. ScreenToClient(rectWindow);
  94. rectClient.OffsetRect(-rectWindow.left, -rectWindow.top);
  95. dc.ExcludeClipRect(rectClient);
  96. // draw borders in non-client area
  97. rectWindow.OffsetRect(-rectWindow.left, -rectWindow.top);
  98. DrawBorders(&dc, rectWindow);
  99. // erase parts not drawn
  100. dc.IntersectClipRect(rectWindow);
  101. SendMessage(WM_ERASEBKGND, (WPARAM)dc.m_hDC);
  102. DrawGripper(&dc, rectWindow); //
  103. }
  104. BOOL CMyToolBar::OnEraseBkgnd(CDC *pDC)
  105. {
  106.     CRect rect;
  107. GetWindowRect(&rect);
  108. ScreenToClient(&rect);
  109. int r1,g1,b1,i;
  110. switch(m_bBKStyle)
  111. {
  112. case bs_RGB:
  113. r1=GetRValue(m_clrBack);
  114. g1=GetGValue(m_clrBack);
  115. b1=GetBValue(m_clrBack);
  116. for(i=rect.Height()/2;i>=0;i--)
  117. {
  118. r1=(r1+3)>255?255:(r1+3);
  119. g1=(g1+3)>255?255:(g1+3);
  120. b1=(b1+3)>255?255:(b1+3);
  121. CPen pen(PS_SOLID, 1, RGB(r1, g1, b1));
  122. CPen *old = pDC->SelectObject(&pen);
  123. pDC->MoveTo(rect.left,rect.top+i);
  124. pDC->LineTo(rect.right,rect.top+i);
  125. pDC->MoveTo(rect.left,rect.bottom-i);
  126. pDC->LineTo(rect.right,rect.bottom-i);
  127. pDC->SelectObject(old);
  128. }
  129. break;
  130. case bs_BITMAP:
  131. case bs_ORG:
  132. pDC->FillRect(&rect,&m_bkbrush);
  133. break;
  134. default:
  135. CToolBar::OnEraseBkgnd(pDC);
  136. break;
  137. }
  138. CPen spen(PS_SOLID,1,RGB(255,255,255));
  139. CPen *mpen=pDC->SelectObject(&spen);
  140. pDC->MoveTo(rect.left,rect.bottom-3);
  141. pDC->LineTo(rect.right,rect.bottom-3);
  142. pDC->MoveTo(rect.left,rect.bottom-1);
  143. pDC->LineTo(rect.right,rect.bottom-1);
  144. CPen npen(PS_SOLID,1,RGB(178,178,178));
  145. pDC->SelectObject(&npen);
  146. pDC->MoveTo(rect.left,rect.bottom-2);
  147. pDC->LineTo(rect.right,rect.bottom-2);
  148. pDC->SelectObject(mpen);
  149. return TRUE;
  150. }
  151. void CMyToolBar::OnWindowPosChanging(WINDOWPOS FAR* lpwndpos) 
  152. {
  153. CToolBar::OnWindowPosChanging(lpwndpos);
  154. // TODO: Add your message handler code here
  155. RepaintBackground();
  156. }
  157. void CMyToolBar::RepaintBackground()
  158. {
  159. // get parent window (there should be one)
  160. CWnd* pParent = GetParent();
  161. if (pParent) {
  162. // get rect for this toolbar
  163. CRect rw; GetWindowRect(&rw);
  164. // convert rect to parent coords
  165. CRect rc = rw; pParent->ScreenToClient(&rc);
  166. // invalidate this part of parent
  167. pParent->InvalidateRect(&rc);
  168. // now do all the other toolbars (etc) that belong to the parent
  169. for (
  170. CWnd* pSibling = pParent->GetWindow(GW_CHILD);
  171. pSibling;
  172. pSibling = pSibling->GetNextWindow(GW_HWNDNEXT)
  173. ) {
  174. // but do not draw ourselves
  175. if (pSibling == this) continue;
  176. // convert rect to siblings coords
  177. CRect rc = rw; pSibling->ScreenToClient(&rc);
  178. // invalidate this part of sibling
  179. pSibling->InvalidateRect(&rc);
  180. }
  181. }
  182. }
  183. void CMyToolBar::OnPaint() 
  184. {
  185. //CPaintDC dc(this); // device context for painting
  186. // TODO: Add your message handler code here
  187. // standard tolbar
  188.     CToolBar::OnPaint();
  189.     // erase the background
  190.     EraseNonClient();
  191.     // plus separators
  192.     DrawSeparators();
  193. // Do not call CToolBar::OnPaint() for painting messages
  194. }
  195. // Draw the separators in the client area
  196. void CMyToolBar::DrawSeparators()
  197. {
  198. // get a dc for the client area
  199. CClientDC dc(this);
  200. // draw the separators on it
  201. DrawSeparators(&dc);
  202. }
  203. // Draw the separators
  204. void CMyToolBar::DrawSeparators(CClientDC* pDC)
  205. {
  206. // horizontal vs vertical
  207. bool ishorz = (m_dwStyle & CBRS_ORIENT_HORZ) != 0;
  208. // get number of buttons
  209. int nIndexMax = (int)DefWindowProc(TB_BUTTONCOUNT, 0, 0);
  210. int nIndex;
  211. // try each button
  212. for (nIndex = 0; nIndex < nIndexMax; nIndex++)
  213. {
  214. UINT dwStyle=GetButtonStyle(nIndex);
  215. UINT wStyle=LOWORD(dwStyle);
  216. // if it is a separator
  217. if (wStyle == TBBS_SEPARATOR)
  218. {
  219. // get it's rectangle and width
  220. CRect rect;
  221. GetItemRect(nIndex,rect);
  222. // if small enough to be a true separator
  223. int w=rect.Width();
  224. if (w <= 8)
  225. {
  226. if (ishorz)
  227. {
  228. // draw the separator bar in the middle
  229. CRect rectbar=rect;
  230. int x=(rectbar.left+rectbar.right)/2;
  231. rectbar.left=x-1;
  232. rectbar.right=x+1;
  233. pDC->Draw3dRect(rectbar,::GetSysColor(COLOR_3DSHADOW),::GetSysColor(COLOR_3DHILIGHT));
  234. }
  235. else
  236. {
  237. // draw the separator bar in the middle
  238. CRect rectbar = rect;
  239. rectbar.left = rectbar.left - m_sizeButton.cx;
  240. rectbar.right = rectbar.left + m_sizeButton.cx;
  241. rectbar.top = rectbar.bottom+1;
  242. rectbar.bottom = rectbar.top+3;
  243. int y = (rectbar.top+rectbar.bottom)/2;
  244. rectbar.top = y-1;
  245. rectbar.bottom = y+1;
  246. pDC->Draw3dRect(rectbar,::GetSysColor(COLOR_3DSHADOW),::GetSysColor(COLOR_3DHILIGHT));
  247. }
  248. }
  249. }
  250. }
  251. }
  252. // Draw the gripper at left or top
  253. void CMyToolBar::DrawGripper(CWindowDC *pDC, CRect& rectWindow)
  254. {
  255. // get the gripper rect (1 pixel smaller than toolbar)
  256. CRect gripper = rectWindow;
  257. CRect rc;
  258. CBrush brush1,brush2;
  259. brush1.CreateSolidBrush(RGB(192,192,192));
  260. brush2.CreateSolidBrush(RGB(255,255,255));
  261. gripper.DeflateRect(1,1);
  262. if (m_dwStyle & CBRS_FLOATING) {
  263. // no grippers
  264. } else if (m_dwStyle & CBRS_ORIENT_HORZ) {
  265. // gripper at left
  266. rc.top=gripper.top+3;
  267. rc.left=gripper.left+1;
  268. rc.right=rc.left+2;
  269. rc.bottom=rc.top+2;
  270. for(int i=0;i<(gripper.Height()-4)/5;i++)
  271. {
  272. //pDC->Draw3dRect(rc,RGB(128,128,128),RGB(255,255,255));//::GetSysColor(COLOR_3DHIGHLIGHT),::GetSysColor(COLOR_3DSHADOW));
  273. rc.OffsetRect(+1,+1);
  274. pDC->FillRect(&rc,&brush2) ;
  275. rc.OffsetRect(-1,-1);
  276. pDC->FillRect(&rc,&brush1) ;
  277. rc.OffsetRect(0,+5); 
  278. }
  279. } else {
  280. // gripper at top
  281. rc.top=gripper.top+1;
  282. rc.left=gripper.left+3;
  283. rc.right=rc.left+2;
  284. rc.bottom=rc.top+2;
  285. for(int i=0;i<(gripper.Width()-4)/5;i++)
  286. {
  287. //pDC->Draw3dRect(rc,RGB(128,128,128),RGB(255,255,255));//::GetSysColor(COLOR_3DHIGHLIGHT),::GetSysColor(COLOR_3DSHADOW));
  288. rc.OffsetRect(+1,+1);
  289. pDC->FillRect(&rc,&brush2) ;
  290. rc.OffsetRect(-1,-1);
  291. pDC->FillRect(&rc,&brush1) ;
  292. rc.OffsetRect(+5,0); 
  293. }
  294. }
  295. void CMyToolBar::SetBKColor(COLORREF color)
  296. {
  297. m_bkbrush.DeleteObject(); 
  298. m_bkbrush.CreateSolidBrush(color);
  299. m_bBKStyle=bs_RGB;
  300. m_clrBack=color;
  301. SetButtonEx(m_lpszResourceName);
  302. Invalidate();
  303. }
  304. void CMyToolBar::SetDefaultStyle()
  305. {
  306. SetBKColor(RGB(161,192,245));
  307. }
  308. void CMyToolBar::SetBKImage(UINT nIDResource)
  309. {
  310. CBitmap tmp;
  311. tmp.LoadBitmap(nIDResource);
  312. m_bkbrush.DeleteObject();
  313. m_bkbrush.CreatePatternBrush(&tmp); 
  314. m_bBKStyle=bs_BITMAP;
  315. SetButtonEx(m_lpszResourceName);
  316. Invalidate();
  317. }
  318. void CMyToolBar::SetBKImage(LPCTSTR lpszResourceName)
  319. {
  320. CBitmap tmp;
  321. tmp.LoadBitmap(lpszResourceName);
  322. m_bkbrush.DeleteObject();
  323. m_bkbrush.CreatePatternBrush(&tmp); 
  324. m_bBKStyle=bs_BITMAP;
  325. SetButtonEx(m_lpszResourceName);
  326. Invalidate();
  327. }
  328. BOOL CMyToolBar::LoadToolBar(UINT nIDResource)
  329. {
  330. LPCTSTR lpszResourceName=MAKEINTRESOURCE(nIDResource);
  331. ASSERT_VALID(this);
  332. ASSERT(lpszResourceName != NULL);
  333. // determine location of the bitmap in resource fork
  334. HINSTANCE hInst = AfxFindResourceHandle(lpszResourceName, RT_TOOLBAR);
  335. HRSRC hRsrc = ::FindResource(hInst, lpszResourceName, RT_TOOLBAR);
  336. if (hRsrc == NULL)
  337. return FALSE;
  338. CBitmap tmp;
  339. BITMAP BitMap; 
  340. tmp.LoadBitmap(lpszResourceName);
  341. if(tmp.GetBitmap(&BitMap)==0)
  342. return FALSE;
  343. HGLOBAL hGlobal = LoadResource(hInst, hRsrc);
  344. if (hGlobal == NULL)
  345. return FALSE;
  346. CToolBarData* pData = (CToolBarData*)LockResource(hGlobal);
  347. if (pData == NULL)
  348. return FALSE;
  349. ASSERT(pData->wVersion == 1);
  350.     m_pbtButtonStyle=new BYTE[pData->wItemCount];
  351. UINT* pItems = new UINT[pData->wItemCount];
  352. for (int i = 0; i < pData->wItemCount; i++)
  353. pItems[i] = pData->items()[i];
  354. BOOL bResult = SetButtons(pItems, pData->wItemCount);
  355. delete[] pItems;
  356.     m_nButtonCount=pData->wItemCount;
  357. for(int j = 0; j <pData->wItemCount; j++)
  358. {
  359. if(TBBS_SEPARATOR==GetButtonStyle(j))
  360. {
  361. m_nButtonCount--;
  362. m_pbtButtonStyle[j]=1;
  363. }
  364. else
  365. m_pbtButtonStyle[j]=0;
  366. }
  367. m_nSeparatorCount=pData->wItemCount-m_nButtonCount;
  368. pData->wWidth=BitMap.bmWidth/m_nButtonCount;
  369. pData->wHeight=(UINT)BitMap.bmHeight;
  370. m_nButtonWidth=BitMap.bmWidth/m_nButtonCount;
  371. m_nButtonHeight=pData->wHeight;
  372. if (bResult)
  373. {
  374. // set new sizes of the buttons
  375. CSize sizeImage(pData->wWidth, pData->wHeight);
  376. CSize sizeButton(pData->wWidth + 7, pData->wHeight + 7);
  377. m_ButtonSize=sizeButton;
  378. SetSizes(sizeButton, sizeImage);
  379. // load bitmap now that sizes are known by the toolbar control
  380. bResult = LoadBitmap(lpszResourceName);
  381. }
  382. m_ButtonImageSize.cx=pData->wWidth;
  383. m_ButtonImageSize.cy=pData->wHeight;
  384. UnlockResource(hGlobal);
  385. FreeResource(hGlobal);
  386. return bResult;
  387. }
  388. BOOL CMyToolBar::LoadBitmap(LPCTSTR lpszResourceName)
  389. {
  390. ASSERT_VALID(this);
  391. ASSERT(lpszResourceName != NULL);
  392. // determine location of the bitmap in resource fork
  393. HINSTANCE hInstImageWell = AfxFindResourceHandle(lpszResourceName, RT_BITMAP);
  394. HRSRC hRsrcImageWell = ::FindResource(hInstImageWell, lpszResourceName, RT_BITMAP);
  395. if (hRsrcImageWell == NULL)
  396. return FALSE;
  397. HGLOBAL hglb;
  398. if ((hglb = LoadResource(hInstImageWell, hRsrcImageWell)) == NULL)
  399. return FALSE;
  400. LPBITMAPINFOHEADER lpBitmap = (LPBITMAPINFOHEADER)LockResource(hglb);
  401. if (lpBitmap == NULL)
  402. return NULL;
  403. m_wToolBarBitCount=lpBitmap->biBitCount;
  404. ::FreeResource(hglb);
  405.     //if(m_wToolBarBitCount<8)//如果工具栏颜色小于等于256色则调用原函数
  406. //{
  407. // return CToolBar::LoadBitmap(lpszResourceName);
  408. //}
  409. m_lpszResourceName=lpszResourceName;
  410.     SetButtonEx(lpszResourceName);
  411. return TRUE;
  412. }
  413. BOOL CMyToolBar::SetButtonEx(UINT nIDResource)
  414. {
  415. LPCTSTR lpszResourceName=MAKEINTRESOURCE(nIDResource);
  416. return SetButtonEx(lpszResourceName);
  417. }
  418. BOOL CMyToolBar::SetButtonEx(LPCTSTR lpszResourceName)
  419. {
  420.     CClientDC rdc(this);
  421. CDC dc1,dc2,dc3,dc4;
  422. CBitmap bmp1,bmp2,bmp3,bmp4,bmpd;
  423. COLORREF pixelcolor,maskcolor;
  424. BITMAP bitmap;
  425. BYTE gray=0;
  426. CRect rc4;
  427. rc4.top=rc4.left=0;
  428. if (m_dwStyle & CBRS_ORIENT_HORZ)
  429. {
  430. rc4.right=m_ButtonSize.cx*m_nButtonCount+6*m_nSeparatorCount;
  431. rc4.bottom=m_ButtonSize.cy;
  432. }
  433. else
  434. {
  435. rc4.right=m_ButtonSize.cx;
  436. rc4.bottom=m_ButtonSize.cy*m_nButtonCount+6*m_nSeparatorCount;
  437. }
  438. bmp1.LoadBitmap(lpszResourceName);
  439. bmp1.GetBitmap(&bitmap); 
  440. bmp2.CreateBitmap(bitmap.bmWidth,bitmap.bmHeight,1,bitmap.bmBitsPixel,NULL); 
  441. bmp3.CreateBitmap(bitmap.bmWidth,bitmap.bmHeight,1,bitmap.bmBitsPixel,NULL);  
  442. bmp4.CreateBitmap(rc4.right,rc4.bottom,1,bitmap.bmBitsPixel,NULL);  
  443. bmpd.CreateBitmap(bitmap.bmWidth,bitmap.bmHeight,1,bitmap.bmBitsPixel,NULL);  
  444. dc1.CreateCompatibleDC(&rdc);
  445. dc2.CreateCompatibleDC(&rdc);
  446. dc3.CreateCompatibleDC(&rdc);
  447. dc4.CreateCompatibleDC(&rdc);
  448. dc1.SelectObject(&bmp1);
  449. dc2.SelectObject(&bmp2); 
  450. dc3.SelectObject(&bmp3); 
  451. dc4.SelectObject(&bmp4); 
  452.     CRect rect;
  453. GetWindowRect(&rect);
  454. ScreenToClient(&rect);
  455. if(m_bBKStyle==bs_RGB)
  456. {
  457. int r1,g1,b1;
  458. for(int i=0;i<=rc4.Height();i++)
  459. {
  460. r1=GetRValue(m_clrBack);
  461. g1=GetGValue(m_clrBack);
  462. b1=GetBValue(m_clrBack);
  463. r1=(r1+3*abs(rc4.top+i-rect.Height()/2-rect.top))>255?255:(r1+3*abs(rc4.top+i-rect.Height()/2-rect.top));
  464. g1=(g1+3*abs(rc4.top+i-rect.Height()/2-rect.top))>255?255:(g1+3*abs(rc4.top+i-rect.Height()/2-rect.top));
  465. b1=(b1+3*abs(rc4.top+i-rect.Height()/2-rect.top))>255?255:(b1+3*abs(rc4.top+i-rect.Height()/2-rect.top));
  466. CPen pen(PS_SOLID, 1, RGB(r1, g1, b1));
  467. CPen *old = dc4.SelectObject(&pen);
  468. dc4.MoveTo(rc4.left,rc4.top+i);
  469. dc4.LineTo(rc4.right,rc4.top+i);
  470. dc4.SelectObject(old);
  471. }
  472. }
  473. else
  474. dc4.FillRect(&rc4,&m_bkbrush); 
  475. maskcolor=dc1.GetPixel(0,0);
  476.     CRect rc2;
  477. rc2.left=rc2.top=0;
  478. rc2.right=bitmap.bmWidth;
  479. rc2.bottom=bitmap.bmHeight;
  480. ///////////////////////////////////////////////////////////////////
  481. //dc2.FillRect(&rc2,&m_bkbrush);
  482.     int totalbuttons=m_nButtonCount+m_nSeparatorCount;
  483. int buttonindex=0;
  484. int btnindex=0;
  485. for(buttonindex=0,btnindex=0;buttonindex<totalbuttons;buttonindex++)
  486. {
  487.     if(0==m_pbtButtonStyle[buttonindex])
  488. {
  489. if (m_dwStyle & CBRS_ORIENT_HORZ)
  490. dc2.BitBlt(btnindex*m_nButtonWidth,0,m_nButtonWidth,m_nButtonHeight,&dc4,btnindex*m_ButtonSize.cx+6*(buttonindex-btnindex)+3,3,SRCCOPY);
  491. else if(m_dwStyle & CBRS_ORIENT_VERT)
  492. dc2.BitBlt(btnindex*m_nButtonWidth,0,m_nButtonWidth,m_nButtonHeight,&dc4,3,btnindex*m_ButtonSize.cy+6*(buttonindex-btnindex)+3,SRCCOPY);
  493. //dc2.BitBlt(0,btnindex*m_nButtonHeight,m_nButtonWidth,m_nButtonHeight,&dc4,3,3,SRCCOPY);
  494. btnindex++;
  495. }
  496. }
  497. TransparentBltEx(dc2.m_hDC,0,0,bitmap.bmWidth,bitmap.bmHeight,
  498. dc1.m_hDC,0,0,bitmap.bmWidth,bitmap.bmHeight,maskcolor); 
  499. LPBYTE lpbts;
  500. WORD ncount=0;
  501. ncount=(WORD)(bitmap.bmHeight*bitmap.bmWidthBytes);  
  502. lpbts=new BYTE[ncount];
  503. bmp2.GetBitmapBits(ncount,lpbts); 
  504. bmpd.SetBitmapBits(ncount,lpbts);
  505. m_imglstNormal.DeleteImageList(); 
  506. m_imglstNormal.Create(m_nButtonWidth, m_nButtonHeight, bitmap.bmBitsPixel|ILC_MASK, 1, 1);
  507. m_imglstNormal.Add(&bmpd, maskcolor);
  508. GetToolBarCtrl().SetImageList(&m_imglstNormal);
  509. /////////////////////////////////////////////////////////////////////
  510. //dc3.FillRect(&rc2,&m_bkbrush);
  511. dc3.BitBlt(0,0,bitmap.bmWidth,bitmap.bmHeight,&dc1,0,0,SRCCOPY); 
  512. for(int l1=0;l1<bitmap.bmWidth;l1++)
  513. {
  514. for(int c1=0;c1<bitmap.bmHeight;c1++) 
  515. {
  516. pixelcolor=dc3.GetPixel(l1,c1);
  517. //gray=(BYTE)(GetRValue(pixelcolor)*0.2+GetGValue(pixelcolor)*0.4+GetBValue(pixelcolor)*0.2);
  518. if(pixelcolor!=maskcolor)
  519. dc3.SetPixel(l1,c1,RGB(250,250,250)); 
  520. }
  521. }
  522. for(buttonindex=0,btnindex=0;buttonindex<totalbuttons;buttonindex++)
  523. {
  524.     if(0==m_pbtButtonStyle[buttonindex])
  525. {
  526. if (m_dwStyle & CBRS_ORIENT_HORZ)
  527. dc2.BitBlt(btnindex*m_nButtonWidth,0,m_nButtonWidth,m_nButtonHeight,&dc4,btnindex*m_ButtonSize.cx+6*(buttonindex-btnindex)+3,3,SRCCOPY);
  528. else if(m_dwStyle & CBRS_ORIENT_VERT)
  529. dc2.BitBlt(btnindex*m_nButtonWidth,0,m_nButtonWidth,m_nButtonHeight,&dc4,3,btnindex*m_ButtonSize.cy+6*(buttonindex-btnindex)+3,SRCCOPY);
  530. //dc2.BitBlt(0,btnindex*m_nButtonHeight,m_nButtonWidth,m_nButtonHeight,&dc4,3,3,SRCCOPY);
  531. btnindex++;
  532. }
  533. }
  534. TransparentBltEx(dc2.m_hDC,1,1,bitmap.bmWidth,bitmap.bmHeight,
  535. dc3.m_hDC,0,0,bitmap.bmWidth,bitmap.bmHeight,maskcolor); 
  536. dc3.BitBlt(0,0,bitmap.bmWidth,bitmap.bmHeight,&dc1,0,0,SRCCOPY); 
  537. for(int l=0;l<bitmap.bmWidth;l++)
  538. {
  539. for(int c=0;c<bitmap.bmHeight;c++) 
  540. {
  541. pixelcolor=dc3.GetPixel(l,c);
  542. gray=(BYTE)(GetRValue(pixelcolor)*0.2+GetGValue(pixelcolor)*0.4+GetBValue(pixelcolor)*0.2);
  543. if(pixelcolor!=maskcolor)
  544. dc3.SetPixel(l,c,RGB(gray,gray,gray)); 
  545. }
  546. }
  547. TransparentBltEx(dc2.m_hDC,0,0,bitmap.bmWidth,bitmap.bmHeight,
  548. dc3.m_hDC,0,0,bitmap.bmWidth,bitmap.bmHeight,maskcolor); 
  549. bmp2.GetBitmapBits(ncount,lpbts); 
  550. bmpd.SetBitmapBits(ncount,lpbts);
  551. m_imglstDisabled.DeleteImageList(); 
  552. m_imglstDisabled.Create(m_nButtonWidth, m_nButtonHeight, bitmap.bmBitsPixel|ILC_MASK, 1, 1);
  553. m_imglstDisabled.Add(&bmpd, maskcolor);
  554. GetToolBarCtrl().SetDisabledImageList(&m_imglstDisabled);
  555. /////////////////////////////////////////////////////////////////////
  556. dc3.BitBlt(0,0,bitmap.bmWidth,bitmap.bmHeight,&dc1,0,0,SRCCOPY); 
  557. for(int l3=0;l3<bitmap.bmWidth;l3++)
  558. {
  559. for(int c3=0;c3<bitmap.bmHeight;c3++) 
  560. {
  561. pixelcolor=dc3.GetPixel(l3,c3);
  562. if(pixelcolor!=maskcolor)
  563. dc3.SetPixel(l3,c3,
  564. RGB(
  565. GetRValue(pixelcolor)>240?255:GetRValue(pixelcolor)+15,
  566. GetGValue(pixelcolor)>200?255:GetGValue(pixelcolor)+55,
  567. GetBValue(pixelcolor)>240?255:GetBValue(pixelcolor)+15
  568. )); 
  569. }
  570. }
  571. for(buttonindex=0,btnindex=0;buttonindex<totalbuttons;buttonindex++)
  572. {
  573.     if(0==m_pbtButtonStyle[buttonindex])
  574. {
  575. if (m_dwStyle & CBRS_ORIENT_HORZ)
  576. dc2.BitBlt(btnindex*m_nButtonWidth,0,m_nButtonWidth,m_nButtonHeight,&dc4,btnindex*m_ButtonSize.cx+6*(buttonindex-btnindex)+3,3,SRCCOPY);
  577. else if(m_dwStyle & CBRS_ORIENT_VERT)
  578. dc2.BitBlt(btnindex*m_nButtonWidth,0,m_nButtonWidth,m_nButtonHeight,&dc4,3,btnindex*m_ButtonSize.cy+6*(buttonindex-btnindex)+3,SRCCOPY);
  579. //dc2.BitBlt(0,btnindex*m_nButtonHeight,m_nButtonWidth,m_nButtonHeight,&dc4,3,3,SRCCOPY);
  580. btnindex++;
  581. }
  582. }
  583. TransparentBltEx(dc2.m_hDC,0,0,bitmap.bmWidth,bitmap.bmHeight,
  584. dc3.m_hDC,0,0,bitmap.bmWidth,bitmap.bmHeight,maskcolor); 
  585. bmp2.GetBitmapBits(ncount,lpbts); 
  586. bmpd.SetBitmapBits(ncount,lpbts);
  587. m_imglstHot.DeleteImageList(); 
  588. m_imglstHot.Create(m_nButtonWidth, m_nButtonHeight, bitmap.bmBitsPixel|ILC_MASK, 1, 1);
  589. m_imglstHot.Add(&bmpd, maskcolor);
  590. GetToolBarCtrl().SetHotImageList(&m_imglstHot);
  591. CRect rt;
  592. GetToolBarCtrl().GetClientRect(&rt); 
  593. TBBUTTONINFO btinfo;
  594. int wx=0;
  595. for(UINT k=0;k<m_nButtonCount;k++)
  596. {
  597. GetToolBarCtrl().GetButtonInfo(k,&btinfo);
  598. wx+=btinfo.cx;
  599. }
  600. delete[] lpbts;
  601. return TRUE;
  602. }
  603. void CMyToolBar::MouseHover(POINT pt)
  604. {
  605. if (m_dwStyle & CBRS_FLOATING) {
  606. // no grippers
  607. } else if (m_dwStyle & CBRS_ORIENT_HORZ) {
  608. // gripper at left
  609. CRect rc;
  610. GetWindowRect(&rc);
  611. rc.right=rc.left+8;
  612. if(rc.PtInRect(pt))
  613. ::SetCursor(::LoadCursor(NULL,IDC_SIZEALL)); 
  614. } else {
  615. // gripper at top
  616. CRect rc;
  617. GetWindowRect(&rc);
  618. rc.bottom=rc.top+8;
  619. if(rc.PtInRect(pt))
  620. ::SetCursor(::LoadCursor(NULL,IDC_SIZEALL)); 
  621. }
  622. }
  623. BOOL CMyToolBar::PreTranslateMessage(MSG* pMsg)
  624. {
  625. switch(pMsg->message)
  626. {
  627. case WM_MOUSEMOVE:
  628. MouseHover(pMsg->pt);
  629.         break;
  630. }
  631. return CToolBar::PreTranslateMessage(pMsg); 
  632. }
  633. void CMyToolBar::OnBarStyleChange(DWORD dwOldStyle, DWORD dwNewStyle)
  634. {
  635. CToolBar::OnBarStyleChange(dwOldStyle,dwNewStyle);
  636. if(( (dwOldStyle & CBRS_ORIENT_HORZ)&& (dwOldStyle & CBRS_ORIENT_VERT))||
  637. ( (dwOldStyle & CBRS_ORIENT_VERT)&& (dwOldStyle & CBRS_ORIENT_HORZ)))
  638. {
  639. LoadBitmap(m_lpszResourceName);
  640. Invalidate();
  641. }
  642. }
  643. void CMyToolBar::SetShowText(BOOL blnShow)
  644. {
  645. CSize szButton;
  646. int i;
  647. if(blnShow)
  648. {
  649. for(i = 0; i <GetCount(); i++) //为每个按钮增加文本
  650. {
  651. CString strButton;
  652. UINT id =GetItemID(i);
  653. if(!strButton.LoadString(id)) continue;
  654. int j = strButton.Find(_T('n'));
  655. if(j < 0) continue;
  656. strButton = strButton.Right(strButton.GetLength() - j - 1);
  657. SetButtonText(i,strButton); 
  658. }
  659. szButton.cx=m_ButtonSize.cx+15;
  660. szButton.cy=m_ButtonSize.cy+15;
  661. }
  662. else
  663. {
  664. szButton.cx=m_ButtonSize.cx;
  665. szButton.cy=m_ButtonSize.cy;
  666. }
  667. SetSizes(szButton,m_ButtonImageSize);
  668. }
  669. void CMyToolBar::SetSizes(SIZE sizeButton)
  670. {
  671. SetSizes(sizeButton,m_ButtonImageSize);
  672. }
  673. void CMyToolBar::SetSizes(SIZE sizeButton, SIZE sizeImage )
  674. {
  675. CToolBar::SetSizes(sizeButton,sizeImage);
  676. }