请问有谁知道怎样让位图具有淡入淡出的效果吗! 给分多多!!!! 请问有谁知道怎样让位图具有淡入淡出的效果吗! 如果各位要是有原码的话请发到以下的信箱中,谢谢了!![email protected] 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 你可以画一个背景位图,然后逐步(设置时钟)改变背影位图的亮度,然后将位图与其运算(AND,OR,XOR,取决你需的效果),直到让背影完全无效为止,而淡出效果的过程与其相反。 或者:取得背景像素的颜色值,隔行或隔像素点进行覆盖,直至最终覆盖掉所有前景位图——以前在DOS下使用过此方法,效果还可以。 http://www.vckbase.com/document/viewdoc.asp?id=313 我没有什么现成的代码,我给你个简单的函数就能实现。AlphaBlend(),必须用在Win2000之后的环境中。效果比较专业。 晕~~~~你个鸟人,真懒不过我还是告诉你,在isee这个自由软件的开发主页上有,自己去找 背景的淡入淡出 ---------------------------------------------------------------- 如果系统支持调色板,创建动态调色板pAnimate与初始调色板pOriginal。从位图中获取初始调色板,若为淡入将背景色赋予动态调色板。利用前面所提到的公式,根据淡入淡出标志,在循环中更改动态调色板,用AnimatePalette函数设置调色板,改变显示结果。 如果系统不支持调色板,保存位图调色板到初始调色板,若为淡入将背景色赋予位图调色板,利用前面所提到的公式,根据淡入淡出标志,在循环中更改位图调色板,显示位图改变显示结果。返回:位图的淡入淡出。//参数说明: //hDIB -位图句柄 //color -指定背景色 //xDest -显示位图的左上角x坐标 //yDest -显示位图的左上角y坐标 //nLoops -循环次数 //nDelay -每次循环中的延时 //nFlag -淡入淡出标志 1--淡入 其它--淡出 void 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... Sl ::SetDIBitsToDevice(pDC->m_hDC,0,0,nWidth,nHeight,0,0,0,nHeight,lpDIBBits,(LPBITMAPINFO)hDIB,DIB_RGB_COLORS); // Delay... Sleep(nDelay); } } AlphaBlend在98下就可以用了,不过效果不如2000。你循环调用AlphaBlend,每次给不同的Alpha就实现了淡入淡出。http://vip.6to23.com/NowCan1/tech/AlphaBlend1.htm可惜是个VB程序。 键盘钩子菜鸟问题 VC6.0的IDE如何快速从定义跳转到实现 关于工程名???? 为什么用DestroyWindow函数撤销窗口会失败? 对话框工程内,当拉动窗体尺寸缩小到一定程度后,不再变小,如何实现?在线等!谢谢!(窗体尺寸可以变化,限制一直变小!) 写过天气预报类似软件的朋友请指点下 请问如何实现对字符串进行3DES加密 下周手术,散分保平安。请斑竹大人手下留情,在此谢过 在一个空白的工作区里加入几个MFC工程后出现问题!!! 为什么!~?? 辞职申请怎么写? 关于组件调试的问题,有兴趣的哥儿们都来看看!!
AlphaBlend(),必须用在Win2000之后的环境中。
效果比较专业。
----------------------------------------------------------------
如果系统支持调色板,创建动态调色板pAnimate与初始调色板pOriginal。从位图中获取初始调色板,若为淡入将背景色赋予动态调色板。利用前面所提到的公式,根据淡入淡出标志,在循环中更改动态调色板,用AnimatePalette函数设置调色板,改变显示结果。
如果系统不支持调色板,保存位图调色板到初始调色板,若为淡入将背景色赋予位图调色板,利用前面所提到的公式,根据淡入淡出标志,在循环中更改位图调色板,显示位图改变显示结果。返回:位图的淡入淡出。//参数说明:
//hDIB -位图句柄
//color -指定背景色
//xDest -显示位图的左上角x坐标
//yDest -显示位图的左上角y坐标
//nLoops -循环次数
//nDelay -每次循环中的延时
//nFlag -淡入淡出标志 1--淡入 其它--淡出
void 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...
Sl
// Delay...
Sleep(nDelay);
}
}
你循环调用AlphaBlend,每次给不同的Alpha就实现了淡入淡出。
http://vip.6to23.com/NowCan1/tech/AlphaBlend1.htm
可惜是个VB程序。