透明static控件花屏
对话框A有个button,点击后domodal产生对话框B,B上有几个自绘的透明static控件,开始能正常显示,退出B对话框,再点 Button产生B对话框,如此循环几次后static控件开始花屏,自绘static的代码如下
B对话框OnInitDialog()调用,m_user为cstaticex对象
m_user.SubclassDlgItem(IDC_STATIC_USER1, this);
m_user.SetTransparent(7172);
m_user.SetClrText(RGB(255,255,255));
#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中的透明度概念。
CStatic透明位图与文件拖拽实战:VC/MFC对话框开发完整指南
在Windows桌面应用开发中,静态控件(CStatic)常被用于展示图片或文本,但其默认的灰色背景和缺乏拖拽支持往往让界面效果大打折扣。要获得既透明又能接收文件拖入的预览区域,需要理解控件背后的窗口绘制机制:系统通过WM_CTLCOLORSTATIC填充背景,而真正的像素级透明则依赖自绘(OwnerDraw)配合父窗口背景抓取。位图内部透明可借助TransparentBlt或AlphaBlend精细控制。拖拽文件到控件则需注册拖放目标,传统WM_DROPFILES简单直接,而IDropTarget接口能实
背景透明的Static、Radio、CheckBox、GroupBox控件
背景透明的Static控件:Static控件通常用于显示静态文本,但在默认情况下,它的背景与父窗口颜色相同,无法实现透明效果。
背景透明的Static、Radio、CheckBox、GroupBox控件,支持PNG图片作为背景
对于Static控件(文本标签),默认情况下它们不具备透明背景。我们需要覆盖控件的OnPaint事件,手动绘制文本并在需要透明的地方设置Alpha值。
Winform窗体半透明,控件不透明,皮肤美化效果
**控件不透明**: - 在窗体半透明的情况下,如果希望某些控件保持不透明,可以为每个控件设置`BackColorBrush`和`ForeColorBrush`。


界面
