WBButton.cpp
上传用户:wangdan
上传日期:2022-06-30
资源大小:739k
文件大小:8k
源码类别:

3D图形编程

开发平台:

Visual C++

  1. // WBButton.cpp : 
  2. // 
  3. //功能:位图按钮类,实现按钮的位图显示
  4. //修改人:王健  
  5. //日期:2001年12月8日
  6. //
  7. #include "stdafx.h"
  8. #include "../Test1.h"  //在此加入当前应用类的头文件
  9. #include "WBButton.h"
  10. #include "AutoFont.h"
  11. #ifdef _DEBUG
  12. #define new DEBUG_NEW
  13. #undef THIS_FILE
  14. static char THIS_FILE[] = __FILE__;
  15. #endif
  16. /////////////////////////////////////////////////////////////////////////////
  17. // CWBButton
  18. CWBButton::CWBButton()
  19. {
  20.     m_TopHeight = 8;
  21.     m_BottomHeight = 8;
  22.     m_LeftWidth = 8;
  23.     m_RightWidth = 17;
  24.     m_State = notInited;
  25.     m_pFnt = new CAutoFont("宋体");   // MS Sans Serif");
  26.     m_BkColor = RGB(255,0,255);
  27.     
  28.     m_RcId       = 0;       // Resource ID
  29.     m_NumofPics  = 0;  
  30. }
  31. CWBButton::~CWBButton()
  32. {
  33.     NormalBitmap.DeleteObject();
  34.     SelectBitmap.DeleteObject();
  35.     FocusBitmap.DeleteObject();
  36.     DisableBitmap.DeleteObject();
  37.     SAFE_DELETE(m_pFnt);
  38. }
  39. BEGIN_MESSAGE_MAP(CWBButton, CButton)
  40. //{{AFX_MSG_MAP(CWBButton)
  41.     ON_WM_ERASEBKGND()
  42. //}}AFX_MSG_MAP
  43. END_MESSAGE_MAP()
  44. //在对按钮初始化时,自动为按钮属性添加自画属性(OWNERDRAW)
  45. void CWBButton::PreSubclassWindow() 
  46. {
  47.     SetButtonStyle(GetButtonStyle()|BS_OWNERDRAW);
  48. }
  49. void CWBButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) 
  50. {
  51.     CDC xdc;
  52.     xdc.Attach( lpDrawItemStruct->hDC );
  53.     CRect rc;
  54.     GetClientRect(rc);
  55.     CMemDC dc(&xdc,rc);
  56.     
  57.     UINT state = lpDrawItemStruct->itemState ;
  58.     bool IsDisable = false;
  59. if (state & ODS_FOCUS)
  60.     {
  61. DrawBitmap( &dc, focus );
  62. if (state & ODS_SELECTED)
  63.         { 
  64.             DrawBitmap( &dc, select );
  65.             rc.left += 5;
  66. }
  67. }
  68. else if (state & ODS_DISABLED)
  69.     {
  70.         IsDisable = true;
  71.      DrawBitmap( &dc, disable );
  72.     }else{
  73.         DrawBitmap( &dc, normal );
  74.     }
  75.     int imode = dc.SetBkMode(TRANSPARENT);
  76.     CFont *pOldFnt = dc.SelectObject(m_pFnt);
  77.     COLORREF oldColor;
  78.     if(IsDisable)
  79.       oldColor = dc.SetTextColor( GetSysColor(COLOR_GRAYTEXT) );
  80.     else
  81.       oldColor = dc.SetTextColor( m_pFnt->GetFontColor() );
  82.         CString txt;
  83.         GetWindowText(txt);
  84.         dc.DrawText(txt,rc,DT_CENTER | DT_VCENTER | DT_SINGLELINE);
  85.       
  86.     dc.SetTextColor( oldColor );
  87.     dc.SelectObject(pOldFnt);
  88.     dc.SetBkMode(imode );
  89. }
  90. bool CWBButton::LoadBitmaps
  91. (
  92.      UINT id, int count ,    
  93.      int TopHeight, int BottomHeight, int LeftWidth, int RightWidth
  94. )
  95. {
  96.     m_TopHeight = TopHeight;
  97.     m_BottomHeight = BottomHeight;
  98.     m_LeftWidth = LeftWidth;
  99.     m_RightWidth = RightWidth;
  100.     m_RcId       = id;       // Resource ID
  101.     m_NumofPics  = count;  
  102.     CBitmap bmp;
  103.     if( !bmp.LoadBitmap(id) ) return false;
  104.     if( !InitBitmap( bmp, NormalBitmap, 0, count ) ) return false;
  105.     if( !InitBitmap( bmp, SelectBitmap, 1, count ) ) return false;
  106.     if( !InitBitmap( bmp, DisableBitmap,2, count ) ) return false;
  107.     if( !InitBitmap( bmp, FocusBitmap,  3, count ) ) return false;
  108.     bmp.DeleteObject();
  109.     return true;
  110. }
  111. bool CWBButton::InitBitmap( CBitmap & src, CBitmap & dist, int index, int count )
  112. {
  113.     CDC * pDC = GetDC();
  114.     CDC memDC; 
  115.     memDC.CreateCompatibleDC(pDC);
  116.     CDC srcDC;
  117.     srcDC.CreateCompatibleDC(pDC);
  118.     CBitmap* pOldBitmap1;
  119.     pOldBitmap1 = srcDC.SelectObject(&src);
  120.     BITMAP bmpinfo;
  121.     src.GetBitmap(&bmpinfo);
  122.     int bmpWidth = bmpinfo.bmWidth / count;
  123.     int bmpHeight = bmpinfo.bmHeight;
  124.     int orix = bmpWidth * index;
  125.     CRect rc;
  126.     GetClientRect(rc);
  127.     CBitmap* pOldBitmap2;
  128.     dist.DeleteObject();
  129.     dist.CreateCompatibleBitmap(pDC,rc.Width(),rc.Height());
  130.     pOldBitmap2 = memDC.SelectObject(&dist);
  131.     // lefttop,leftbottom,righttop,rightbottom
  132.     if( !memDC.BitBlt(0,0,m_LeftWidth, m_TopHeight, &srcDC,orix,0,SRCCOPY) ) return false;
  133.     
  134.     if( !memDC.BitBlt(0,rc.bottom - m_BottomHeight,m_LeftWidth, m_BottomHeight, 
  135.                 &srcDC,orix,bmpHeight - m_BottomHeight,SRCCOPY) ) return false;
  136.     if( !memDC.BitBlt(rc.right - m_RightWidth, 0 ,m_RightWidth, m_TopHeight, 
  137.                  &srcDC,orix + bmpWidth - m_RightWidth,0,SRCCOPY) ) return false;
  138.     if( !memDC.BitBlt(rc.right - m_RightWidth,rc.bottom - m_BottomHeight,m_RightWidth,m_BottomHeight,
  139.                  &srcDC,orix + bmpWidth - m_RightWidth,bmpHeight - m_BottomHeight,SRCCOPY) ) return false;
  140.     // entireimage
  141.     memDC.StretchBlt(m_LeftWidth,
  142.                      m_TopHeight,
  143.                      rc.Width()  - ( m_LeftWidth + m_RightWidth ) ,
  144.                      rc.Height() -  ( m_TopHeight + m_BottomHeight) ,
  145.                      &srcDC,
  146.                      orix + m_LeftWidth,
  147.                      m_TopHeight,
  148.                      bmpWidth - ( m_LeftWidth + m_RightWidth ) ,
  149.                      bmpHeight - ( m_TopHeight + m_BottomHeight ) ,SRCCOPY);
  150.     
  151.     // topbar,bottombar( Stretch )
  152.     memDC.StretchBlt(m_LeftWidth,0, rc.Width() - (m_LeftWidth + m_RightWidth), m_TopHeight,
  153.                      &srcDC,orix + m_LeftWidth, 0, bmpWidth - ( m_LeftWidth + m_RightWidth) , m_TopHeight,SRCCOPY);
  154.     memDC.StretchBlt(m_LeftWidth, rc.bottom - m_BottomHeight, rc.Width() - ( m_LeftWidth + m_RightWidth), m_BottomHeight,
  155.                      &srcDC,orix + m_LeftWidth,bmpHeight - m_BottomHeight,bmpWidth - ( m_LeftWidth + m_RightWidth) , m_BottomHeight,SRCCOPY );
  156.     // sidebar ( STretch? )
  157.     memDC.StretchBlt(0,m_TopHeight,m_LeftWidth,rc.bottom - m_TopHeight - m_BottomHeight ,
  158.                      &srcDC, orix,m_TopHeight, m_LeftWidth, bmpHeight - ( m_TopHeight + m_BottomHeight ) ,SRCCOPY);
  159.     memDC.StretchBlt(rc.right - m_RightWidth ,m_TopHeight,m_RightWidth,rc.bottom - m_TopHeight - m_BottomHeight ,
  160.                      &srcDC, orix +  bmpWidth - m_RightWidth,m_TopHeight, m_RightWidth, bmpHeight - m_TopHeight - m_BottomHeight ,SRCCOPY);
  161.     srcDC.SelectObject(pOldBitmap1);
  162.     memDC.SelectObject(pOldBitmap2);
  163.     ReleaseDC(pDC);
  164.     ReleaseDC(&srcDC);
  165.     ReleaseDC(&memDC);
  166.      m_State = FileLoaded;
  167.     
  168.     return true;
  169. }
  170. void CWBButton::DrawBitmap( CDC * pDC, int mode )
  171. {
  172.     if( m_State < FileLoaded ) return;
  173.     CRect rc;
  174.     GetClientRect(rc);
  175.  
  176. COLORREF crOldBack = pDC->SetBkColor(WHITE);
  177. COLORREF crOldText = pDC->SetTextColor(BLACK);
  178. CDC dcImage, dcTrans;
  179. // Create two memory dcs for the image and the mask
  180. dcImage.CreateCompatibleDC(pDC);
  181. dcTrans.CreateCompatibleDC(pDC);
  182. // Select the image into the appropriate dc
  183.     CBitmap* pOldBitmapImage;
  184.     switch(mode)
  185.     {
  186.     case normal:
  187.    pOldBitmapImage  = dcImage.SelectObject(&NormalBitmap);
  188.        break;
  189.     case select:
  190.    pOldBitmapImage  = dcImage.SelectObject(&SelectBitmap);
  191.        break;
  192.     case focus:
  193.    pOldBitmapImage  = dcImage.SelectObject(&FocusBitmap);
  194.        break;
  195.     case disable:
  196.    pOldBitmapImage  = dcImage.SelectObject(&DisableBitmap);
  197.        break;
  198.     default:
  199.         return;
  200.     }
  201.       
  202. // Create the mask bitmap
  203. CBitmap bitmapTrans;
  204. int nWidth = rc.Width();
  205. int nHeight = rc.Height();
  206. bitmapTrans.CreateBitmap(nWidth, nHeight, 1, 1, NULL);
  207.     // Select the mask bitmap into the appropriate dc
  208. CBitmap* pOldBitmapTrans = dcTrans.SelectObject(&bitmapTrans);
  209. // Build mask based on transparent colour
  210. dcImage.SetBkColor(m_BkColor);
  211. dcTrans.BitBlt(0, 0, nWidth, nHeight, &dcImage, 0, 0, SRCCOPY);
  212. // Do the work - True Mask method - cool if not actual display
  213. pDC->BitBlt(0, 0, nWidth, nHeight, &dcImage, 0, 0, SRCINVERT);
  214. pDC->BitBlt(0, 0, nWidth, nHeight, &dcTrans, 0, 0, SRCAND);
  215. pDC->BitBlt(0, 0, nWidth, nHeight, &dcImage, 0, 0, SRCINVERT);
  216. // Restore settings
  217. dcImage.SelectObject(pOldBitmapImage);
  218. dcTrans.SelectObject(pOldBitmapTrans);
  219. pDC->SetBkColor(crOldBack);
  220. pDC->SetTextColor(crOldText);
  221. }
  222. BOOL CWBButton::OnEraseBkgnd(CDC* pDC) 
  223. {
  224.     return TRUE;
  225. }
  226. void CWBButton::SetButtonDef( int TopHeight, int BottomHeight, int LeftWidth, int RightWidth )
  227.     m_TopHeight = TopHeight;
  228.     m_BottomHeight = BottomHeight;
  229.     m_LeftWidth = LeftWidth;
  230.     m_RightWidth = RightWidth;
  231.     if( m_RcId != 0 && m_NumofPics != 0 )
  232.     {
  233.        LoadBitmaps(m_RcId,m_NumofPics,TopHeight,BottomHeight,LeftWidth,RightWidth);
  234.     }
  235. }
  236. void CWBButton::SetTextFont( CFont & fnt )
  237.     LOGFONT lf;
  238.     fnt.GetLogFont(&lf);
  239.     SAFE_DELETE(m_pFnt);
  240.     m_pFnt = new CAutoFont(lf);
  241. }
  242. void CWBButton::SetFontColor( COLORREF color )
  243. {
  244.     m_pFnt->SetFontColor(color);
  245.     UpdateWindow();
  246. }