WBButton.cpp
上传用户:xiuanze55
上传日期:2013-06-16
资源大小:85k
文件大小:10k
源码类别:

其他数据库

开发平台:

Visual C++

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