1.16.2009

DirectDraw : Overlay 的操作

先是照著開 PRIMARY 的方法 開 OVERLAY:

// create overlay
memset(&m_ddsd, 0, sizeof(m_ddsd));
m_ddsd.dwSize = sizeof(m_ddsd);
m_ddsd.ddsCaps.dwCaps = DDSCAPS_OVERLAY | DDSCAPS_FLIP | DDSCAPS_COMPLEX |
DDSCAPS_VIDEOMEMORY;
m_ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH | DDSD_BACKBUFFERCOUNT;
m_ddsd.dwWidth = 480;
m_ddsd.dwHeight = 272;
m_ddsd.dwBackBufferCount = 1;
hr=m_pdd->CreateSurface(&m_ddsd,&m_osurf,NULL);


然後就依照慣例,Lock surface 取出 surface address 後就開始畫圖..
但是..顯示不出來..

是忘了要 Overlay SHOW 出來,要 ..

m_osurf->UpdateOverlay(NULL, m_psurf, NULL, DDOVER_SHOW,NULL);

但是...Show 出來後,整個畫面都是Overlay 的圖呀!我沒畫的部份也show出來,是黑的..

這是因為surface 是 RGB656,沒有 alpha 資料,所以不知道黑色是不是"穿透"色。

所以要設 ColorKey,告訴DirectDraw "黑色不要顯示":

DDOVERLAYFX ovfx;

memset(&ovfx,0,sizeof(ovfx));
ovfx.dwSize = sizeof(ovfx);
ovfx.dckSrcColorkey.dwColorSpaceLowValue=0; // black as the color key
ovfx.dckSrcColorkey.dwColorSpaceHighValue=0;
m_osurf->UpdateOverlay(NULL, m_psurf, NULL, DDOVER_SHOW | DDOVER_KEYSRCOVERRIDE | DDOVER_DDFX, &ovfx);
這樣就OK啦!

但是,有一天 Overlay 要顯示黑色怎麼辦?

沒有留言: