用GDI+制作不规则窗体

这篇博客介绍了如何利用GDI+和PNG图片的透明度创建不规则窗体。通过加载PNG图片,设置 BlendFunction 和 Layered Window 属性,实现了窗口形状与图片透明部分相匹配的效果。示例代码展示了从初始化GDI+到更新窗口视图的完整过程。
摘要由CSDN通过智能技术生成

1.

#define TRANS_COLOR         (ALPHA_MASK | RGB(255, 0, 255))

BOOL CMyDialog::OnInitDialog()
{
    CDialog::OnInitDialog();

    CRgn rgn;
    CreateRgnByImage(_T("MyImage.png"), rgn);
    SetWindowRgn(rgn, TRUE);

    return TRUE;
}

void CMyDialog::CreateRgnByImage(const CString &imageName, CRgn &rgn)
{
    Bitmap img(imageName);
    ASSERT(PixelFormat32bppARGB == img.GetPixelFormat());

    Rect rect(0, 0, img.GetWidth(), img.GetHeight());
    BitmapData data;
    img.LockBits(&rect, ImageLockModeRead, PixelFormat32bppARGB, &data);
    UINT *pData = static_cast<UINT*>(data.Scan0);

    rgn.CreateRectRgn(0, 0, 0, 0);

    CRgn tempRgn;
    for (UINT h = 0; h < data.Height; ++ h)
    {
        UINT w = 0;
        while(w < data.Width)
        {
            UINT leftX;
            while (w ++ < data.Width && TRANS_COLOR == *pData ++);
            leftX = w;
            while (w ++ < data.Width && TRANS_COLOR != *pData ++);

            tempRgn.CreateRectRgn(leftX, h, w - 1, h + 1);
            rgn.CombineRgn(&rgn, &tempRgn, RGN_OR);
            tempRgn.DeleteObject();
        }
    }

    img.UnlockBits(&data);
}


2.

如果使用一幅位图,通过挖图的方式来做成一个不规则的窗体,是很累人的一件事。

  而使用GDI+,可以直接用PNG图片,通过图片本身的透明度,自动创建不规则窗体。

  比如,你手中有个美女图,通过PhotoShop等工具,把美女的身体抠出来,保存为PNG格式的图片,除了美女的身体,图片的其他部门都是透明的。后面的工作就是,写一个windows小程序,加载这幅美女图,让她成为我们程序的界面。

 

  Win32程序的框架我就懒得贴了,直接贴关键代码了。

 view plain#include<GdiPlus.h>  

  1. using namespace Gdiplus;  
  2.   
  3. #define MAX_LOADSTRING 100  
  4. //Gdiplus start up params  
  5. ULONG_PTR m_gdiplusToken;  
  6. GdiplusStartupInput m_gdiplusStartupInput;  
  7. //rendering prarams  
  8. BLENDFUNCTION m_Blend;  
  9. //images  
  10. Bitmap * m_BackgoundImage;  
  11. int WINAPI WinMain(HINSTANCE hInstance,  
  12.                    HINSTANCE hPrevInstance,  
  13.                    LPSTR    lpCmdLine,  
  14.                    int       nCmdShow)  
  15. {  
  16.     //....  
  17. }  
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值