GDI啊GDI...最近在用windows GDI寫程式,剛試了好久才試出AlphaBlend的用法... 記起來順便當作是freetalk轉型的測試?嗯,如果今天用memory dc來做double buffering,但又想要做alpha blending,要怎麼辦? HDC memDC = ::CreateCompatibleDC(dc); HBITMAP hBmp = ::CreateCompatibleBitmap(dc, nWidth, nHeight); HBITMAP oldBMP = (HBITMAP) ::SelectObject(memDC, hBmp); 所以現在memDC (memory DC)有著和device ddb一樣的format,理論上用法就和BitBlt一樣,除了可以指定source的size之外,唯一差別是BLENDFUNCTION這個東西。
typedef struct _BLENDFUNCTION {
BYTE BlendOp;
BYTE BlendFlags;
BYTE SourceConstantAlpha;
BYTE AlphaFormat;
}BLENDFUNCTION, *PBLENDFUNCTION, *LPBLENDFUNCTION;
剛搞了老半天,怎麼畫都畫不出東西來,為什麼?因為一個很簡單的錯誤: AlphaFormat = AC_SRC_ALPHA; 如果是LoadBitmap()進來的bitmap,那上面那樣當然是對的。但今天是從window dc生出來的bitmap,哪來的source alpha?所以AlphaBlend看到alpha channel全都是0,自然很高興的全都用透明的畫上去了(合掌)。因此,我們的memDC如果要正確的被用指定的SourceConstantAlpha畫出來,那就得把AlphaFormat設成0。 就這樣,呼呼... | |
CatG [Permalink] | Tue, 27 Jun 2006 23:08:28 +0800 |
六月了啊...最近在幹啥呢,都沒在寫freetalk。嗯,下班時間應該要自我充實(和休息),所以就在看一些online course(默) 基本上,都是隨意看,看到有興趣的點進去看,還有大學的時候有興趣但沒有修的課也看一看這樣。其實算不上自我充實,但多少是比只逛網頁來得有趣一些。動畫當然也是有在看,只是最近的沒啥讓我提得起勁每集都寫,甚至連短評都省了(默)。 では、ごきげんよう。 | |
CatG [Permalink] | Fri, 02 Jun 2006 08:36:05 +0800 |