📄 flatcombobox.h
字号:
#pragma once
#ifdef _DEBUG
const bool _FlatComboBox_traceOn = false;
#define fcbTRACE if (_FlatComboBox_traceOn) ATLTRACE
#else
#define fcbTRACE
#endif
// The Web Browser style flat combo box control (light-flat combo box)
//
// Note. I can't find the way to avoid the thumb flicker while resizing.
//
class CFlatComboBox : public CWindowImpl<CFlatComboBox, CComboBox>,
public CTrackMouseLeave<CFlatComboBox>
{
public:
// Constants
enum { s_kcxyBorder = 2 };
enum _ComboState { _comboNormal, _comboHot, _comboPressed };
// Data members
_ComboState m_state;
// Ctor
CFlatComboBox() : m_state(_comboNormal) { }
bool FlatComboBox_Install(HWND hWndCombo)
{
MTLVERIFY( SubclassWindow(hWndCombo) );
// MTLVERIFY( m_wndEdit.SubclassWindow(CComboBoxEx(GetParent()).GetEditCtrl()) );
return true;
}
void FlatComboBox_Uninstall()
{
if (IsWindow())
UnsubclassWindow();
}
// Overrides
// Message map and handlers
BEGIN_MSG_MAP(CFlatComboBox)
MESSAGE_HANDLER(WM_PAINT, OnPaint)
CHAIN_MSG_MAP(CTrackMouseLeave<CFlatComboBox>)
END_MSG_MAP()
/* LRESULT OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
fcbTRACE(_T("OnSize\n"));
bHandled = FALSE;
CSize size(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam));
if (m_size != size) {
m_bPassPaint = true;
m_size = size;
}
return 1;
}
*/
LRESULT OnPaint(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
CRect rc;
GetUpdateRect(&rc, FALSE);
ValidateRect(NULL);// validate the whole
// invaldate only the internal rect
CRect rcCombo = _GetFlatComboInvalidateRect();
CRect rcThumb = _GetFlatThumbInvalidateRect();
CRect rcUpdate = rc & rcCombo;
InvalidateRect(&rcUpdate, FALSE);
rcUpdate = rc & rcThumb;
InvalidateRect(&rcUpdate, FALSE);
// CEdit edit = CComboBoxEx(GetParent()).GetEditCtrl();
// ClientToScreen(&rcThumb);
// edit.ScreenToClient(&rcThumb);
// edit.ValidateRect(&rcThumb);
//
// update!
LRESULT lRet = DefWindowProc();
// if (lRet == 0) {
CClientDC dc(m_hWnd);
_DoComboPaint(dc.m_hDC);
// }
return lRet;
}
void _DoComboPaint(CDCHandle dc)
{
_DrawFlatCombo(dc, m_state);
_DrawFlatThumb(dc);
}
void _DrawFlatThumb(CDCHandle& dc)
{
CRect rc = _GetOriginalThumbRect();
dc.DrawEdge(rc, BDR_RAISEDINNER, BF_RECT);
rc.DeflateRect(1, 1);
// COLORREF clrBtnHilite = ::GetSysColor(COLOR_BTNHILIGHT);
// dc.Draw3dRect(rc, clrBtnHilite, clrBtnHilite);
COLORREF clrBtnFace = ::GetSysColor(COLOR_BTNFACE);
dc.Draw3dRect(rc, clrBtnFace, clrBtnFace);
}
CRect _GetOriginalThumbRect()
{
CRect rc;
GetClientRect(&rc);
rc.right -= s_kcxyBorder;
rc.left = rc.right - ::GetSystemMetrics(SM_CXHTHUMB);
rc.top += s_kcxyBorder;
rc.bottom -= s_kcxyBorder;
return rc;
}
CRect _GetFlatThumbInvalidateRect()
{
CRect rc = _GetOriginalThumbRect();
rc.DeflateRect(2, 2);
return rc;
}
CRect _GetFlatComboInvalidateRect()
{
CRect rc;
GetClientRect(&rc);
rc.DeflateRect(2, 2);
rc.right -= ::GetSystemMetrics(SM_CXHTHUMB);
return rc;
}
void _DrawFlatCombo(CDCHandle& dc, _ComboState state)
{
// COLORREF clrBtnHilite = ::GetSysColor(COLOR_BTNHILIGHT);
// COLORREF clrBtnShadow = ::GetSysColor(COLOR_BTNSHADOW);
COLORREF clrBtnFace = ::GetSysColor(COLOR_BTNFACE);
CRect rc;
GetClientRect(&rc);
dc.Draw3dRect(rc, clrBtnFace, clrBtnFace);
rc.DeflateRect(1, 1);
switch (state) {
case _comboNormal:
// dc.Draw3dRect(rc, clrBtnFace, clrBtnFace);
dc.DrawEdge(rc, BDR_SUNKENOUTER, BF_RECT);
break;
case _comboHot:
dc.DrawEdge(rc, BDR_RAISEDINNER, BF_RECT);
break;
case _comboPressed:
// rcItem.top -= 1;
// rcItem.bottom += 1;
// rcItem.OffsetRect(1,1);
// dc.Draw3dRect(rcItem, clrBtnShadow, clrBtnHilite);
break;
}
}
};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -