游戏研究室

文档-资料-开源

Win32项目不规则窗体和alpha透明的两个重要函数

使用Layered Window,分层窗体

索引色透明的不规则窗体 SetLayeredWindowAttributes

BOOL WINAPI SetLayeredWindowAttributes(
  _In_  HWND hwnd,
  _In_  COLORREF crKey,
  _In_  BYTE bAlpha,
  _In_  DWORD dwFlags
);

hwnd   窗口的句柄
crKey  索引透明色,可以使用RGB这个宏来构造
bAlpha 设置整个窗口的透明度,0~255 0表示完全透明,255表示完全不透明
dwFlags 两个取值LWA_ALPHA和LWA_COLORKEY,表示对窗体处理时是使用crKey还是bAlpha

使用这种方式实现窗体透明,设置之后windows会自动将界面中对应颜色的部分抠掉。

alpha透明 UpdateLayeredWindow

BOOL WINAPI UpdateLayeredWindow(
  _In_      HWND hwnd,
  _In_opt_  HDC hdcDst,
  _In_opt_  POINT *pptDst,
  _In_opt_  SIZE *psize,
  _In_opt_  HDC hdcSrc,
  _In_opt_  POINT *pptSrc,
  _In_      COLORREF crKey,
  _In_opt_  BLENDFUNCTION *pblend,
  _In_      DWORD dwFlags
);

hwnd    窗口句柄
hdcDst  目标DC的句柄,一般用NULL就行了(表示屏幕DC)
pptDst  更新到目标DC的起始坐标(左上角)POINT指针
psize   更新到目标DC的大小范围SIZE指针
hdcSrc  用来更新窗口显示的DC句柄,一般使用CreateCompatibleDC函数创建一个内存DC
        内存DC必须通过SelectObject选择一张BITMAP,才能进行相关操作。这个BITMAP必须使用32bpp(每像素32位)
        可以通过CreateCompatibleBitmap函数来创建,该函数第一个参数直接使用当前窗口的DC,这样这个BITMAP的颜色格式
        就能和窗口DC的保持一致(一般就是32bpp,和windows系统的设定一致32位真彩色。如果系统使用16位色这里就不对了)
pptSrc  用来确定更新窗口显示的数据在hdcSrc中的起始坐标(左上角)POINT指针
crKey   同SetLayeredWindowAttributes中的该参数
pblend  用来定义怎么把hdcSrc中的数据更新到hdcDst上(描述颜色转换方式)
        pblend.BlendOp               混合方式:AC_SRC_OVER,基本上只能用这个模式。将src中的数据根据其alpha叠加到dst中
        pblend.BlendFlags            预留位,必须置0
        pblend.SourceConstantAlpha   用来控制src的整体透明度0~0xff,如果使用0其实就是没也看不见了,一般用0xff
        pblend.AlphaFormat           透明格式:AC_SRC_ALPHA,只有这个取值。用来指明在混合前src和dst的所有颜色通道都必须乘上其alpha通道/255
dwFlags ULW_ALPHA     使用alpha的方式更新,这个时候使用hdcSrc按照前面的参数进行显示更新
        ULW_COLORKEY  使用颜色索引方式更新,用这个参数基本上属于闲得蛋痛。不如直接用SetLayeredWindowAttributes
        ULW_OPAQUE    这个直接绘制不透明窗口,用这个参数就更无聊了(当然不排除有人想不停的切换透明个不透明)。

发表评论