📄 flatcombo.cpp
字号:
// FlatCombo.cpp : implementation file
//////////////////////////////////////////
#include "stdafx.h"
#include "FlatCombo.h"
/////////////////////////////////////////////////////////////////////////////
// CFlatCombo
CFlatCombo::CFlatCombo()
{
// 临时画刷
m_hbrList = NULL;
m_hbrColor = NULL;
m_hbrActive = NULL;
// 是否有箭头
m_bListArrow = TRUE;
// 文字颜色
m_rgbDown = RGB(0, 0, 0);
m_rgbText = RGB(0, 0, 255);
// 背景颜色
m_bkColor = RGB(255, 255, 255);
m_bkActive = RGB(255, 255, 255);
// 下拉框的颜色
m_lbText = RGB(0, 0, 0);
m_lbColor = RGB(255, 255, 255);
// 控制变量
m_bHotFlat = 2;
m_bWndActive = FALSE;
m_bMouseHover = FALSE;
}
CFlatCombo::~CFlatCombo()
{
if(m_hbrList != NULL)
DeleteObject(m_hbrList);
if(m_hbrColor != NULL)
DeleteObject(m_hbrColor);
if(m_hbrActive != NULL)
DeleteObject(m_hbrActive);
}
BEGIN_MESSAGE_MAP(CFlatCombo, CComboBox)
//{{AFX_MSG_MAP(CFlatCombo)
ON_WM_PAINT()
ON_CONTROL_REFLECT(CBN_SETFOCUS, OnSetFocus)
ON_CONTROL_REFLECT(CBN_KILLFOCUS, OnKillFocus)
ON_WM_CTLCOLOR_REFLECT()
ON_WM_MOUSEMOVE()
ON_WM_CTLCOLOR()
ON_WM_TIMER()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CFlatCombo message handlers
// 象控件一样创建
BOOL CFlatCombo::Create(DWORD dwStyle, const RECT& rect,
CWnd * lpParent, UINT nWndID)
{
long cx = rect.right - rect.left;
long cy = rect.bottom - rect.top;
HWND hWnd = CreateWindow("COMBOBOX", NULL,
dwStyle, rect.left, rect.top, cx,
cy, lpParent->GetSafeHwnd(), NULL,
AfxGetInstanceHandle(), NULL);
if(hWnd == NULL) return FALSE;
return SubclassWindow(hWnd);
}
void CFlatCombo::PreSubclassWindow()
{
CComboBox::PreSubclassWindow();
// Combo Edit Handle
m_hComboEdit = ::GetWindow(m_hWnd, GW_CHILD);
// 根据对话框确定
RECT rtRect = {0, 0, 0, 12};
MapDialogRect(::GetParent(m_hWnd), &rtRect);
// 设置控件的大小
rtRect.bottom -= 6;
SetItemHeight(-1, rtRect.bottom);
SetItemHeight(0, rtRect.bottom + 3);
}
BOOL CFlatCombo::PreTranslateMessage(MSG * lpMsg)
{
if( lpMsg->hwnd == m_hComboEdit &&
lpMsg->message == WM_MOUSEMOVE )
{
// 调用Timer,来跟踪Hover事件
if(m_bHotFlat == 2 && !m_bMouseHover)
{
SetTimer(0x0001, 50, NULL);
m_bMouseHover = TRUE;
Invalidate(TRUE);
}
}
return CComboBox::PreTranslateMessage(lpMsg);
}
void CFlatCombo::OnSetFocus()
{
m_bWndActive = TRUE;
Invalidate();
// 发送一个消息到父窗口
GetParent()->SendMessage(WM_CBN_FOCUS,
TRUE, GetDlgCtrlID() );
}
void CFlatCombo::OnKillFocus()
{
m_bMouseHover = FALSE;
m_bWndActive = FALSE;
KillTimer(0x0001);
Invalidate();
// 发送一个消息到父窗口
GetParent()->SendMessage(WM_CBN_FOCUS,
FALSE, GetDlgCtrlID() );
}
HBRUSH CFlatCombo::CtlColor(CDC * lpDC, UINT nCtlColor)
{
if( m_bWndActive ||
(m_bHotFlat == 2 && m_bMouseHover) )
{
lpDC->SetTextColor(m_rgbDown);
lpDC->SetBkColor(m_bkActive);
// 创建临时画刷
if(m_hbrActive == NULL)
m_hbrActive = CreateSolidBrush(m_bkActive);
return m_hbrActive;
}
// 一般背景颜色
lpDC->SetTextColor(m_rgbText);
lpDC->SetBkColor(m_bkColor);
// 创建临时画刷
if(m_hbrColor == NULL)
m_hbrColor = CreateSolidBrush(m_bkColor);
return m_hbrColor;
}
HBRUSH CFlatCombo::OnCtlColor(CDC * lpDC, CWnd * lpWnd, UINT nCtlColor)
{
if(lpWnd->m_hWnd == m_hComboEdit)
{
if( m_bWndActive ||
(m_bHotFlat == 2 && m_bMouseHover) )
{
lpDC->SetTextColor(m_rgbDown);
lpDC->SetBkColor(m_bkActive);
// 创建临时画刷
if(m_hbrActive == NULL)
m_hbrActive = CreateSolidBrush(m_bkActive);
return m_hbrActive;
}
// 一般背景颜色
lpDC->SetTextColor(m_rgbText);
lpDC->SetBkColor(m_bkColor);
// 创建临时画刷
if(m_hbrColor == NULL)
m_hbrColor = CreateSolidBrush(m_bkColor);
return m_hbrColor;
}
// List Box 的颜色控制
lpDC->SetTextColor(m_lbText);
lpDC->SetBkMode(TRANSPARENT);
if(m_hbrList == NULL)
m_hbrList = CreateSolidBrush(m_lbColor);
return m_hbrList;
}
void CFlatCombo::OnMouseMove(UINT nFlags, CPoint point)
{
CComboBox::OnMouseMove(nFlags, point);
// 调用Timer,来跟踪Hover事件
if(m_bHotFlat == 2 && !m_bMouseHover)
{
SetTimer(0x0001, 50, NULL);
m_bMouseHover = TRUE;
Invalidate(TRUE);
}
}
void CFlatCombo::OnPaint()
{
// 调用默认的函数
Default();
// 根据需要,画出扁平效果
if( !m_bWndActive )
{
if( m_bHotFlat == 1 ||
(m_bHotFlat == 2 && !m_bMouseHover) )
{
CRect rtRect;
CWindowDC dc(this);
GetWindowRect(&rtRect);
// 注意,到EDIT的距离是3
rtRect.bottom -= rtRect.top;
rtRect.right -= rtRect.left;
rtRect.left = rtRect.top = 0;
COLORREF rgbLine = GetSysColor(COLOR_3DSHADOW);
// 画出三根线条来
dc.Draw3dRect(&rtRect, rgbLine, rgbLine);
rtRect.DeflateRect(1, 1);
dc.Draw3dRect(&rtRect, m_bkColor, m_bkColor);
rtRect.DeflateRect(1, 1);
// 将按钮给覆盖掉
rtRect.left = rtRect.right - 16;
if( m_bListArrow )
{
if(GetItemHeight(0) < 16)
{
// 箭头有点不对称
dc.ScrollDC(0, -1, &rtRect, &rtRect, NULL, NULL);
}
COLORREF rgbFace = GetSysColor(COLOR_3DFACE);
dc.Draw3dRect(&rtRect, rgbFace, rgbLine);
rtRect.DeflateRect(1, 1);
dc.Draw3dRect(&rtRect, rgbFace, rgbFace);
rtRect.DeflateRect(1, 1);
dc.Draw3dRect(&rtRect, rgbFace, rgbFace);
}
else
{
// 将箭头部分填充掉
dc.FillSolidRect(&rtRect, m_bkColor);
}
return;
}
}
// 标准箭头给纠正过来
if(GetItemHeight(0) < 16)
{
CRect rtRect;
GetWindowRect(&rtRect);
rtRect.bottom -= rtRect.top;
rtRect.right -= rtRect.left;
rtRect.left = rtRect.top = 0;
// 箭头有点不对称
CWindowDC dc(this);
rtRect.DeflateRect(4, 4);
rtRect.left = rtRect.right - 12;
dc.ScrollDC(0, -1, &rtRect, &rtRect, NULL, NULL);
}
}
void CFlatCombo::OnTimer(UINT nIDEvent)
{
if( m_bMouseHover )
{
POINT myPos;
GetCursorPos(&myPos);
RECT rtRect;
GetWindowRect(&rtRect);
if( !PtInRect(&rtRect, myPos) )
{
KillTimer(0x0001);
m_bMouseHover = FALSE;
Invalidate(TRUE);
}
}
}
int CFlatCombo::SearchParam(DWORD dwData)
{
long nIdx = 0, nCount = GetCount();
while(nIdx < nCount)
{
if(GetItemData(nIdx) == dwData)
return nIdx;
nIdx ++;
}
// 没有选中
return -1;
}
int CFlatCombo::SelectParam(DWORD dwData)
{
long nIdx = 0, nCount = GetCount();
while(nIdx < nCount)
{
if(GetItemData(nIdx) == dwData)
{
SetCurSel(nIdx);
return nIdx;
}
nIdx ++;
}
// 没有选中
SetCurSel(-1);
return -1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -