示例图
一、CStatic
主要是在主窗口中的OnCtlColor函数中进行自绘
HBRUSH CSelfDrawDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
// TODO: 在此更改 DC 的任何特性
if (nCtlColor == CTLCOLOR_STATIC) {
pDC->SetBkMode(TRANSPARENT);
if (pWnd->GetDlgCtrlID() == IDC_STATIC1) {
pDC->SetTextColor(RGB(200, 200, 100));
}
return (HBRUSH)GetStockObject(NULL_BRUSH);
}
// TODO: 如果默认的不是所需画笔,则返回另一个画笔
return hbr;
}
二、check box 与 radio box
改变背景透明
HBRUSH CSelfDrawDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
if (nCtlColor == CTLCOLOR_BTN || nCtlColor == CTLCOLOR_STATIC) {
pDC->SetBkMode(TRANSPARENT);
hbr = (HBRUSH) ::GetStockObject(NULL_BRUSH);
UINT id = pWnd->GetDlgCtrlID();
if (id == IDC_RADIO1 || id == IDC_CHECK1)
{
CRect rc;
pWnd->GetWindowRect(&rc);
ScreenToClient(&rc);
CDC* dc = GetDC();
//把父窗口背景图片先画到按钮上
pDC->BitBlt(0, 0, rc.Width(), rc.Height(), dc, rc.left, rc.top, SRCCOPY);
ReleaseDC(dc);
return hbr;
}
if (nCtlColor == CTLCOLOR_STATIC) {
pDC->SetTextColor(RGB(255, 200, 0));
}
return hbr;
}
return hbr;
}
三、CEdit
主要是继承CEdit这个类,简单的自绘一下边框的颜色
CSkinEdit.h
#pragma once
#include "afxwin.h"
class CSkinEdit :
public CEdit
{
public:
CSkinEdit();
~CSkinEdit();
DECLARE_DYNAMIC(CSkinEdit)
protected:
DECLARE_MESSAGE_MAP()
public:
BOOL m_bTracking;
BOOL m_bHover;
BOOL m_bFocus;
CBrush m_ClientBrush;
CBrush m_hOrderBrush;
CBrush m_HotOrderBrush1;
CBrush m_HotOrderBrush2;
public:
LRESULT OnMouseLeave(WPARAM wParam, LPARAM lParam);
LRESULT OnMouseHover(WPARAM wParam, LPARAM lParam);
void OnMouseMove(UINT nFlags, CPoint point);
void OnSetFocus(CWnd* pOldWnd);
void OnKillFocus(CWnd* pNewWnd);
void OnNcPaint();
void OnPaint();
void DrawBorder();
};
#include "stdafx.h"
#include "SkinEdit.h"
IMPLEMENT_DYNAMIC(CSkinEdit, CEdit)
CSkinEdit::CSkinEdit()
{
m_bTracking = m_bHover = m_bFocus = FALSE;
m_ClientBrush.CreateSolidBrush(RGB(0,0,200));
m_hOrderBrush.CreateSolidBrush(RGB(0, 100, 200));
m_HotOrderBrush1.CreateSolidBrush(RGB(255, 255, 0));
m_HotOrderBrush2.CreateSolidBrush(RGB(255, 200, 0));
}
CSkinEdit::~CSkinEdit()
{
DeleteObject(m_ClientBrush);
DeleteObject(m_hOrderBrush);
DeleteObject(m_HotOrderBrush1);
DeleteObject(m_HotOrderBrush2);
}
BEGIN_MESSAGE_MAP(CSkinEdit, CEdit)
ON_WM_NCPAINT()
ON_MESSAGE(WM_MOUSELEAVE, OnMouseLeave)
ON_MESSAGE(WM_MOUSEHOVER, OnMouseHover)
ON_WM_MOUSEMOVE()
ON_WM_SETFOCUS()
ON_WM_KILLFOCUS()
END_MESSAGE_MAP()
// CSkinEdit 消息处理程序
void CSkinEdit::OnMouseMove(UINT nFlags, CPoint point)
{
if (!m_bTracking)
{
TRACKMOUSEEVENT tme;
tme.cbSize = sizeof(tme);
tme.hwndTrack = m_hWnd;
tme.dwFlags = TME_LEAVE | TME_HOVER;
tme.dwHoverTime = 50;
m_bTracking = (bool)_TrackMouseEvent(&tme);
}
CEdit::OnMouseMove(nFlags, point);
}
LRESULT CSkinEdit::OnMouseLeave(WPARAM wParam, LPARAM lParam)
{
m_bTracking = FALSE;
m_bHover = FALSE;
DrawBorder();
return 0;
}
LRESULT CSkinEdit::OnMouseHover(WPARAM wParam, LPARAM lParam)
{
m_bHover = TRUE;
DrawBorder();
return 0;
}
void CSkinEdit::OnSetFocus(CWnd* pOldWnd)
{
CEdit::OnSetFocus(pOldWnd);
m_bFocus = TRUE;
DrawBorder();
}
void CSkinEdit::OnKillFocus(CWnd* pNewWnd)
{
CEdit::OnKillFocus(pNewWnd);
m_bFocus = FALSE;
DrawBorder();
}
void CSkinEdit::OnNcPaint()
{
CEdit::OnNcPaint();
DrawBorder();
}
void CSkinEdit::OnPaint()
{
CEdit::OnPaint();
DrawBorder();
}
void CSkinEdit::DrawBorder()
{
CDC * dc = GetWindowDC();
CRect rc;
GetWindowRect(&rc);
rc = CRect(0, 0, rc.right - rc.left, rc.bottom - rc.top);
if (m_bHover) {
dc->FrameRect(rc, &m_HotOrderBrush1);
rc.InflateRect(-1, -1);
dc->FrameRect(rc, &m_HotOrderBrush2);
}
else if (m_bFocus) {
dc->FrameRect(rc, &m_ClientBrush);
rc.InflateRect(-1, -1);
dc->FrameRect(rc, &m_hOrderBrush);
}
else {
dc->FrameRect(rc, &m_ClientBrush);
rc.InflateRect(-1, -1);
dc->FrameRect(rc, &m_hOrderBrush);
}
ReleaseDC(dc);
dc = NULL;
}