www.pudn.com > 毕业留念册.rar > Dib.cpp


// Dib.cpp: implementation of the CDib class. 
// 
////////////////////////////////////////////////////////////////////// 
 
#include "stdafx.h" 
#include "Browse.h" 
#include "Dib.h" 
 
#ifdef _DEBUG 
#undef THIS_FILE 
static char THIS_FILE[]=__FILE__; 
#define new DEBUG_NEW 
#endif 
 
#include "Dib.h" 
#include "Mmsystem.h" 
#include "math.h" 
#include "Jpeg.h" 
CDib::CDib() 
{ 
	m_hDib = NULL; 
	m_pPalette = NULL; 
	m_Index=0; 
} 
 
CDib::~CDib() 
{ 
	if ( m_hDib != NULL) 
		GlobalFree(m_hDib); 
	if ( m_pPalette != NULL) 
	{ 
		delete m_pPalette; 
		m_pPalette = NULL; 
	} 
} 
 
BOOL CDib::Read(CFile *pFile) 
{ 
	BITMAPFILEHEADER bmfHeader; 
	DWORD dwBitsSize; 
	LPSTR pDIB; 
 
	dwBitsSize = pFile->GetLength(); 
 
	if (pFile->Read((LPSTR)&bmfHeader, sizeof(bmfHeader)) != sizeof(bmfHeader)) 
		return FALSE; 
 
	if (bmfHeader.bfType != DIB_HEADER_MARKER) 
		return NULL; 
 
	m_hDib = (HDIB)GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT, dwBitsSize); 
	if (m_hDib == 0) 
	{ 
		return FALSE; 
	} 
	pDIB = (LPSTR)GlobalLock(m_hDib); 
 
	if (pFile->ReadHuge(pDIB, dwBitsSize - sizeof(BITMAPFILEHEADER)) != 
		dwBitsSize - sizeof(BITMAPFILEHEADER) ) 
	{ 
		GlobalUnlock(m_hDib); 
		GlobalFree(m_hDib); 
		return FALSE; 
	} 
	GlobalUnlock(m_hDib); 
	return TRUE; 
} 
 
 
DWORD CDib::DIBWidth(LPSTR lpDIB) 
{ 
	LPBITMAPINFOHEADER lpbmi;   
	LPBITMAPCOREHEADER lpbmc;   
 
	lpbmi = (LPBITMAPINFOHEADER)lpDIB; 
	lpbmc = (LPBITMAPCOREHEADER)lpDIB; 
 
	if (IS_WIN30_DIB(lpDIB)) 
		return lpbmi->biWidth; 
	else 
		return (DWORD)lpbmc->bcWidth; 
} 
 
 
DWORD CDib::GetWidth() 
{ 
	if(m_hDib == NULL) 
		return 0; 
	LPSTR lpDIB = (LPSTR)GlobalLock(m_hDib); 
	return DIBWidth(lpDIB); 
}	 
 
 
DWORD CDib::DIBHeight(LPSTR lpDIB) 
{ 
	LPBITMAPINFOHEADER lpbmi;   
	LPBITMAPCOREHEADER lpbmc;   
 
	lpbmi = (LPBITMAPINFOHEADER)lpDIB; 
	lpbmc = (LPBITMAPCOREHEADER)lpDIB; 
 
 
	if (IS_WIN30_DIB(lpDIB)) 
		return lpbmi->biHeight; 
	else  
		return (DWORD)lpbmc->bcHeight; 
} 
 
 
DWORD CDib::GetHeight() 
{	 
	if(m_hDib == NULL) 
		return 0; 
	LPSTR lpDIB = (LPSTR)GlobalLock(m_hDib); 
	return DIBHeight(lpDIB); 
} 
 
HPALETTE CDib::CreateDIBPalette(LPBITMAPINFOHEADER lpbi) 
{ 
	LPLOGPALETTE      lpPal;	 
	HANDLE			  hLogPal;	 
	HPALETTE		  hPal = NULL;	 
	int				  i, wNumColors;	 
	LPBITMAPINFO	  lpbmi; 
	 
 
	if ( ! lpbi) 
		return NULL; 
 
	lpbmi = (LPBITMAPINFO)lpbi; 
 
	wNumColors = DIBNumColors((LPSTR)lpbi); 
 
	if (wNumColors) 
	{ 
 
		hLogPal = GlobalAlloc(GHND, sizeof(LOGPALETTE) + 
			sizeof(PALETTEENTRY) * wNumColors); 
 
		if ( !hLogPal) 
			return NULL; 
 
		lpPal = (LPLOGPALETTE)GlobalLock(hLogPal); 
 
		lpPal->palVersion = PALVERSION; 
		lpPal->palNumEntries = wNumColors; 
 
		for ( i = 0; i < wNumColors; i++) 
		{ 
			lpPal->palPalEntry[i].peRed =  lpbmi->bmiColors[i].rgbRed; 
			lpPal->palPalEntry[i].peGreen = lpbmi->bmiColors[i].rgbGreen; 
			lpPal->palPalEntry[i].peBlue =  lpbmi->bmiColors[i].rgbBlue; 
			lpPal->palPalEntry[i].peFlags = 0; 
		} 
 
		hPal = CreatePalette(lpPal); 
		if (!hPal) 
		{ 
			GlobalUnlock(hLogPal); 
			GlobalFree(hLogPal); 
			return NULL; 
		} 
	} 
 
	GlobalUnlock(hLogPal); 
	GlobalFree(hLogPal); 
 
	return hPal; 
} 
 
 
BOOL CDib::BuildPalette() 
{ 
	if (m_pPalette != NULL) 
	{ 
		delete m_pPalette; 
		m_pPalette = NULL; 
	} 
	LPBITMAPINFOHEADER lpbi; 
	lpbi = (LPBITMAPINFOHEADER)GlobalLock(m_hDib); 
	HPALETTE hPalette = CreateDIBPalette(lpbi); 
	if (hPalette == NULL) 
		return FALSE; 
	m_pPalette = new CPalette; 
	m_pPalette->Attach(hPalette); 
	return TRUE; 
} 
 
 
WORD CDib::DIBNumColors(LPSTR lpDIB) 
{ 
	WORD wBitCount; 
 
	if(IS_WIN30_DIB(lpDIB)) 
	{ 
		DWORD dwClrUsed; 
		dwClrUsed = ((LPBITMAPINFOHEADER)lpDIB)->biClrUsed; 
		if (IS_WIN30_DIB(lpDIB)) 
		{ 
			DWORD dwClrUsed; 
			dwClrUsed = ((LPBITMAPINFOHEADER)lpDIB)->biClrUsed; 
			if (dwClrUsed) 
			{ 
				AfxMessageBox("由BITMAOINFOHEADER导出"); 
				return (WORD)dwClrUsed; 
			} 
		} 
 
		if (IS_WIN30_DIB(lpDIB)) 
		{ 
			wBitCount = ((LPBITMAPINFOHEADER)lpDIB)->biBitCount; 
			CString str; 
			str.Format("%d",wBitCount); 
 
		} 
		else 
		{ 
			wBitCount = ((LPBITMAPCOREHEADER)lpDIB)->bcBitCount; 
		} 
 
		switch (wBitCount) 
		{ 
		case 1: 
			return 2; 
		case 4: 
			return 16; 
		case 8: 
			return 256; 
		default: 
			return 0; 
		} 
	} 
	return 0; 
} 
 
 
BOOL CDib::PaintDIB(HDC hDC, LPRECT lpDCRect, LPRECT lpDIBRect) 
{ 
	LPSTR    lpDIBHdr;            
	LPSTR    lpDIBBits;           
	HPALETTE hPal; 
	BOOL     bSuccess  =FALSE;       
	HPALETTE hOldPal = NULL;        
 
	if (m_hDib == NULL) 
		return FALSE; 
 
	lpDIBHdr  = (LPSTR) GlobalLock(m_hDib); 
	lpDIBBits = FindDIBBits(lpDIBHdr); 
 
 
	if (m_pPalette != NULL) 
	{ 
		hPal = (HPALETTE) m_pPalette->m_hObject; 
		hOldPal = ::SelectPalette(hDC, hPal, TRUE); 
	} 
	::SetStretchBltMode(hDC, COLORONCOLOR); 
 
 
	if ((RECTWIDTH(lpDCRect)  == RECTWIDTH(lpDIBRect)) && 
	   (RECTHEIGHT(lpDCRect) == RECTHEIGHT(lpDIBRect))) 
		bSuccess = ::SetDIBitsToDevice(hDC,                     
								   lpDCRect->left,              
								   lpDCRect->top,               
								   RECTWIDTH(lpDCRect),         
								   RECTHEIGHT(lpDCRect),        
								   lpDIBRect->left,             
								   (int)DIBHeight(lpDIBHdr) - 
									  lpDIBRect->top - 
									  RECTHEIGHT(lpDIBRect),    
								   0,                           
								   (WORD)DIBHeight(lpDIBHdr),   
								   lpDIBBits,                   
								   (LPBITMAPINFO)lpDIBHdr,      
								   DIB_RGB_COLORS);             
   else 
	  bSuccess = ::StretchDIBits(hDC,                           
							   lpDCRect->left,                  
							   lpDCRect->top,                   
							   RECTWIDTH(lpDCRect),             
							   RECTHEIGHT(lpDCRect),            
							   lpDIBRect->left,                 
							   lpDIBRect->top,                  
							   RECTWIDTH(lpDIBRect),            
							   RECTHEIGHT(lpDIBRect),           
							   lpDIBBits,                       
							   (LPBITMAPINFO)lpDIBHdr,          
							   DIB_RGB_COLORS,                  
							   SRCCOPY);                        
 
   GlobalUnlock(m_hDib); 
 
 
	if (hOldPal != NULL) 
	{ 
		::SelectPalette(hDC, hOldPal, TRUE); 
	} 
 
   return bSuccess; 
} 
 
 
LPSTR CDib::FindDIBBits(LPSTR lpbi) 
{ 
	return (lpbi + *(LPDWORD)lpbi + PaletteSize(lpbi)); 
} 
 
WORD CDib::PaletteSize(LPSTR lpbi) 
{ 
 
   if (IS_WIN30_DIB (lpbi)) 
	  return (WORD)(DIBNumColors(lpbi) * sizeof(RGBQUAD)); 
   else 
	  return (WORD)(DIBNumColors(lpbi) * sizeof(RGBTRIPLE)); 
} 
 
HDIB CDib::Detach() 
{ 
	if (m_hDib == NULL) 
		return NULL; 
 
	HDIB hDib = m_hDib; 
	m_hDib = NULL; 
	 
	if ( m_pPalette != NULL) 
	{ 
		delete m_pPalette; 
		m_pPalette = NULL; 
	} 
	return m_hDib; 
} 
 
void CDib::Delay() 
{ 
	Sleep(25); 
} 
 
void CDib::Scan(CDC *pDC, int nLeft, int nTop, int nWidth, int nHeight) 
{ 
	LPSTR    lpDIBHdr; 
	LPSTR    lpDIBBits;    
	LPBITMAPINFO lpBMI; 
	if (m_hDib == NULL) 
		return; 
	lpDIBHdr  = (LPSTR) GlobalLock(m_hDib); 
	lpDIBBits = FindDIBBits(lpDIBHdr); 
	lpBMI = (LPBITMAPINFO)lpDIBHdr; 
 
	CBrush brush(RGB(244,196,242)); 
	CBrush* oldBrush=pDC->SelectObject(&brush); 
	CPen pen(PS_SOLID,1,RGB(0,0,255)); 
	CPen* oldPen=pDC->SelectObject(&pen); 
	pDC->Rectangle(nLeft,nTop,nLeft+nWidth,nTop+nHeight); 
 
	int nScanWidth=25; 
 
	int nStart=0; 
	int nEnd=25; 
	for(nEnd=25; nEnd < nHeight + 25; nEnd = nEnd+25) 
	{ 
		int temp1 = GetHeight(); 
		int dibWidth = int(25 * temp1/nHeight); 
		int dibEnd = int(nEnd * temp1/nHeight); 
		int dibStart = int(nStart * temp1/nHeight); 
 
		StretchDIBits(pDC->GetSafeHdc(), 
					nLeft, nStart+nTop, 
					nWidth, 25, 
					0,temp1 - dibEnd, 
					GetWidth(),dibWidth, 
					lpDIBBits, lpBMI, 
					DIB_RGB_COLORS,SRCCOPY); 
		nStart = nEnd; 
		Delay(); 
		Delay(); 
		Delay(); 
	} 
	oldBrush=pDC->SelectObject(&brush); 
	oldPen=pDC->SelectObject(&pen); 
	pDC->SelectObject(oldBrush); 
	pDC->SelectObject(oldPen); 
} 
 
void CDib::MoveDown(CDC *pDC, int nLeft, int nTop, int nWidth, int nHeight) 
{ 
		LPSTR    lpDIBHdr; 
	LPSTR    lpDIBBits;    
	LPBITMAPINFO lpBMI; 
	if (m_hDib == NULL) 
		return; 
	lpDIBHdr  = (LPSTR) GlobalLock(m_hDib); 
	lpDIBBits = FindDIBBits(lpDIBHdr); 
	lpBMI = (LPBITMAPINFO)lpDIBHdr; 
	//创建画刷和画笔,用于清除 
	CBrush brush(RGB(244,196,242)); 
	CBrush* oldBrush=pDC->SelectObject(&brush); 
	CPen pen(PS_SOLID,1,RGB(0,0,255)); 
	CPen* oldPen=pDC->SelectObject(&pen); 
	//恢复背景 
	pDC->Rectangle(nLeft,nTop,nWidth+nLeft,nHeight+nTop); 
	 
	//向下平移 
	for(int i=0;i < nHeight + 15;i=i+15) 
	{ 
		int temp1=GetHeight(); 
		int temp=int(i*temp1/nHeight); 
		StretchDIBits(pDC->GetSafeHdc(), 
					nLeft, nTop, 
					nWidth, i, 
					0,0, 
					GetWidth(),temp, 
					lpDIBBits, lpBMI, 
					DIB_RGB_COLORS,SRCCOPY); 
		Delay(); 
	} 
	pDC->SelectObject(oldBrush); 
	pDC->SelectObject(oldPen); 
} 
void CDib::MoveUp(CDC *pDC, int nLeft, int nTop, int nWidth, int nHeight) 
{ 
	LPSTR    lpDIBHdr; 
	LPSTR    lpDIBBits;    
	LPBITMAPINFO lpBMI; 
	if (m_hDib == NULL) 
		return; 
	lpDIBHdr  = (LPSTR) GlobalLock(m_hDib); 
	lpDIBBits = FindDIBBits(lpDIBHdr); 
	lpBMI = (LPBITMAPINFO)lpDIBHdr; 
	//创建画刷和画笔,用于清除 
	CBrush brush(RGB(244,196,242)); 
	CBrush* oldBrush=pDC->SelectObject(&brush); 
	CPen pen(PS_SOLID,1,RGB(0,0,255)); 
	CPen* oldPen=pDC->SelectObject(&pen); 
	//恢复背景 
	pDC->Rectangle(nLeft,nTop,nWidth+nLeft,nHeight+nTop); 
	 
	for(int i=0;iGetSafeHdc(), 
					nLeft, nTop+nHeight-i, 
					nWidth, i, 
					0,GetHeight()-temp, 
					GetWidth(),temp, 
					lpDIBBits, lpBMI, 
					DIB_RGB_COLORS,SRCCOPY); 
		Delay();	 
	} 
	pDC->SelectObject(oldBrush); 
	pDC->SelectObject(oldPen); 
} 
 
void CDib::Masic(CDC *pDC, int nLeft, int nTop, int nWidth, int nHeight) 
{ 
	LPSTR    lpDIBHdr; 
	LPSTR    lpDIBBits;    
	LPBITMAPINFO lpBMI; 
	if (m_hDib == NULL) 
		return; 
	lpDIBHdr  = (LPSTR) GlobalLock(m_hDib); 
	lpDIBBits = FindDIBBits(lpDIBHdr); 
	lpBMI = (LPBITMAPINFO)lpDIBHdr; 
	CBrush brush(RGB(244,196,242)); 
	CBrush* oldBrush=pDC->SelectObject(&brush); 
	CPen pen(PS_SOLID,1,RGB(0,0,255)); 
	CPen* oldPen=pDC->SelectObject(&pen); 
	pDC->Rectangle(nLeft,nTop,nWidth+nLeft,nHeight+nTop); 
	Delay(); 
 
	pDC->SetStretchBltMode(COLORONCOLOR); 
	int nDividedSize=25; 
	int nWidthAppend=0; 
	int nHeightAppend=0; 
 
	if((nWidth%nDividedSize)!=0) 
		nWidthAppend=1; 
	if((nHeight%nDividedSize)!=0) 
		nHeightAppend=1; 
	long lDividedNum=(nWidth/nDividedSize+nWidthAppend)*(nHeight/nDividedSize+nHeightAppend); 
 
	POINT *point=new POINT[lDividedNum]; 
	long mx=0;  
	long my=0;  
	int w=GetWidth(); 
	int h=GetHeight(); 
	double wScale=(double)w/(double)nWidth; 
	double hScale=(double)h/(double)nHeight; 
	for(long mi=0;minWidth) 
		{ 
			mx=0; 
			my=my+nDividedSize; 
		} 
	} 
 
	double fmax=RAND_MAX; 
	for(mi=lDividedNum-1;mi>=0;mi--) 
	{ 
		int randNum=rand(); 
		int n=(int)((double)randNum*(double)lDividedNum/fmax); 
		mx=point[n].x; 
		my=point[n].y; 
		StretchDIBits(pDC->GetSafeHdc(), 
						mx+nLeft, my+nTop, nDividedSize, nDividedSize, 
						(int)(mx*wScale), (int)((nHeight-my-nDividedSize)*hScale), (int)(nDividedSize*wScale), (int)(nDividedSize*hScale), 
						lpDIBBits, lpBMI, 
						DIB_RGB_COLORS,SRCCOPY); 
		Delay(); 
		point[n].x=-1; 
		point[n].y=-1; 
	} 
	for(mi=lDividedNum-1;mi>=0;mi--) 
	{ 
		if(point[mi].x!=-1&&point[mi].y!=-1) 
		{ 
			mx=point[mi].x; 
			my=point[mi].y; 
			StretchDIBits(pDC->GetSafeHdc(), 
						mx+nLeft, my+nTop, nDividedSize, nDividedSize, 
						(int)(mx*wScale), (int)((nHeight-my-nDividedSize)*hScale), (int)(nDividedSize*wScale), (int)(nDividedSize*hScale), 
						lpDIBBits, lpBMI, 
						DIB_RGB_COLORS,SRCCOPY);		 
		} 
	} 
	delete []point; 
} 
 
void CDib::Grid(CDC *pDC, int nLeft, int nTop, int nWidth, int nHeight) 
{ 
		LPSTR    lpDIBHdr; 
	LPSTR    lpDIBBits;    
	LPBITMAPINFO lpBMI; 
	if (m_hDib == NULL) 
		return; 
	lpDIBHdr  = (LPSTR) GlobalLock(m_hDib); 
	lpDIBBits = FindDIBBits(lpDIBHdr); 
	lpBMI = (LPBITMAPINFO)lpDIBHdr; 
	CBrush brush(RGB(244,196,242)); 
	CBrush* oldBrush=pDC->SelectObject(&brush); 
	CPen pen(PS_SOLID,1,RGB(0,0,255)); 
	CPen* oldPen=pDC->SelectObject(&pen); 
 
	pDC->Rectangle(nLeft,nTop,nWidth+nLeft,nTop+nHeight); 
 
	int nScanLine=nWidth/20; 
	int w=GetWidth(); 
	int h=GetHeight(); 
 
	for(int i=0;iGetSafeHdc(), 
						j, nTop, nScanLine, (i+1), 
						j-nLeft, 0, (int)(nScanLine), (int)(i+1), 
						lpDIBBits, lpBMI, 
						DIB_RGB_COLORS,SRCCOPY); 
			 
			int k=j+nScanLine; 
			StretchDIBits(pDC->GetSafeHdc(), 
						k, nTop+nHeight-i, nScanLine, i, 
						k-nLeft,nHeight-i, nScanLine,i, 
						lpDIBBits,lpBMI, 
						DIB_RGB_COLORS,SRCCOPY); 
		} 
		Delay(); 
	} 
 
	pDC->SelectObject(oldBrush); 
	pDC->SelectObject(oldPen);	 
} 
 
void CDib::Window(CDC *pDC, int nLeft, int nTop, int nWidth, int nHeight) 
{//垂直百叶窗 
		LPSTR    lpDIBHdr; 
	LPSTR    lpDIBBits;    
	LPBITMAPINFO lpBMI; 
	if (m_hDib == NULL) 
		return; 
	lpDIBHdr  = (LPSTR) GlobalLock(m_hDib); 
	lpDIBBits = FindDIBBits(lpDIBHdr); 
	lpBMI = (LPBITMAPINFO)lpDIBHdr; 
 
	CBrush brush(RGB(244,196,242)); 
	CBrush* oldBrush=pDC->SelectObject(&brush); 
	CPen pen(PS_SOLID,1,RGB(0,0,255)); 
	CPen* oldPen=pDC->SelectObject(&pen); 
 
	pDC->Rectangle(nLeft,nTop,nWidth+nLeft,nTop+nHeight); 
 
	int nScanLine=15; 
 
	for(int i=0;iGetSafeHdc(), 
						j,nTop, 
						1,nHeight, 
						j-nLeft,0, 
						1,GetHeight(), 
						lpDIBBits, lpBMI, 
						DIB_RGB_COLORS,SRCCOPY); 
		} 
		Delay(); 
		Delay(); 
	} 
	pDC->SelectObject(oldBrush); 
	pDC->SelectObject(oldPen);	 
} 
 
void CDib::WindowLine(CDC *pDC, int nLeft, int nTop, int nWidth, int nHeight) 
{ 
		LPSTR    lpDIBHdr; 
	LPSTR    lpDIBBits;    
	LPBITMAPINFO lpBMI; 
	if (m_hDib == NULL) 
		return; 
	lpDIBHdr  = (LPSTR) GlobalLock(m_hDib); 
	lpDIBBits = FindDIBBits(lpDIBHdr); 
	lpBMI = (LPBITMAPINFO)lpDIBHdr; 
 
	CBrush brush(RGB(244,196,242)); 
	CBrush* oldBrush=pDC->SelectObject(&brush); 
	CPen pen(PS_SOLID,1,RGB(0,0,255)); 
	CPen* oldPen=pDC->SelectObject(&pen); 
 
	pDC->Rectangle(nLeft,nTop,nLeft+nWidth,nHeight+nTop); 
 
	int nScanLine=15; 
 
	for(int i=0;iGetSafeHdc(), 
						nLeft,j, 
						nWidth,1, 
						0,nHeight-(j-nTop), 
						GetWidth(),1, 
						lpDIBBits, lpBMI, 
						DIB_RGB_COLORS,SRCCOPY); 
		} 
		Delay(); 
		Delay(); 
	} 
	pDC->SelectObject(oldBrush); 
	pDC->SelectObject(oldPen); 
} 
 
void CDib::ZoomPicture(CDC *pDC, int nLeft, int nTop, int nWidth, int nHeight) 
{ 
	LPSTR    lpDIBHdr; 
	LPSTR    lpDIBBits;    
	LPBITMAPINFO lpBMI; 
	if (m_hDib == NULL) 
		return; 
	lpDIBHdr  = (LPSTR) GlobalLock(m_hDib); 
	lpDIBBits = FindDIBBits(lpDIBHdr); 
	lpBMI = (LPBITMAPINFO)lpDIBHdr; 
 
	StretchDIBits(pDC->GetSafeHdc(), 
				nLeft,nTop, 
				nWidth,nHeight, 
				0,0, 
				GetWidth(),GetHeight(), 
				lpDIBBits, lpBMI, 
				DIB_RGB_COLORS,SRCCOPY); 
} 
 
DWORD CDib::BytesPerLine(HDIB hDIB) 
{ 
	LPSTR lpDIB = (LPSTR)GlobalLock(hDIB); 
	DWORD dw = WIDTHBYTES(((LPBITMAPINFOHEADER)lpDIB)->biWidth * ((LPBITMAPINFOHEADER)lpDIB)->biPlanes * ((LPBITMAPINFOHEADER)lpDIB)->biBitCount);  
	GlobalUnlock(hDIB); 
	return dw; 
} 
 
 
void CDib::Show(CDC *pDC, CRect rect, int type) 
{ 
	Zoom(rect.Width(),rect.Height()); 
	switch(type) 
	{ 
	case 1: 
		Grid(pDC,rect.left,rect.top,rect.Width(),rect.Height()); 
		break; 
	case 2: 
		Masic(pDC,rect.left,rect.top,rect.Width(),rect.Height()); 
		break; 
	case 3: 
		Scan(pDC,rect.left,rect.top,rect.Width(),rect.Height()); 
		break; 
	case 4: 
		MoveDown(pDC,rect.left,rect.top,rect.Width(),rect.Height()); 
		break; 
	case 5: 
		MoveUp(pDC,rect.left,rect.top,rect.Width(),rect.Height()); 
		break; 
	case 6: 
		Window(pDC,rect.left,rect.top,rect.Width(),rect.Height()); 
		break; 
	case 7: 
		WindowLine(pDC,rect.left,rect.top,rect.Width(),rect.Height()); 
		break; 
	case 8: 
		ZoomPicture(pDC,rect.left,rect.top,rect.Width(),rect.Height()); 
		break; 
	case 9: 
		ShutOff(pDC,rect.left,rect.top,rect.Width(),rect.Height()); 
		break; 
	} 
} 
 
 
HDIB CDib::ChangeDIBSize(HDIB hDIB, int nWidth, int nHeight) 
{ 
	LPBITMAPINFO lpbmi = NULL; 
	LPSTR		 lpSourceBits,lpTargetBits,lpResult; 
	HDC          hDC = NULL,hSourceDC,hTargetDC; 
	HBITMAP      hSourceBitmap,hTargetBitmap, 
				 hOldTargetBitmap,hOldSourceBitmap; 
	DWORD		 dwSourceBitsSize,dwTargetBitsSize,dwTargetHeaderSize; 
	HDIB		 hNewDIB; 
	DWORD        dwSize; 
 
	if (!hDIB) 
		return NULL; 
 
	LPBITMAPINFO lpSrcDIB = (LPBITMAPINFO)GlobalLock(hDIB); 
	if (!lpSrcDIB) 
		return NULL; 
 
	dwTargetHeaderSize = sizeof(BITMAPINFOHEADER) + PaletteSize((LPSTR)lpSrcDIB); 
	lpbmi = (LPBITMAPINFO)malloc(dwTargetHeaderSize); 
	memcpy(lpbmi,lpSrcDIB,dwTargetHeaderSize); 
	lpbmi->bmiHeader.biWidth = nWidth; 
	lpbmi->bmiHeader.biHeight = nHeight; 
 
	hDC = GetDC(NULL); 
	hTargetBitmap = CreateDIBSection(hDC,lpbmi,DIB_RGB_COLORS,(VOID**)&lpTargetBits,NULL,0); 
	hSourceBitmap = CreateDIBSection(hDC,lpSrcDIB,DIB_RGB_COLORS,(VOID**)&lpSourceBits,NULL,0); 
	hSourceDC = CreateCompatibleDC(hDC); 
	hTargetDC = CreateCompatibleDC(hDC);  
 
	dwSourceBitsSize = lpSrcDIB->bmiHeader.biHeight * BytesPerLine((LPBYTE)&(lpSrcDIB->bmiHeader)); 
	dwTargetBitsSize = lpbmi->bmiHeader.biHeight * BytesPerLine((LPBYTE)&(lpbmi->bmiHeader)); 
	memcpy(lpSourceBits,FindDIBBits((LPSTR)lpSrcDIB),dwSourceBitsSize); 
 
	hOldSourceBitmap = (HBITMAP)SelectObject(hSourceDC,hSourceBitmap); 
	hOldTargetBitmap = (HBITMAP)SelectObject(hTargetDC,hTargetBitmap); 
 
	SetStretchBltMode(hTargetDC,COLORONCOLOR); 
	StretchBlt(hTargetDC,0,0, 
			   lpbmi->bmiHeader.biWidth,lpbmi->bmiHeader.biHeight, 
			   hSourceDC,0,0, 
			   lpSrcDIB->bmiHeader.biWidth,lpSrcDIB->bmiHeader.biHeight,SRCCOPY); 
 
	SelectObject(hSourceDC,hOldSourceBitmap); 
	SelectObject(hTargetDC,hOldTargetBitmap); 
	DeleteDC(hSourceDC); 
	DeleteDC(hTargetDC); 
	ReleaseDC(NULL,hDC); 
 
	GdiFlush(); 
 
	dwSize = dwTargetHeaderSize + dwTargetBitsSize; 
	hNewDIB = GlobalAlloc(GHND,dwSize); 
	lpResult = (LPSTR)GlobalLock(hNewDIB); 
	memcpy(lpResult,lpbmi,dwTargetHeaderSize); 
	memcpy(FindDIBBits((LPSTR)lpResult),lpTargetBits,dwTargetBitsSize); 
 
	::DeleteObject(hTargetBitmap); 
	::DeleteObject(hSourceBitmap); 
	free(lpbmi); 
	GlobalUnlock(hDIB); 
	GlobalUnlock(hDIB); 
	return hNewDIB; 
} 
 
BOOL CDib::Zoom(int nWidth,int nHeight) 
{ 
	HDIB hNewDib = ChangeDIBSize(m_hDib,nWidth,nHeight); 
	if ( !hNewDib) 
		return FALSE; 
	GlobalFree(m_hDib); 
	m_hDib = NULL; 
	m_hDib = hNewDib; 
	if ( !m_pPalette) 
		delete m_pPalette; 
	return TRUE; 
} 
 
BOOL CDib::Read() 
{ 
	if(m_Path!="") 
	{ 
		//CFile *m_File=new CFile(); 
		//CFileException fe; 
	//	if(m_File->Open(m_Path,CFile::modeRead)) 
	//	{	 
		if(	Read(m_Path)) 
			return TRUE; 
		//	m_File->Close(); 
		//	return TRUE; 
			 
	//	} 
		else 
			return FALSE; 
	} 
	else 
		return FALSE; 
	 
} 
 
void CDib::GetFronPicture() 
{ 
	if(m_Picture.GetSize()!=0) 
	{ 
		int max=m_Picture.GetSize(); 
		m_Index=(++m_Index)%max; 
		m_Path=m_Picture[m_Index].fileName; 
		Read(); 
	} 
	 
} 
 
void CDib::GetNextPicture() 
{ 
	if(m_Picture.GetSize()!=0) 
	{ 
		if(m_Index<=0) 
			m_Index=m_Index+m_Picture.GetSize(); 
		m_Path=m_Picture[--m_Index].fileName; 
		Read(); 
	} 
	 
	 
} 
 
void CDib::GetPicture() 
{ 
	m_Path=m_Picture[m_Index].fileName; 
	Read(); 
 
} 
 
void CDib::ShutOff(CDC *pDC, int nLeft, int nTop, int nWidth, int nHeight) 
{ 
	LPSTR    lpDIBHdr; 
	LPSTR    lpDIBBits;    
	LPBITMAPINFO lpBMI; 
	int upHaftLong=nHeight/2; 
	int downHaftLong=nHeight-upHaftLong; 
 
	if (m_hDib == NULL) 
		return; 
	lpDIBHdr  = (LPSTR) GlobalLock(m_hDib); 
	lpDIBBits = FindDIBBits(lpDIBHdr); 
	lpBMI = (LPBITMAPINFO)lpDIBHdr; 
 
	CBrush brush(RGB(0,0,255)); 
	CBrush* oldBrush=pDC->SelectObject(&brush); 
	CPen pen(PS_SOLID,1,RGB(0,0,255)); 
	CPen* oldPen=pDC->SelectObject(&pen); 
 
	pDC->Rectangle(nLeft,nTop,nWidth+nLeft,nHeight+nTop); 
	 
 
	for(int i=0;i <=downHaftLong;i=i+2) 
	{ 
		StretchDIBits(pDC->GetSafeHdc(), 
					nLeft, nTop, 
					nWidth, i, 
					0,upHaftLong, 
					GetWidth(),i, 
					lpDIBBits, lpBMI, 
					DIB_RGB_COLORS,SRCCOPY); 
 
		StretchDIBits(pDC->GetSafeHdc(), 
					nLeft, nTop+nHeight-i, 
					nWidth, i, 
					0,downHaftLong-i, 
					GetWidth(),i, 
					lpDIBBits, lpBMI, 
					DIB_RGB_COLORS,SRCCOPY); 
		Delay(); 
	} 
	pDC->SelectObject(oldBrush); 
	pDC->SelectObject(oldPen); 
 
} 
void CDib::ShowFrame(CDC* pDC,int x,int y,CRect rect,int styFrame) 
{ 
	COLORREF crOldBack=pDC->SetBkColor(RGB(255,255,255)); 
	COLORREF crOldText=pDC->SetTextColor(RGB(0,0,0)); 
	CDC dcImage,dcMask; 
	CBitmap bmp; 
	bmp.LoadBitmap(IDB_FRAME+styFrame); 
	BITMAP bm; 
	bmp.GetBitmap(&bm); 
	int nWidth=bm.bmWidth; 
	int nHeight=bm.bmHeight; 
	dcImage.CreateCompatibleDC(pDC); 
	dcMask.CreateCompatibleDC(pDC); 
	CBitmap* pOldBitmapImage=dcImage.SelectObject(&bmp); 
	CBitmap bitmapMask; 
	bitmapMask.CreateBitmap(nWidth,nHeight,1,1,NULL); 
	CBitmap* pOldBitmapMask=dcMask.SelectObject(&bitmapMask); 
	dcImage.SetBkColor(RGB(255,255,255)); 
	dcMask.StretchBlt(0,0,nWidth,nHeight,&dcImage,0,0,nWidth,nHeight,SRCCOPY); 
	pDC->StretchBlt(x,y,rect.Width(),rect.Height(),&dcImage,0,0,nWidth,nHeight,SRCINVERT); 
	pDC->StretchBlt(x,y,rect.Width(),rect.Height(),&dcMask,0,0,nWidth,nHeight,SRCAND); 
	pDC->StretchBlt(x,y,rect.Width(),rect.Height(),&dcImage,0,0,nWidth,nHeight,SRCINVERT); 
	dcImage.SelectObject(pOldBitmapImage); 
	dcMask.SelectObject(pOldBitmapMask); 
	pDC->SetBkColor(crOldBack); 
	pDC->SetTextColor(crOldText); 
} 
 
BOOL CDib::Read(LPCTSTR lpszPathName) 
{ 
	char drive[_MAX_DRIVE];    
	char dir[_MAX_DIR]; 
	char fname[_MAX_FNAME];    
	char ext[_MAX_EXT]; 
    LPCTSTR fileMid=lpszPathName; 
	_splitpath((LPCSTR)lpszPathName, drive, dir, fname, ext); 
	if (! stricmp(ext, ".jpg") || 
			 ! stricmp(ext, ".jpe") || 
			 ! stricmp(ext, ".jpeg")  
	   ) // JPEG file 
	{ 
	        CJpeg jpeg; 
		    if (! jpeg.Load(lpszPathName)) 
			return FALSE; 
 
		    HDIB hDIB = CopyHandle(jpeg.GetDib()->GetHandle()); 
		    if (hDIB == NULL) 
			    return FALSE; 
			CMidDib *MidDib=new CMidDib; 
		    MidDib->Attach(hDIB); 
 
	        CFile file(lpszPathName,CFile::modeRead); 
	        CString midStr=file.GetFilePath(); 
	        CString sMidFile=file.GetFileName(); 
	        int pathLenght=midStr.GetLength(); 
	        int fileLenght=sMidFile.GetLength(); 
            CString MidPath=midStr.Left(pathLenght-fileLenght);//光路径 
			CFile fWritePath(MidPath+"temp.bmp", CFile::modeNoTruncate|CFile::modeCreate|CFile::modeWrite); 
			MidDib->Write(&fWritePath); 
			fWritePath.Abort(); 
			CFile goalFile(MidPath+"temp.bmp",CFile::modeRead); 
            Read(&goalFile); 
			goalFile.Abort(); 
			goalFile.Remove(MidPath+"temp.bmp"); 
            delete MidDib; 
		    return TRUE; 
	} 
	CFile goalFile(lpszPathName,CFile::modeRead); 
    Read(&goalFile); 
    return TRUE; 
 
}