透明static控件花屏

dahaiI0 dahaiI0 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
对话框A有个button,点击后domodal产生对话框B,B上有几个自绘的透明static控件,开始能正常显示,退出B对话框,再点 Button产生B对话框,如此循环几次后static控件开始花屏,自绘static的代码如下

#include "stdafx.h"
#include "StaticEx.h"

#define _X(x) (x.left)
#define _Y(x) (x.top)
#define _W(x) (x.right - x.left)
#define _H(x) (x.bottom - x.top)
// CStaticEx

IMPLEMENT_DYNAMIC(CStaticEx, CStatic)

CStaticEx::CStaticEx()
{
m_clrText = 0;//RGB( 255, 0, 0 );
m_clrBkgnd = 0;//RGB( 255, 255, 0 );
m_hbrBkgnd = NULL;

m_bTransparent = FALSE;
m_unIDBmpBkGnd = 0;
}

CStaticEx::~CStaticEx()
{
}

BEGIN_MESSAGE_MAP(CStaticEx, CStatic)
//{{AFX_MSG_MAP(CTransparentStatic)
ON_WM_CTLCOLOR_REFLECT()
END_MESSAGE_MAP()

// CStaticEx message handlers

BOOL CStaticEx::SetTransparent(UINT unIDBmpBkGnd, HWND hWnd/* = NULL*/)
{
m_hbrBkgnd = GetBkBrush(unIDBmpBkGnd, hWnd);
if (m_hbrBkgnd != NULL)
{
m_bTransparent = TRUE;
Invalidate();
return TRUE;
}
m_bTransparent = FALSE;
return FALSE;
}


HBRUSH CStaticEx::CtlColor(CDC* pDC, UINT nCtlColor)
{
HBRUSH hBr = NULL;

// 文本颜色
if (0 == m_clrText) // 没有自定义文本颜色
{
pDC->SetTextColor(GetSysColor(COLOR_WINDOWTEXT));
}
else
{
pDC->SetTextColor(m_clrText);
}

// 背景颜色 绘制背景的刷子
if (m_bTransparent) // 透明模式
{
pDC->SetBkMode(TRANSPARENT);
hBr = m_hbrBkgnd;
}
else
{
if (0 == m_clrBkgnd) // 没有自定义文本颜色
{
pDC->SetBkColor((RGB(255, 255, 255)));
hBr = (HBRUSH)GetStockObject(WHITE_BRUSH);
}
else
{
pDC->SetBkColor(m_clrBkgnd);
hBr = ::CreateSolidBrush(m_clrBkgnd);;
}
}

return hBr;
}

void CStaticEx::SetClrText(COLORREF clrText)
{
m_clrText = clrText;
Invalidate();
}

void CStaticEx::SetClrBkgnd(COLORREF clrBkgnd)
{
m_clrBkgnd = clrBkgnd;
Invalidate();
}

void CStaticEx::MoveWindowEx(LPCRECT lpRect, BOOL bRepaint/* = TRUE*/)
{
if (m_bTransparent)
{
MoveWindow(lpRect, FALSE);
m_hbrBkgnd = GetBkBrush(m_unIDBmpBkGnd);
Invalidate();
}
else
{
MoveWindow(lpRect, bRepaint);
}
}
HBRUSH CStaticEx::GetBkBrush(UINT unIDBmpBkGnd, HWND hWnd/* = NULL*/)
{
ASSERT(0 != unIDBmpBkGnd);
m_unIDBmpBkGnd = unIDBmpBkGnd;

if (NULL == hWnd)
{
hWnd = GetParent()->m_hWnd;
}
ASSERT(NULL != hWnd);

HWND hWndCtrl = this->m_hWnd;
ASSERT(NULL != hWndCtrl);

HBITMAP hBmpBk = ::LoadBitmap(AfxGetInstanceHandle(), MAKEINTRESOURCE(unIDBmpBkGnd));
ASSERT(NULL != hBmpBk);

HBRUSH hbrCtrlBk = NULL;

CRect rcScr;
::GetClientRect(hWnd, &rcScr);

CRect rcCtrl;
::GetWindowRect(hWndCtrl, &rcCtrl);
::ScreenToClient(hWnd, (LPPOINT)&rcCtrl);
::ScreenToClient(hWnd, ((LPPOINT)&rcCtrl) + 1);

CBitmap bitmap;
bitmap.Attach(hBmpBk);

BITMAP bi = {0};
GetObject(bitmap, sizeof(BITMAP), &bi);

HDC hDC = ::GetDC(hWnd);

HDC hMemDCBk = CreateCompatibleDC(hDC);
HDC hMemDCScr = CreateCompatibleDC(hDC);
HDC hMemDCCtrl = CreateCompatibleDC(hDC);

HBITMAP hBmScr = CreateCompatibleBitmap(hDC, rcScr.Width(), rcScr.Height());
HBITMAP hBmCtrl = CreateCompatibleBitmap(hDC, rcCtrl.Width(), rcCtrl.Height());

HBITMAP hBmOldBk = (HBITMAP)::SelectObject(hMemDCBk, hBmpBk);
HBITMAP hBmOldScr = (HBITMAP)::SelectObject(hMemDCScr, hBmScr);
HBITMAP hBmOldCtrl = (HBITMAP)::SelectObject(hMemDCCtrl, hBmCtrl);

::StretchBlt(hMemDCScr, 0, 0, rcScr.Width(), rcScr.Height(), hMemDCBk, 0, 0, bi.bmWidth, bi.bmHeight, SRCCOPY);

::BitBlt(hMemDCCtrl, 0, 0, rcCtrl.Width(), rcCtrl.Height(), hMemDCScr, rcCtrl.left, rcCtrl.top, SRCCOPY);

::SelectObject(hMemDCCtrl, hBmOldCtrl);
::SelectObject(hMemDCBk, hBmOldBk);
::SelectObject(hMemDCScr, hBmScr);

hbrCtrlBk = ::CreatePatternBrush(hBmCtrl);

DeleteObject(hBmCtrl);
DeleteObject(hBmScr);

::DeleteDC(hMemDCBk);
::DeleteDC(hMemDCScr);
::DeleteDC(hMemDCCtrl);
::ReleaseDC(hWnd, hDC);
return hbrCtrlBk;
}


B对话框OnInitDialog()调用,m_user为cstaticex对象
m_user.SubclassDlgItem(IDC_STATIC_USER1, this);
m_user.SetTransparent(7172);
m_user.SetClrText(RGB(255,255,255));
...全文

相关推荐

WinForm 实现半透明控件

本主题将深入探讨如何在WinForm中实现半透明控件,包括直线、矩形、五角星等简单图形以及图片控件的半透明效果。首先,我们要了解WinForm中的透明度概念。

assky124

CStatic透明位图与文件拖拽实战:VC/MFC对话框开发完整指南

在Windows桌面应用开发中,静态控件(CStatic)常被用于展示图片或文本,但其默认的灰色背景和缺乏拖拽支持往往让界面效果大打折扣。要获得既透明又能接收文件拖入的预览区域,需要理解控件背后的窗口绘制机制:系统通过WM_CTLCOLORSTATIC填充背景,而真正的像素级透明则依赖自绘(OwnerDraw)配合父窗口背景抓取。位图内部透明可借助TransparentBlt或AlphaBlend精细控制。拖拽文件到控件则需注册拖放目标,传统WM_DROPFILES简单直接,而IDropTarget接口能实

包包和糖葫芦

背景透明的Static、Radio、CheckBox、GroupBox控件

背景透明的Static控件:Static控件通常用于显示静态文本,但在默认情况下,它的背景与父窗口颜色相同,无法实现透明效果。

liu_yaoyang

背景透明的Static、Radio、CheckBox、GroupBox控件,支持PNG图片作为背景

对于Static控件(文本标签),默认情况下它们不具备透明背景。我们需要覆盖控件的OnPaint事件,手动绘制文本并在需要透明的地方设置Alpha值。

liu_yaoyang

Winform窗体半透明,控件不透明,皮肤美化效果

**控件不透明**: - 在窗体半透明的情况下,如果希望某些控件保持不透明,可以为每个控件设置`BackColorBrush`和`ForeColorBrush`。

林深见鹿dw
评论 15
收藏 已收藏
分享
返回顶部
dahaiI0
界面 15,976 成员 115,866 内容