UpdateLayeredWindow代码

用GDI+png图片创建窗口阴影,核心代码如下:
int __fastcall TForm1::SetTransparent(LPWSTR lpSkinFile, int nTran)
{
    // GDI+加载图片
    m_Image = Gdiplus::Image::FromFile(lpSkinFile);

    //保存图片尺寸
    Width  = m_Image->GetWidth();
    Height = m_Image->GetHeight();

    //创建兼容位图
    HDC hdcTemp = GetDC(0);
    m_hdcMemory = CreateCompatibleDC(hdcTemp);
    HBITMAP hBitMap = CreateCompatibleBitmap(hdcTemp,Width,Height);


    SelectObject(m_hdcMemory, hBitMap);
    // Alpha值
    if (nTran<0 || nTran >100)
        nTran = 100;
    m_Blend.SourceConstantAlpha = int(nTran * 2.55); // 1~255
    
    HDC hdcScreen = ::GetDC(0);
    RECT rct;
    GetWindowRect(Handle, &rct);

    POINT ptWinPos = {rct.left, rct.top};
    Gdiplus::Graphics graph(m_hdcMemory);

    graph.DrawImage(m_Image, 0, 0, m_Image->GetWidth(), m_Image->GetHeight());

    SIZE sizeWindow = {m_Image->GetWidth(), m_Image->GetHeight()};
    POINT ptSrc = {0, 0};
	
    //设置窗口风格
    DWORD dwExStyle = GetWindowLong(Handle, GWL_EXSTYLE);
    if((dwExStyle & 0x80000 ) != 0x80000)
        SetWindowLong(Handle, GWL_EXSTYLE, dwExStyle ^ 0x80000);

    BLENDFUNCTION m_Blend;
    m_Blend.BlendOp = 0;               // the only BlendOp defined in Windows 2000
    m_Blend.BlendFlags = 0;            // nothing else is special ...
    m_Blend.AlphaFormat = 1;           // ...
    m_Blend.SourceConstantAlpha = 255; // AC_SRC_ALPHA
    //执行alpha通道混合
    BOOL bRet = UpdateLayeredWindow(Handle, hdcScreen, &ptWinPos,
            &sizeWindow, m_hdcMemory, &ptSrc, 0, &m_Blend, 2);

    graph.ReleaseHDC(m_hdcMemory);
    ReleaseDC(0, hdcScreen);
    hdcScreen = NULL;

    ReleaseDC(0, hdcTemp);
    hdcTemp = NULL;

    DeleteObject(hBitMap);

    DeleteDC(m_hdcMemory);
    m_hdcMemory = NULL;

    m_Image = NULL;
    return bRet;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值