GDI+ 透明窗口.UpdateLayeredWindow

2012-03-19  金城  2673

制作透明窗口,使用透明图片遇到的一个问题

 1:

添加 PNG 资源 失败.

答:先添加PNG资源组,然后导入图片.

 2:

显示成功加载资源,资源成功载入内存,但是加载到Image类的时候,返回空指针.

答:可能是忘了 初始化GDI+了. GDI+ 的所有功能使用之前 必须先调用 Gdiplusstartup()函数初始化好.

 3:

在使用内存DC时,

   如果是在GDI下,我们使用bitblt函数,把内存缓存更新到目标缓存里

   如果是想制作透明窗口,则使用UpdateLayeredWindow函数.

 4:

  UpdateLayerdWindow函数功能异常强大

  UpdateLayeredWindow(
   m_hWnd,                           //:当前窗口的句柄
   hdcDlgDC,                        //:当前窗口的DC
   &ptWinPos,                      //:当前窗口在屏幕的左上角位置(相当于::SetWindowPos()函数)
   &sizeWindow,                  //:当前窗口在的宽度和高度
   m_hdcMemory,                //:内存缓存DC
   &ptSrc,                             //:内存缓存的左上角坐标(可用于裁剪内存缓存)
    0,
    &m_Blend,                       // 混合样式
    2);

 5:

  关于混合样式
   m_Blend.BlendOp=0;//theonlyBlendOpdefinedinWindows2000
   m_Blend.BlendFlags=0;//nothingelseisspecial...
   m_Blend.AlphaFormat=1;//...
   m_Blend.SourceConstantAlpha= 1~255;//:该选项控制着整个窗口的透明度. 1为完全透明,255为完全不透明( 即使窗口完全不透明,如果里面的图片有透明属性,仍能够透明 )

6:
调用UpdateLayerdWindow之前,要给窗口加上 0x80000样式. 否则无效.
 DWORD dwExStyle=GetWindowLong(m_hWnd,GWL_EXSTYLE);
 if((dwExStyle&0x80000)!=0x80000)
 SetWindowLong(m_hWnd,GWL_EXSTYLE,dwExStyle^0x80000);

 7:
Guiplus::Graphics 类提供了功能强大的 DrawImage 具体如何把一个Image类Draw到Graphics掌握的HDC上,查看guiplus 帮助文档

8:
GDI和GDI+ 不变的是 HDC,他们都要把东西画到一个DC上.
所以,初始化Guiplus::Graphics时,要给其绑定一个DC,一般是绑定到内存dc上.
Graphics graph(m_hdcMemory);

除了加入了一些新的图像算法之外,GDI+和GDI的差别在于
GDI:面向句柄(HDC)编程
GDI+面向对象编程. HDC是其的一个内部变量.


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zdl1016/archive/2008/11/14/3298744.aspx