www.gusucode.com > 大学排课系统,VC++实现,能实现根据教师及课程资源自动排 > 大学排课系统,VC++实现,能实现根据教师及课程资源自动排课/ARRANGE/WBButton.cpp
//////////////////////////////////////////////// // 功能: 位图按钮类,实现按钮的位图显示 // 修改人: 徐景周 // 日期: 2001年2月8日 //////////////////////////////////////////////// #include "stdafx.h" #include "WBButton.h" #include "AutoFont.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CWBButton CWBButton::CWBButton() { m_TopHeight = 8; m_BottomHeight = 8; m_LeftWidth = 8; m_RightWidth = 17; m_State = notInited; m_pFnt = new CAutoFont("宋体"); m_BkColor = RGB(255,0,255); m_RcId = 0; // Resource ID m_NumofPics = 0; } CWBButton::~CWBButton() { NormalBitmap.DeleteObject(); SelectBitmap.DeleteObject(); FocusBitmap.DeleteObject(); DisableBitmap.DeleteObject(); SAFE_DELETE(m_pFnt); } BEGIN_MESSAGE_MAP(CWBButton, CButton) //{{AFX_MSG_MAP(CWBButton) ON_WM_ERASEBKGND() //}}AFX_MSG_MAP END_MESSAGE_MAP() //在对按钮初始化时,自动为按钮属性添加自画属性(OWNERDRAW),jinghzou xu void CWBButton::PreSubclassWindow() { SetButtonStyle(GetButtonStyle()|BS_OWNERDRAW); } void CWBButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) { CDC xdc; xdc.Attach( lpDrawItemStruct->hDC ); CRect rc; GetClientRect(rc); CMemDC dc(&xdc,rc); UINT state = lpDrawItemStruct->itemState ; bool IsDisable = false; if (state & ODS_FOCUS) { DrawBitmap( &dc, focus ); if (state & ODS_SELECTED) { DrawBitmap( &dc, select ); rc.left += 5; } } else if (state & ODS_DISABLED) { IsDisable = true; DrawBitmap( &dc, disable ); }else{ DrawBitmap( &dc, normal ); } int imode = dc.SetBkMode(TRANSPARENT); CFont *pOldFnt = dc.SelectObject(m_pFnt); COLORREF oldColor; if(IsDisable) oldColor = dc.SetTextColor( GetSysColor(COLOR_GRAYTEXT) ); else oldColor = dc.SetTextColor( m_pFnt->GetFontColor() ); CString txt; GetWindowText(txt); dc.DrawText(txt,rc,DT_CENTER | DT_VCENTER | DT_SINGLELINE); dc.SetTextColor( oldColor ); dc.SelectObject(pOldFnt); dc.SetBkMode(imode ); } bool CWBButton::LoadBitmaps ( UINT bmpID, int count , int TopHeight, int BottomHeight, int LeftWidth, int RightWidth ) { m_TopHeight = TopHeight; m_BottomHeight = BottomHeight; m_LeftWidth = LeftWidth; m_RightWidth = RightWidth; m_RcId = bmpID; // Resource ID m_NumofPics = count; CBitmap bmp; if( !bmp.LoadBitmap(bmpID) ) return false; if( !InitBitmap( bmp, NormalBitmap, 0, count ) ) return false; if( !InitBitmap( bmp, SelectBitmap, 1, count ) ) return false; if( !InitBitmap( bmp, DisableBitmap,2, count ) ) return false; if( !InitBitmap( bmp, FocusBitmap, 3, count ) ) return false; bmp.DeleteObject(); return true; } //加入与按钮ID相联系涵数,jingzhou xu bool CWBButton::AutoLoadBitmaps ( UINT bottonID,CWnd* pParent,UINT bmpID, int count , int TopHeight, int BottomHeight, int LeftWidth, int RightWidth ) { m_TopHeight = TopHeight; m_BottomHeight = BottomHeight; m_LeftWidth = LeftWidth; m_RightWidth = RightWidth; if (!SubclassDlgItem(bottonID, pParent)) //初始化按按钮ID,jingzhou xu return FALSE; m_RcId = bmpID; // Resource ID m_NumofPics = count; CBitmap bmp; if( !bmp.LoadBitmap(bmpID) ) return false; if( !InitBitmap( bmp, NormalBitmap, 0, count ) ) return false; if( !InitBitmap( bmp, SelectBitmap, 1, count ) ) return false; if( !InitBitmap( bmp, DisableBitmap,2, count ) ) return false; if( !InitBitmap( bmp, FocusBitmap, 3, count ) ) return false; bmp.DeleteObject(); return true; } bool CWBButton::InitBitmap( CBitmap & src, CBitmap & dist, int index, int count ) { CDC * pDC = GetDC(); CDC memDC; memDC.CreateCompatibleDC(pDC); CDC srcDC; srcDC.CreateCompatibleDC(pDC); CBitmap* pOldBitmap1; pOldBitmap1 = srcDC.SelectObject(&src); BITMAP bmpinfo; src.GetBitmap(&bmpinfo); int bmpWidth = bmpinfo.bmWidth / count; int bmpHeight = bmpinfo.bmHeight; int orix = bmpWidth * index; CRect rc; GetClientRect(rc); CBitmap* pOldBitmap2; dist.DeleteObject(); dist.CreateCompatibleBitmap(pDC,rc.Width(),rc.Height()); pOldBitmap2 = memDC.SelectObject(&dist); // lefttop,leftbottom,righttop,rightbottom if( !memDC.BitBlt(0,0,m_LeftWidth, m_TopHeight, &srcDC,orix,0,SRCCOPY) ) return false; if( !memDC.BitBlt(0,rc.bottom - m_BottomHeight,m_LeftWidth, m_BottomHeight, &srcDC,orix,bmpHeight - m_BottomHeight,SRCCOPY) ) return false; if( !memDC.BitBlt(rc.right - m_RightWidth, 0 ,m_RightWidth, m_TopHeight, &srcDC,orix + bmpWidth - m_RightWidth,0,SRCCOPY) ) return false; if( !memDC.BitBlt(rc.right - m_RightWidth,rc.bottom - m_BottomHeight,m_RightWidth,m_BottomHeight, &srcDC,orix + bmpWidth - m_RightWidth,bmpHeight - m_BottomHeight,SRCCOPY) ) return false; // entireimage memDC.StretchBlt(m_LeftWidth, m_TopHeight, rc.Width() - ( m_LeftWidth + m_RightWidth ) , rc.Height() - ( m_TopHeight + m_BottomHeight) , &srcDC, orix + m_LeftWidth, m_TopHeight, bmpWidth - ( m_LeftWidth + m_RightWidth ) , bmpHeight - ( m_TopHeight + m_BottomHeight ) ,SRCCOPY); // topbar,bottombar( Stretch ) memDC.StretchBlt(m_LeftWidth,0, rc.Width() - (m_LeftWidth + m_RightWidth), m_TopHeight, &srcDC,orix + m_LeftWidth, 0, bmpWidth - ( m_LeftWidth + m_RightWidth) , m_TopHeight,SRCCOPY); memDC.StretchBlt(m_LeftWidth, rc.bottom - m_BottomHeight, rc.Width() - ( m_LeftWidth + m_RightWidth), m_BottomHeight, &srcDC,orix + m_LeftWidth,bmpHeight - m_BottomHeight,bmpWidth - ( m_LeftWidth + m_RightWidth) , m_BottomHeight,SRCCOPY ); // sidebar ( STretch? ) memDC.StretchBlt(0,m_TopHeight,m_LeftWidth,rc.bottom - m_TopHeight - m_BottomHeight , &srcDC, orix,m_TopHeight, m_LeftWidth, bmpHeight - ( m_TopHeight + m_BottomHeight ) ,SRCCOPY); memDC.StretchBlt(rc.right - m_RightWidth ,m_TopHeight,m_RightWidth,rc.bottom - m_TopHeight - m_BottomHeight , &srcDC, orix + bmpWidth - m_RightWidth,m_TopHeight, m_RightWidth, bmpHeight - m_TopHeight - m_BottomHeight ,SRCCOPY); srcDC.SelectObject(pOldBitmap1); memDC.SelectObject(pOldBitmap2); ReleaseDC(pDC); //ReleaseDC(&srcDC); //ReleaseDC(&memDC); //zwh modifing,2002.6.20: CreateCompatibleDC() <----> DeleteDC(); // GetDC() <----> ReleaseDC(); srcDC.DeleteDC(); memDC.DeleteDC(); m_State = FileLoaded; return true; } void CWBButton::DrawBitmap( CDC * pDC, int mode ) { if( m_State < FileLoaded ) return; CRect rc; GetClientRect(rc); COLORREF crOldBack = pDC->SetBkColor(RGB(255,255,255)); COLORREF crOldText = pDC->SetTextColor(RGB(0,0,0)); CDC dcImage, dcTrans; // Create two memory dcs for the image and the mask dcImage.CreateCompatibleDC(pDC); dcTrans.CreateCompatibleDC(pDC); // Select the image into the appropriate dc CBitmap* pOldBitmapImage; switch(mode) { case normal: pOldBitmapImage = dcImage.SelectObject(&NormalBitmap); break; case select: pOldBitmapImage = dcImage.SelectObject(&SelectBitmap); break; case focus: pOldBitmapImage = dcImage.SelectObject(&FocusBitmap); break; case disable: pOldBitmapImage = dcImage.SelectObject(&DisableBitmap); break; default: { //zwh Adding,2002.6.20 dcImage.DeleteDC(); dcTrans.DeleteDC(); } return; } // Create the mask bitmap CBitmap bitmapTrans; int nWidth = rc.Width(); int nHeight = rc.Height(); bitmapTrans.CreateBitmap(nWidth, nHeight, 1, 1, NULL); // Select the mask bitmap into the appropriate dc CBitmap* pOldBitmapTrans = dcTrans.SelectObject(&bitmapTrans); // Build mask based on transparent colour dcImage.SetBkColor(m_BkColor); dcTrans.BitBlt(0, 0, nWidth, nHeight, &dcImage, 0, 0, SRCCOPY); // Do the work - True Mask method - cool if not actual display pDC->BitBlt(0, 0, nWidth, nHeight, &dcImage, 0, 0, SRCINVERT); pDC->BitBlt(0, 0, nWidth, nHeight, &dcTrans, 0, 0, SRCAND); pDC->BitBlt(0, 0, nWidth, nHeight, &dcImage, 0, 0, SRCINVERT); // Restore settings dcImage.SelectObject(pOldBitmapImage); dcTrans.SelectObject(pOldBitmapTrans); pDC->SetBkColor(crOldBack); pDC->SetTextColor(crOldText); //zwh Adding,2002.6.20 dcImage.DeleteDC(); dcTrans.DeleteDC(); } BOOL CWBButton::OnEraseBkgnd(CDC* pDC) { return FALSE; } void CWBButton::SetButtonDef( int TopHeight, int BottomHeight, int LeftWidth, int RightWidth ) { m_TopHeight = TopHeight; m_BottomHeight = BottomHeight; m_LeftWidth = LeftWidth; m_RightWidth = RightWidth; if( m_RcId != 0 && m_NumofPics != 0 ) { LoadBitmaps(m_RcId,m_NumofPics,TopHeight,BottomHeight,LeftWidth,RightWidth); } } void CWBButton::SetTextFont( CFont & fnt ) { LOGFONT lf; fnt.GetLogFont(&lf); SAFE_DELETE(m_pFnt); m_pFnt = new CAutoFont(lf); } void CWBButton::SetFontColor( COLORREF color ) { m_pFnt->SetFontColor(color); UpdateWindow(); }