www.pudn.com > VX.rar > AviToolbar.cpp


// AviToolbar.cpp : implementation file 
// 
 
#include "stdafx.h" 
#include "DTASvm.h" 
#include "AviToolbar.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
///////////////////////////////////////////////////////////////////////////// 
// CAviToolbar 
 
CAviToolbar::CAviToolbar() 
{ 
	m_clrHilite = ::GetSysColor(COLOR_BTNHIGHLIGHT);//RGB(222,230,255); 
	m_clrNormal = RGB(212,208,200);//::GetSysColor(COLOR_BTNFACE); 
	m_clrShadow = ::GetSysColor(COLOR_MENUTEXT);//RGB(64,0,128);// 
	m_bBackgroundImage=TRUE; 
	m_bmpName=""; 
} 
 
CAviToolbar::~CAviToolbar() 
{ 
} 
 
 
BEGIN_MESSAGE_MAP(CAviToolbar, CToolBar) 
	//{{AFX_MSG_MAP(CAviToolbar) 
	ON_WM_CREATE() 
	ON_WM_SIZE() 
	ON_WM_NCPAINT() 
	ON_COMMAND(IDM_SETSKIN, OnSetskin) 
	ON_WM_SYSCOLORCHANGE() 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CAviToolbar message handlers 
 
int CAviToolbar::OnCreate(LPCREATESTRUCT lpCreateStruct)  
{ 
	if (CToolBar::OnCreate(lpCreateStruct) == -1) 
		return -1; 
 
 							//创建AVI并自动播放 
	avi.Create(ACS_AUTOPLAY |WS_CHILD | WS_VISIBLE,CRect(0,0,0,0),this,ID_MYAVI); 
	avi.Open(IDR_AVI1);		//打开AVI	       	             
	avi.Play(0,-1,-1);		//从第一帧开始循环播放 
	 
	return 0; 
} 
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
// 重置工具栏大小 移动视频位置,使之紧靠工具栏右侧. 
 
void CAviToolbar::OnSize(UINT nType, int cx, int cy)  
{ 
	CToolBar::OnSize(nType, cx, cy); 
	 
	//SetHeight(22);				//设置工具栏高度 
	CRect toolbarclient; 
	GetClientRect(&toolbarclient);	//得到工具栏坐标 
	toolbarclient.left = toolbarclient.right-44; 
	//toolbarclient.OffsetRect(1,0);	//调整矩形位置 
	avi.MoveWindow(toolbarclient.left,10,toolbarclient.right,32);  //移动AVI 
} 
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
// 重画工具栏 
void CAviToolbar::OnNcPaint()  
{ 
	CControlBar::EraseNonClient(); 
	CWindowDC dc(this); 
	 
	CRect pRect; 
	CRect pOver; 
	GetClientRect( &pRect ); 
	pOver = pRect; 
	pOver.right = pOver.left + 3; 
	pOver.OffsetRect(2,0); 
 
	CBrush brFill(m_clrNormal); 
	dc.FillRect(pOver,&brFill); 
	InvalidateRect( &pRect, TRUE ); 
	DrawGripper(dc); 
	// Do not call CToolBar::OnNcPaint() for painting messages 
} 
 
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
// 给工具栏添加工具栏把手 
void CAviToolbar::DrawGripper(CDC & dc) const 
{ 
	CRect rcGripper; 
	GetWindowRect(rcGripper); 
	ScreenToClient(rcGripper); 
	rcGripper.OffsetRect(-rcGripper.left, -rcGripper.top); 
		 
			 
	// Gripper at left 
	rcGripper.DeflateRect(3, 3); 
	//rcGripper.left -= 0; 
	rcGripper.top += 1; 
	rcGripper.right = rcGripper.left; 
	rcGripper.bottom -= 44; 
 
	for(int i=1;i<=23;i++) 
	{ 
		dc.Draw3dRect(rcGripper, m_clrHilite, m_clrShadow ); 
				 
		rcGripper.OffsetRect(3, 0); 
		dc.Draw3dRect(rcGripper, m_clrHilite, m_clrShadow); 
		rcGripper.OffsetRect(-3, 2); 
	} 
} 
 
void CAviToolbar::SetTooltext() 
{ 
//+++++++++++++++++++++++++++设置工具栏文字++++++++++++++++++++++++++++++++++++++++++ 
	for(int i = 0; i < CToolBar::GetCount(); i++) 
	{ 
		UINT id = CToolBar::GetItemID(i); 
		CString s; 
		if(!s.LoadString(id)) continue; 
		int j = s.Find(_T('\n')); 
		if(j < 0) continue; 
		s = s.Right(s.GetLength() - j - 1); 
		CToolBar::SetButtonText(i,s);  
		//CJToolBar::SetButtonDropDown(IDR_POPUP); 
	} 
	// Adjust sizes to include text 
	CRect rect; 
	CToolBar::GetItemRect(0,&rect); 
	CToolBar::SetSizes(rect.Size(),CSize(32,31)); 
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
} 
 
BOOL CAviToolbar::LoadBMPImage( LPCTSTR sBMPFile, CBitmap& bitmap, CPalette *pPal ) 
{ 
	CFile file; 
	if( !file.Open( sBMPFile, CFile::modeRead) ) 
		return FALSE; 
 
	BITMAPFILEHEADER bmfHeader; 
 
	// Read file header 
	if (file.Read((LPSTR)&bmfHeader, sizeof(bmfHeader)) != sizeof(bmfHeader)) 
		return FALSE; 
 
	// File type should be 'BM' 
	if (bmfHeader.bfType != ((WORD) ('M' << 8) | 'B')) 
		return FALSE; 
 
	// Get length of the remainder of the file and allocate memory 
	DWORD nPackedDIBLen = file.GetLength() - sizeof(BITMAPFILEHEADER); 
	HGLOBAL hDIB = ::GlobalAlloc(GMEM_FIXED, nPackedDIBLen); 
	if (hDIB == 0) 
		return FALSE; 
 
	// Read the remainder of the bitmap file. 
	if (file.ReadHuge((LPSTR)hDIB, nPackedDIBLen) != nPackedDIBLen ) 
	{ 
		::GlobalFree(hDIB); 
		return FALSE; 
	} 
 
 
	BITMAPINFOHEADER &bmiHeader = *(LPBITMAPINFOHEADER)hDIB ; 
	BITMAPINFO &bmInfo = *(LPBITMAPINFO)hDIB ; 
 
	// If bmiHeader.biClrUsed is zero we have to infer the number 
	// of colors from the number of bits used to specify it. 
	int nColors = bmiHeader.biClrUsed ? bmiHeader.biClrUsed :  
						1 << bmiHeader.biBitCount; 
 
	LPVOID lpDIBBits; 
	if( bmInfo.bmiHeader.biBitCount > 8 ) 
		lpDIBBits = (LPVOID)((LPDWORD)(bmInfo.bmiColors + bmInfo.bmiHeader.biClrUsed) +  
			((bmInfo.bmiHeader.biCompression == BI_BITFIELDS) ? 3 : 0)); 
	else 
		lpDIBBits = (LPVOID)(bmInfo.bmiColors + nColors); 
 
	// Create the logical palette 
	if( pPal != NULL ) 
	{ 
		// Create the palette 
		if( nColors <= 256 ) 
		{ 
			UINT nSize = sizeof(LOGPALETTE) + (sizeof(PALETTEENTRY) * nColors); 
			LOGPALETTE *pLP = (LOGPALETTE *) new BYTE[nSize]; 
 
			pLP->palVersion = 0x300; 
			pLP->palNumEntries = nColors; 
 
			for( int i=0; i < nColors; i++) 
			{ 
				pLP->palPalEntry[i].peRed = bmInfo.bmiColors[i].rgbRed; 
				pLP->palPalEntry[i].peGreen = bmInfo.bmiColors[i].rgbGreen; 
				pLP->palPalEntry[i].peBlue = bmInfo.bmiColors[i].rgbBlue; 
				pLP->palPalEntry[i].peFlags = 0; 
			} 
 
			pPal->CreatePalette( pLP ); 
 
			delete[] pLP; 
		} 
	} 
 
	CClientDC dc(NULL); 
	CPalette* pOldPalette = NULL; 
	if( pPal ) 
	{ 
		pOldPalette = dc.SelectPalette( pPal, FALSE ); 
		dc.RealizePalette(); 
	} 
 
	HBITMAP hBmp = CreateDIBitmap( dc.m_hDC,		// handle to device context  
				&bmiHeader,	// pointer to bitmap size and format data  
				CBM_INIT,	// initialization flag  
				lpDIBBits,	// pointer to initialization data  
				&bmInfo,	// pointer to bitmap color-format data  
				DIB_RGB_COLORS);		// color-data usage  
 
	bitmap.Detach(); 
	bitmap.Attach( hBmp ); 
 
	if( pOldPalette ) 
		dc.SelectPalette( pOldPalette, FALSE ); 
 
	::GlobalFree(hDIB); 
	return TRUE; 
} 
 
void CAviToolbar::SetBackImage () 
{ 
	CReBarCtrl& rc = m_wndReBar.GetReBarCtrl (); 
 
	for (UINT i = 0; i < rc.GetBandCount(); i++) 
	{ 
		REBARBANDINFO info; 
		memset (&info, 0, sizeof (REBARBANDINFO)); 
		info.cbSize = sizeof (info); 
		info.fMask = RBBIM_BACKGROUND; 
		info.hbmBack = m_bBackgroundImage ? (HBITMAP)m_bmpBack : NULL; 
		rc.SetBandInfo (i, &info); 
 
		CRect rectBand; 
		rc.GetRect (i, rectBand); 
 
		rc.InvalidateRect (rectBand); 
		rc.UpdateWindow (); 
 
		info.fMask = RBBIM_CHILD; 
		rc.GetBandInfo (i, &info); 
 
		if (info.hwndChild != NULL) 
		{ 
			::InvalidateRect (info.hwndChild, NULL, TRUE); 
			::UpdateWindow (info.hwndChild); 
		} 
	} 
} 
 
void CAviToolbar::LoadBackImage () 
{ 
	if(m_bmpName.GetLength()>0) 
		LoadBMPImage(m_bmpName,m_bmpBack,NULL); 
	else 
		LoadBMPImage("res\\back.bmp",m_bmpBack,NULL); 
} 
 
void CAviToolbar::OnSetskin()  
{ 
	// TODO: Add your command handler code here 
 
} 
 
void CAviToolbar::OnSysColorChange()  
{ 
	CToolBar::OnSysColorChange(); 
	 
	LoadBackImage (); 
	SetBackImage (); 
	 
}