15,979
社区成员
发帖
与我相关
我的任务
分享
#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;
}
CStaticEx::CStaticEx()
{
m_clrText = 0;//RGB( 255, 0, 0 );
m_clrBkgnd = 0;//RGB( 255, 255, 0 );
m_hbrBkgnd = NULL;
hbrCtrlBk = NULL;
m_bTransparent = FALSE;
m_unIDBmpBkGnd = 0;
m_WhiteBrush = (HBRUSH)GetStockObject(WHITE_BRUSH);
//m_SolidBrush = ::CreateSolidBrush(m_clrBkgnd);
}
CStaticEx::~CStaticEx()
{
if(m_WhiteBrush)
::DeleteObject(m_WhiteBrush);
if(m_SolidBrush)
::DeleteObject(m_SolidBrush);
if(hbrCtrlBk)
::DeleteObject(m_SolidBrush);
}
BEGIN_MESSAGE_MAP(CStaticEx, CStatic)
//{{AFX_MSG_MAP(CTransparentStatic)
ON_WM_CTLCOLOR_REFLECT()
END_MESSAGE_MAP()
// CStaticEx message handlers
BOOL CStaticEx::SetTransparent( UINT unIDBmpBkGnd, HINSTANCE hResourceInstance /*= NULL*/,HWND hWnd /*= NULL*/ )
{
m_hbrBkgnd = GetBkBrush(unIDBmpBkGnd, hResourceInstance, 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 = m_WhiteBrush;
}
else
{
pDC->SetBkColor(m_clrBkgnd);
m_SolidBrush = ::CreateSolidBrush(m_clrBkgnd);
return m_SolidBrush;
}
}
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, HINSTANCE hResourceInstance /*= NULL*/, BOOL bRepaint /*= TRUE*/ )
{
if (m_bTransparent)
{
MoveWindow(lpRect, FALSE);
m_hbrBkgnd = GetBkBrush(m_unIDBmpBkGnd, hResourceInstance);
Invalidate();
}
else
{
MoveWindow(lpRect, bRepaint);
}
}
HBRUSH CStaticEx::GetBkBrush( UINT unIDBmpBkGnd, HINSTANCE hResourceInstance /*= NULL*/, 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);
if (hResourceInstance == NULL)
{
hResourceInstance = AfxGetResourceHandle();
}
HBITMAP hBmpBk = ::LoadBitmap(hResourceInstance, MAKEINTRESOURCE(unIDBmpBkGnd));
ASSERT(NULL != hBmpBk);
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);
::DeleteObject(hBmpBk);
::DeleteDC(hMemDCBk);
::DeleteDC(hMemDCScr);
::DeleteDC(hMemDCCtrl);
::ReleaseDC(hWnd, hDC);
return hbrCtrlBk;
}
COLORREF m_clrText; // 记录文本颜色
COLORREF m_clrBkgnd; // 记录背景颜色
HBRUSH m_hbrBkgnd; // 用于绘制背景的刷子
HBRUSH m_WhiteBrush;
HBRUSH m_SolidBrush;
HBRUSH hbrCtrlBk;