HBITMAP hbm=CreateBitmap(8, 8, 1, 1, pbit); HBRUSH hbr=CreatePatternBrush(hbm); HDC hdc=CreateDC(_T("DISPLAY"), NULL, NULL, NULL); HDC hdc0=::GetDC(0); SelectObject(hdc,hbr); PatBlt(hdc, 0, 0, GetDeviceCaps(hdc, VERTRES),GetDeviceCaps(hdc, HORZRES ), 0xa000c9); |
用到了一個刷子函數(shù):PatBlt,這個還是在VB的書上看到的,各大網(wǎng)上相互用上了,試了一下,效果不是很理想。ㄖ饕瞧聊活伾o止不變化,XP的關(guān)機前屏幕是逐漸變化至白化的,這個過程是動態(tài)隨時間而變化的)無意中在CODEPROJECT站上經(jīng)人指點,獲得了一個比較好的,與大家分享一下,主要是仿XP關(guān)機的漸變屏幕的特效!
/////////////////////// // 核心函數(shù),將屏幕變暗 HBITMAP CMyFade::FadeBitmap(HBITMAP hBmp, double dfTrans) { HBITMAP hRetBmp = NULL; if (hBmp) { HDC hBufferDC = CreateCompatibleDC(NULL); HGDIOBJ hPrevBufObject = SelectObject(hBufferDC, hBmp); HDC hDirectDC = CreateCompatibleDC(NULL); // DC for working if (hDirectDC) { BITMAP bm; GetObject(hBmp, sizeof(bm), &bm); BITMAPINFO bmInfo; ZeroMemory(&bmInfo,sizeof(bmInfo)); bmInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); bmInfo.bmiHeader.biWidth = bm.bmWidth; bmInfo.bmiHeader.biHeight = bm.bmHeight; bmInfo.bmiHeader.biPlanes = 1; bmInfo.bmiHeader.biBitCount = 32; UINT* ptPixels; HBITMAP hDirectBitmap = CreateDIBSection(hDirectDC,(BITMAPINFO*)&bmInfo, DIB_RGB_COLORS,(void**)&ptPixels, NULL, 0); if (hDirectBitmap) { // 將hDirectBitmap放入hDirectDC中處理 HGDIOBJ hPrevBufDirObject = SelectObject(hDirectDC, hDirectBitmap); // 當(dāng)前將原h(huán)Bmp即屏幕的所有像素寫入到hDirectDC // 即需要對像素灰度處理的DC中 BitBlt(hDirectDC,0,0,bm.bmWidth,bm.bmHeight,hBufferDC,0,0,SRCCOPY); int iAlpha = (int)(255.0 * dfTrans / 100.0); int nSize = bm.bmWidth * bm.bmHeight; for (int i=0; i<nSize; i++) { // 0.212671 * R + 0.715160 * G + 0.072169 * B int iSrcR = (ptPixels[i]) & 0x00ff0000 >> 16; int iSrcG = ptPixels[i] & 0x0000ff00 >> 8; int iSrcB = ptPixels[i] & 0x000000ff; int iGrey = (iSrcR * 54 + iSrcG * 182 + iSrcB * 19) >> 8; COLORREF Col =iGrey ; //RGB(iGrey, iGrey, iGrey) ; ptPixels[i] = RGB( (GetBValue( Col ) * iAlpha + iSrcB * (255 - iAlpha)) >> 8, (GetGValue( Col ) * iAlpha + iSrcG * (255 - iAlpha)) >> 8, (GetRValue( Col ) * iAlpha + iSrcR * (255 - iAlpha)) >> 8 ); } SelectObject(hDirectDC,hPrevBufDirObject); hRetBmp = hDirectBitmap; } DeleteDC(hDirectDC); } SelectObject(hBufferDC, hPrevBufObject); DeleteDC(hBufferDC); } return hRetBmp; } |
分析一下:
顏色模型的轉(zhuǎn)化,即將彩色位圖轉(zhuǎn)化成灰度圖,這個在RGB模型中即R=G=B三色值即可,也有更好HSL,HIV等模型轉(zhuǎn)化,可以看計算機圖形學(xué)上面有介紹;即獲得屏幕位圖句柄,放入內(nèi)存DC中處理居灰度圖片,反復(fù)轉(zhuǎn)換,以求得特效;本處的色點處理采用了移位處理,即R與B值移位時注意一下移的位數(shù),與我們想的不一樣,正確的存儲順序是 BGR,每個8位;不知道上面的代碼算不算簡易實現(xiàn)了特效,有這方面興趣的可以查看代碼,另外本人稍感遺憾的是無法與關(guān)機的實現(xiàn)在一塊,即整個屏幕被控制住了,不響應(yīng)鼠標(biāo)的操作,希望有同仁指出實現(xiàn)方法。