⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 demoview.cpp

📁 电脑编程技巧和源码。很不错的。
💻 CPP
📖 第 1 页 / 共 2 页
字号:
			cy = 0;
			while ((!(bc[cx].bDontUse)) && cy < nReject)
			{
				if (bc[cx].dwColorCnt < bc[dwLeastUsed[cy]].dwColorCnt) 
				{     
					bc[dwLeastUsed[cy]].bDontUse = FALSE;
					dwLeastUsed[cy] = cx;
					bc[cx].bDontUse = TRUE;
				}
				cy++;
			}
		}
             //创建236色调色板
		pLP->palNumEntries = 236;
		cx = 0;
		for(int i = 0; i < nColors; i++)
		{
			if (!((bc[i].bDontUse)))
			{  
				pLP->palPalEntry[cx].peRed = bmInfo.bmiColors[i].rgbRed;
				pLP->palPalEntry[cx].peGreen = 
								bmInfo.bmiColors[i].rgbGreen;
				pLP->palPalEntry[cx].peBlue = bmInfo.bmiColors[i].rgbBlue;
				pLP->palPalEntry[cx].peFlags = PC_RESERVED;
				cx++;
			}
		}

	}
	else if (nColors)
	{
		
		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 = PC_RESERVED;
		}
	}

	hPal = CreatePalette( pLP );
	delete[] pLP;
	return hPal;
}

void CDemoView::FadeInORFadeOut( CDC *pDC, HANDLE hDIB, COLORREF color, int xDest, int yDest, 
							int nLoops, int nDelay ,int nFlag)
{
	int i,j;
	HPALETTE hPal;
	PALETTEENTRY pAnimate[256];
	PALETTEENTRY pOriginal[256];
	CPalette pal;

	// 创建236色调色板
	
	BITMAPINFO &bmInfo = *(LPBITMAPINFO)hDIB ;
	
	int nColors = bmInfo.bmiHeader.biClrUsed ? bmInfo.bmiHeader.biClrUsed : 
					1 << bmInfo.bmiHeader.biBitCount;
	int nWidth = bmInfo.bmiHeader.biWidth;
	int nHeight = bmInfo.bmiHeader.biHeight;
	LPVOID lpDIBBits = (LPVOID)(bmInfo.bmiColors + nColors);
	int clrRValue = GetRValue(color);
	int clrGValue = GetGValue(color);
	int clrBValue = GetBValue(color);
	if( pDC->GetDeviceCaps(RASTERCAPS) & RC_PALETTE && nColors <= 256 )
	{
		if (!(hPal = Create236Palette(hDIB)))
			return;
		pal.Attach( hPal );
		// 得到调色板初始值
		GetPaletteEntries(hPal, 0, nColors, (LPPALETTEENTRY)&pOriginal);

		// 设定动态调色板初始值为指定色
        if(nFlag==1)
		{
			for (j = 0; j < nColors; j++) 
			{  
				pAnimate[j].peRed = clrRValue;
				pAnimate[j].peGreen = clrGValue;
				pAnimate[j].peBlue = clrBValue;
				pAnimate[j].peFlags = PC_RESERVED;
			}
		}
		else
			GetPaletteEntries(hPal, 0, nColors, (LPPALETTEENTRY)&pAnimate);
		CPalette *pOldPalette = pDC->SelectPalette(&pal, FALSE);
		pDC->RealizePalette();

		CDC memDC;
		memDC.CreateCompatibleDC( pDC );
		CBitmap bmp;
		bmp.CreateCompatibleBitmap( pDC, nWidth, nHeight );
		CBitmap *pOldBitmap = memDC.SelectObject( &bmp );
		CPalette *pOldMemPalette = memDC.SelectPalette(&pal, FALSE);
		memDC.RealizePalette();

		::SetDIBitsToDevice(memDC.m_hDC,0,0,nWidth,nHeight,0,0,0,nHeight,lpDIBBits,(LPBITMAPINFO)hDIB,DIB_RGB_COLORS);
		AnimatePalette(hPal, 0, nColors, (LPPALETTEENTRY)&pAnimate);
		pDC->BitBlt(xDest, yDest, nWidth, nHeight, &memDC,0,0,SRCCOPY );

		// 淡入淡出
		for( i=1; i <= nLoops; i++ )
		{
			for (j = 0; j < nColors; j++) 
			{  
				if(nFlag==1)
				{
					pAnimate[j].peRed = clrRValue - ((clrRValue-pOriginal[j].peRed)*i)/nLoops;
					pAnimate[j].peGreen = clrGValue - ((clrGValue-pOriginal[j].peGreen)*i)/nLoops;
					pAnimate[j].peBlue = clrBValue - ((clrBValue-pOriginal[j].peBlue)*i)/nLoops;
				}
				else
				{
					pAnimate[j].peRed = pOriginal[j].peRed - ((pOriginal[j].peRed - clrRValue)*i)/nLoops;
					pAnimate[j].peGreen = pOriginal[j].peGreen - ((pOriginal[j].peGreen - clrGValue)*i)/nLoops;
					pAnimate[j].peBlue = pOriginal[j].peBlue - ((pOriginal[j].peBlue - clrBValue)*i)/nLoops;
				}

			}
			pal.AnimatePalette(0, nColors, (LPPALETTEENTRY)&pAnimate);
		    // Delay...
			Sleep(nDelay);
		}

		memDC.SelectPalette(pOldMemPalette, FALSE);
		memDC.SelectObject( pOldBitmap );
		pDC->SelectPalette(pOldPalette, FALSE);
	}
	else if( (pDC->GetDeviceCaps(RASTERCAPS) & RC_PALETTE) == 0 && nColors <= 256 )
	{	
		for( int i=0; i < nColors; i++)
		{
			pOriginal[i].peRed =   bmInfo.bmiColors[i].rgbRed ;
			pOriginal[i].peGreen = bmInfo.bmiColors[i].rgbGreen;
			pOriginal[i].peBlue =  bmInfo.bmiColors[i].rgbBlue ;
			if(nFlag==1)
			{
				bmInfo.bmiColors[i].rgbRed = clrRValue;
				bmInfo.bmiColors[i].rgbGreen = clrGValue;	
				bmInfo.bmiColors[i].rgbBlue = clrBValue;
			}
		}
		::SetDIBitsToDevice(pDC->m_hDC,0,0,nWidth,nHeight,0,0,0,nHeight,lpDIBBits,(LPBITMAPINFO)hDIB,DIB_RGB_COLORS);
		// 淡入淡出
		for( i=1; i <= nLoops; i++ )
		{
			for (j = 0; j < nColors; j++) 
			{  
				if(nFlag==1)
				{
					bmInfo.bmiColors[j].rgbRed = clrRValue - ((clrRValue-pOriginal[j].peRed)*i)/nLoops;
					bmInfo.bmiColors[j].rgbGreen  = clrGValue - ((clrGValue-pOriginal[j].peGreen)*i)/nLoops;
					bmInfo.bmiColors[j].rgbBlue = clrBValue - ((clrBValue-pOriginal[j].peBlue)*i)/nLoops;
				}
				else
				{
					bmInfo.bmiColors[j].rgbRed = pOriginal[j].peRed - ((pOriginal[j].peRed-clrRValue)*i)/nLoops;
					bmInfo.bmiColors[j].rgbGreen = pOriginal[j].peGreen - ((pOriginal[j].peGreen-clrGValue)*i)/nLoops;
					bmInfo.bmiColors[j].rgbBlue = pOriginal[j].peBlue - ((pOriginal[j].peBlue-clrBValue)*i)/nLoops;
				}
			}
		::SetDIBitsToDevice(pDC->m_hDC,0,0,nWidth,nHeight,0,0,0,nHeight,lpDIBBits,(LPBITMAPINFO)hDIB,DIB_RGB_COLORS);			
		// Delay...
		Sleep(nDelay);
		}
	}
}

void CDemoView::FadeInColorORFadeOutGray( CDC *pDC, HANDLE hDIB, int xDest, int yDest, int nLoops, 
									int nDelay ,int nFlag) 
{
	CPalette pal;
	CPalette *pOldPalette;
	PALETTEENTRY pAnimate[256];
	PALETTEENTRY pGray[256];
	PALETTEENTRY pOriginal[256];

	BITMAPINFO &bmInfo = *(LPBITMAPINFO)hDIB ;
	
	int nColors = bmInfo.bmiHeader.biClrUsed ? bmInfo.bmiHeader.biClrUsed : 
				1 << bmInfo.bmiHeader.biBitCount;
	int nReservedColors = nColors > 236 ? 236 : nReservedColors;
	int nWidth = bmInfo.bmiHeader.biWidth;
	int nHeight = bmInfo.bmiHeader.biHeight;
	LPVOID lpDIBBits = (LPVOID)(bmInfo.bmiColors + nColors);

	if( pDC->GetDeviceCaps(RASTERCAPS) & RC_PALETTE && nColors <= 256 )
	{
		HPALETTE hPal = Create236Palette(hDIB);
		pal.Attach( hPal );
        //得到位图调色板
		pal.GetPaletteEntries(0, nReservedColors, (LPPALETTEENTRY)&pOriginal);
		for( int i=0; i < nReservedColors; i++)
		{//得到颜色对应灰度值
			int nGray = (pOriginal[i].peRed*299+ pOriginal[i].peGreen*587+ pOriginal[i].peBlue*114)/1000; 
           	pGray[i].peRed = nGray;
			pGray[i].peGreen = nGray;
			pGray[i].peBlue = nGray;
			pGray[i].peFlags=PC_RESERVED;
		}
		pOldPalette = pDC->SelectPalette(&pal, FALSE);
		pDC->RealizePalette();

		CDC memDC;
		memDC.CreateCompatibleDC( pDC );
		CBitmap bmp;
		bmp.CreateCompatibleBitmap( pDC, nWidth, nHeight );
		CBitmap *pOldBitmap = memDC.SelectObject( &bmp );
		CPalette *pOldMemPalette = memDC.SelectPalette(&pal, FALSE);
		memDC.RealizePalette();

		::SetDIBitsToDevice(memDC.m_hDC, 0, 0, nWidth, nHeight, 0, 0, 0,
			nHeight, lpDIBBits, (LPBITMAPINFO)hDIB, DIB_RGB_COLORS);
		if(nFlag==1)//设置灰度调色板
			AnimatePalette(hPal, 0, nColors, (LPPALETTEENTRY)&pGray);
		pDC->BitBlt(xDest, yDest, nWidth, nHeight, &memDC,0,0,SRCCOPY );
		//设置动态调色板初始值为当前调色板
		pal.GetPaletteEntries(0, nColors, (LPPALETTEENTRY)&pAnimate);
        
		memDC.SelectPalette(pOldMemPalette, FALSE);
		memDC.SelectObject( pOldBitmap );
            //淡入淡出
		for( i=1; i <= nLoops; i++ )
		{
			for (int j = 0; j< nColors; j++) 
			{  
				if(nFlag==1)
				{
					pAnimate[j].peRed = pGray[j].peRed - ((pGray[j].peRed -pOriginal[j].peRed)*i)/nLoops;
					pAnimate[j].peGreen = pGray[j].peGreen - ((pGray[j].peGreen-pOriginal[j].peGreen)*i)/nLoops;
					pAnimate[j].peBlue = pGray[j].peBlue  - ((pGray[j].peBlue -pOriginal[j].peBlue)*i)/nLoops;
					pAnimate[j].peFlags = pGray[j].peFlags;
				}
				else
				{		
					pAnimate[j].peRed = pOriginal[j].peRed -((pOriginal[j].peRed -pGray[j].peRed)*i)/nLoops;
					pAnimate[j].peGreen = pOriginal[j].peGreen - ((pOriginal[j].peGreen-pGray[j].peGreen)*i)/nLoops;
					pAnimate[j].peBlue = pOriginal[j].peBlue  - ((pOriginal[j].peBlue -pGray[j].peBlue)*i)/nLoops;
					pAnimate[j].peFlags = pOriginal[j].peFlags;
				}
			}
			pal.AnimatePalette(0, nColors, (LPPALETTEENTRY)&pAnimate);
			// Delay...
			Sleep(nDelay);
		}
		pDC->SelectPalette(pOldPalette, FALSE);
	}
	else if( (pDC->GetDeviceCaps(RASTERCAPS) & RC_PALETTE) == 0 && nColors <= 256 )
	{
		for( int i=0; i < nColors; i++)
		{
			pOriginal[i].peRed =   bmInfo.bmiColors[i].rgbRed ;
			pOriginal[i].peGreen = bmInfo.bmiColors[i].rgbGreen;
			pOriginal[i].peBlue =  bmInfo.bmiColors[i].rgbBlue ;
			int nGray = (bmInfo.bmiColors[i].rgbRed*299+ bmInfo.bmiColors[i].rgbGreen*587+ bmInfo.bmiColors[i].rgbBlue*114)/1000; 
			if(nFlag==1)
			{
				bmInfo.bmiColors[i].rgbRed = nGray;
				bmInfo.bmiColors[i].rgbGreen = nGray;
				bmInfo.bmiColors[i].rgbBlue = nGray;
			}

			pGray[i].peRed = nGray;
			pGray[i].peGreen = nGray;
			pGray[i].peBlue = nGray;
		}

		::SetDIBitsToDevice(pDC->m_hDC, xDest, yDest, nWidth, nHeight, 0, 0, 0,
				nHeight, lpDIBBits, (LPBITMAPINFO)hDIB, DIB_RGB_COLORS);
            //淡入淡出
		for( i=1; i <= nLoops; i++ )
		{
			for (int j = 0; j< nColors; j++) 
			{
				if(nFlag==1)
				{
					bmInfo.bmiColors[j].rgbRed   = pGray[j].peRed  - ((pGray[j].peRed -pOriginal[j].peRed)*i)/nLoops;
					bmInfo.bmiColors[j].rgbGreen = pGray[j].peGreen - ((pGray[j].peGreen-pOriginal[j].peGreen)*i)/nLoops;
					bmInfo.bmiColors[j].rgbBlue  = pGray[j].peBlue  - ((pGray[j].peBlue -pOriginal[j].peBlue)*i)/nLoops;
				}
				else
				{
					bmInfo.bmiColors[j].rgbRed   = pOriginal[j].peRed  - ((pOriginal[j].peRed -pGray[j].peRed)*i)/nLoops;
					bmInfo.bmiColors[j].rgbGreen = pOriginal[j].peGreen - ((pOriginal[j].peGreen-pGray[j].peGreen)*i)/nLoops;
					bmInfo.bmiColors[j].rgbBlue  = pOriginal[j].peBlue  - ((pOriginal[j].peBlue -pGray[j].peBlue)*i)/nLoops;
				}
			}
				::SetDIBitsToDevice(pDC->m_hDC, xDest, yDest, nWidth, nHeight, 0, 0, 0, nHeight, lpDIBBits, (LPBITMAPINFO)hDIB, DIB_RGB_COLORS);
				// Delay...
				Sleep(nDelay);
		}
	}
	else
	{
		::SetDIBitsToDevice(pDC->m_hDC, xDest, yDest, nWidth, nHeight, 0, 0, 0,	nHeight, lpDIBBits, (LPBITMAPINFO)hDIB, DIB_RGB_COLORS);
	}
}

void CDemoView::DrawTransparentBitmap( CDC *pDC, int nXDest, int nYDest,HGLOBAL hDIB, COLORREF colorTransparent, CPalette *pPal)
{	
	BITMAPINFO &bmInfo = *(LPBITMAPINFO)hDIB ;
	int nColors = bmInfo.bmiHeader.biClrUsed ? bmInfo.bmiHeader.biClrUsed : 
				1 << bmInfo.bmiHeader.biBitCount;
	int nWidth = bmInfo.bmiHeader.biWidth;
	int nHeight = bmInfo.bmiHeader.biHeight;
	LPVOID lpDIBBits = (LPVOID)(bmInfo.bmiColors + nColors);

	CDC memDC,maskDC;
	memDC.CreateCompatibleDC( pDC );
	CBitmap bmp;
	bmp.CreateCompatibleBitmap( pDC, nWidth, nHeight );
	CBitmap *pOldBitmap = memDC.SelectObject( &bmp );
	if( pDC->GetDeviceCaps(RASTERCAPS) & RC_PALETTE&&nColors<256)
	{
		CPalette *pOldMemPalette = memDC.SelectPalette(pPal, FALSE);
		memDC.RealizePalette();
	}

	::SetDIBitsToDevice(memDC.m_hDC, 0, 0, nWidth, nHeight, 0, 0, 0,
			nHeight, lpDIBBits, (LPBITMAPINFO)hDIB, DIB_RGB_COLORS);

	maskDC.CreateCompatibleDC(pDC);
	CBitmap maskBitmap;
	maskBitmap.CreateBitmap( nWidth, nHeight, 1, 1, NULL );
    maskDC.SelectObject( &maskBitmap );
	memDC.SetBkColor( colorTransparent );
	maskDC.BitBlt( 0, 0, nWidth, nHeight, &memDC, 0, 0, SRCCOPY );

	memDC.SetBkColor(RGB(0,0,0));
	memDC.SetTextColor(RGB(255,255,255));
	memDC.BitBlt(0, 0, nWidth, nHeight, &maskDC, 0, 0, SRCAND);

	pDC->SetBkColor(RGB(255,255,255));
	pDC->SetTextColor(RGB(0,0,0));
	pDC->BitBlt(nXDest, nYDest, nWidth, nHeight, &maskDC, 0, 0, SRCAND);
	
	pDC->BitBlt(nXDest, nYDest, nWidth, nHeight, &memDC, 
		0, 0, SRCPAINT);
	memDC.SelectObject( pOldBitmap );
}

void CDemoView::DrawSemiTransparentBitmap(CDC *pDC, int nXDest, int nYDest, HGLOBAL hDIB,CPalette *pPal)
{	
	BITMAPINFO &bmInfo = *(LPBITMAPINFO)hDIB ;
	int nColors = bmInfo.bmiHeader.biClrUsed ? bmInfo.bmiHeader.biClrUsed : 
				1 << bmInfo.bmiHeader.biBitCount;
	int nWidth = bmInfo.bmiHeader.biWidth;
	int nHeight = bmInfo.bmiHeader.biHeight;
	LPVOID lpDIBBits = (LPVOID)(bmInfo.bmiColors + nColors);

	CDC memDC;
	memDC.CreateCompatibleDC( pDC );
	CBitmap bmp;
	bmp.CreateCompatibleBitmap( pDC, nWidth, nHeight );
	CBitmap *pOldBitmap = memDC.SelectObject( &bmp );
	if( pDC->GetDeviceCaps(RASTERCAPS) & RC_PALETTE&&nColors<256)
	{
		CPalette *pOldMemPalette = memDC.SelectPalette(pPal, FALSE);
		memDC.RealizePalette();
	}
	::SetDIBitsToDevice(memDC.m_hDC, 0, 0, nWidth, nHeight, 0, 0, 0,	nHeight, lpDIBBits, (LPBITMAPINFO)hDIB, DIB_RGB_COLORS);

    CDC maskDC;
    CBitmap mbm;
    maskDC.CreateCompatibleDC(pDC);
    mbm.CreateCompatibleBitmap(pDC, nWidth, nHeight);
    maskDC.SelectObject(&mbm);
    maskDC.FillSolidRect(CRect(0, 0, nWidth, nHeight), RGB(0x7F, 0x7F, 0x7F));
    pDC->BitBlt(nXDest, nYDest, nWidth, nHeight, &maskDC, 0, 0, SRCAND);
    pDC->BitBlt(nXDest, nYDest, nWidth, nHeight, &memDC, 0, 0, SRCPAINT);
	memDC.SelectObject(pOldBitmap);
}

BOOL CDemoView::LoadBMP( LPCTSTR sBMPFile, HGLOBAL *phDIB, CPalette *pPal )
{
	CFile file;
	if( !file.Open( sBMPFile, CFile::modeRead) )
		return FALSE;

	BITMAPFILEHEADER bmfHeader;
	long nFileLen;

	nFileLen = file.GetLength();

	if (file.Read((LPSTR)&bmfHeader, sizeof(bmfHeader)) != sizeof(bmfHeader))
		return FALSE;

	// 'BM'
	if (bmfHeader.bfType != ((WORD) ('M' << 8) | 'B'))
		return FALSE;

	HGLOBAL hDIB = ::GlobalAlloc(GMEM_FIXED, nFileLen);
	if (hDIB == 0)
		return FALSE;

	if (file.ReadHuge((LPSTR)hDIB, nFileLen - sizeof(BITMAPFILEHEADER)) !=
		nFileLen - sizeof(BITMAPFILEHEADER) )
	{
		::GlobalFree(hDIB);
		return FALSE;
	}

	BITMAPINFO &bmInfo = *(LPBITMAPINFO)hDIB ;

	int nColors = bmInfo.bmiHeader.biClrUsed ? bmInfo.bmiHeader.biClrUsed : 
						1 << bmInfo.bmiHeader.biBitCount;

	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;
	}

	*phDIB = hDIB;
	return TRUE;
}

void CDemoView::DrawDIB( CDC* pDC, HGLOBAL hDIB, CPalette *pPal, int xDest, int yDest )
{
	LPVOID  lpDIBBits;              // Pointer to DIB bits
	BOOL    bSuccess=FALSE;         // Success/fail flag
	
	BITMAPINFO &bmInfo = *(LPBITMAPINFO)hDIB ;
	int nColors = bmInfo.bmiHeader.biClrUsed ? bmInfo.bmiHeader.biClrUsed : 
				1 << bmInfo.bmiHeader.biBitCount;
	
	// Compute the address of the bitmap bits
	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);
	
	// Select and realize the palette if one supplied and if device supports it
	if( pPal && (pDC->GetDeviceCaps(RASTERCAPS) & RC_PALETTE) )
	{
		pDC->SelectPalette(pPal, FALSE);
		pDC->RealizePalette();
	}
	
	::SetDIBitsToDevice(pDC->m_hDC, 		 // hDC
		xDest,					 // DestX
		yDest,					 // DestY
		bmInfo.bmiHeader.biWidth,		 // nDestWidth
		bmInfo.bmiHeader.biHeight,		 // nDestHeight
		0,					 // SrcX
		0,					 // SrcY
		0,					 // nStartScan
		bmInfo.bmiHeader.biHeight,		 // nNumScans
		lpDIBBits,				 // lpBits
		(LPBITMAPINFO)hDIB, 			 // lpBitsInfo
		DIB_RGB_COLORS);			 // wUsage
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -