おやじ臭いトーク

← newer [ Latest(2017-10) ][ 2006-7 ][ 2006-6 ][ 2006-5 ] older →

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

← newer [ Latest(2017-10) ][ 2006-7 ][ 2006-6 ][ 2006-5 ] older →

2017: 10 9 8 7 6 5 4 3 2 1
2016: 12 11 10 9 8 7 6 5 4 3 2 1
2015: 12 11 10 9 8 7 6 5 4 3 2 1
2014: 12 11 10 9 8 7 6 5 4 3 2 1
2013: 12 11 10 9 8 7 6 5 4 3 2 1
2012: 12 11 10 9 8 7 6 5 4 3 2 1
2011: 12 11 10 9 8 7 6 5 4 3 2 1
2010: 12 11 10 9 8 7 6 5 4 3 2 1
2009: 12 11 10 9 8 7 6 5 4 3 2 1
2008: 12 11 10 9 8 7 6 5 4 3 2 1
2007: 12 11 10 9 8 7 6 5 4 3 2 1
2006: 12 11 10 9 8 7 6 5 4 3 2 1
2005: 12 11 10 9 8 7 6 5 4 3 2 1
2004: 12 11 10 9 8 7 6 5 4 3

Plurk.com
Execution time is 0.016616821289062 seconds.

Valid CSS! Valid HTML 4.01!