收藏 制作透明窗口, 使用透明图片遇到的一个问题 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是其的一个内部变量. VCKBASE上有例子. 可以找找看.
原帖:http://blog.csdn.net/zdl1016/archive/2008/11/14/3298744.aspx
两个实例:
http://www.codeproject.com/KB/dialog/SemiTranDlgWithCtrls.aspx
http://www.codeproject.com/KB/dialog/PerfectTranlucentDlg.aspx