📄 flatheadctrl.cpp
字号:
// FlatHeadCtrl.cpp : implementation file
//
#include "stdafx.h"
#include "Game.h"
#include "FlatHeadCtrl.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CFlatHeadCtrl
CFlatHeadCtrl::CFlatHeadCtrl()
{
//排序列初始化为-1
m_nSortCol = -1;
//表头扁平标志初始为否
m_bFlatHeader = FALSE;
//表头字体加粗初始为否
m_bBoldFont = FALSE;
//排序小图标的偏移量初始为6
m_nOffset = 6;
//鼠标左键按下处世为否
m_bLBtnDown = FALSE;
}
CFlatHeadCtrl::~CFlatHeadCtrl()
{
}
BEGIN_MESSAGE_MAP(CFlatHeadCtrl, CHeaderCtrl)
//{{AFX_MSG_MAP(CFlatHeadCtrl)
ON_WM_PAINT()
ON_WM_WINDOWPOSCHANGING()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CFlatHeadCtrl message handlers
void CFlatHeadCtrl::DrawFlatBorder()
{
CDC* pDC = GetDC();
CRect rci;
GetWindowRect(&rci);
ScreenToClient(&rci);
//画3维外框
pDC->Draw3dRect(rci, ::GetSysColor(COLOR_3DFACE),
::GetSysColor(COLOR_3DFACE));
rci.DeflateRect(1,1);
pDC->Draw3dRect(rci, ::GetSysColor(COLOR_3DFACE),
::GetSysColor(COLOR_3DFACE));
rci.InflateRect(1,1);
pDC->Draw3dRect(rci, ::GetSysColor(COLOR_3DHILIGHT),
::GetSysColor(COLOR_3DSHADOW));
//创建画笔
CPen penLite(PS_SOLID, 1, ::GetSysColor(COLOR_3DHILIGHT));
CPen penShad(PS_SOLID, 1, ::GetSysColor(COLOR_3DSHADOW));
CPen penFace(PS_SOLID, 1, ::GetSysColor(COLOR_3DFACE));
CPen *pOldPen = pDC->SelectObject( &penLite );
pDC->SelectObject(&penFace);
pDC->MoveTo(rci.right-1, 2);
pDC->LineTo(rci.right-1, rci.bottom-2);
//建立表头项
HD_ITEM hdi;
memset (&hdi, 0, sizeof(HD_ITEM));
hdi.fmt = HDF_STRING | HDF_LEFT | HDF_OWNERDRAW;
hdi.mask = HDI_WIDTH | HDI_TEXT | HDI_FORMAT;
int cx = 0;
//为表头的每项画外框
for (int i = 0; i < GetItemCount(); ++i)
{
GetItem(i, &hdi);
cx += hdi.cxy;
pDC->SelectObject(&penShad);
pDC->MoveTo(cx, 2);
pDC->LineTo(cx, rci.bottom-2);
pDC->SelectObject(&penLite);
pDC->MoveTo(cx+1, 2);
pDC->LineTo(cx+1, rci.bottom-2);
pDC->SelectObject(&penFace);
pDC->MoveTo(cx-1, 2);
pDC->LineTo(cx-1, rci.bottom-2);
pDC->SelectObject(&penFace);
pDC->MoveTo(cx-2, 2);
pDC->LineTo(cx-2, rci.bottom-2);
}
//恢复原始画笔,释放设备上下文
pDC->SelectObject( pOldPen );
ReleaseDC(pDC);
}
void CFlatHeadCtrl::FlatHeader(BOOL bBoldFont/*=TRUE*/)
{
//获取逻辑字体
NONCLIENTMETRICS ncm;
memset(&ncm, 0, sizeof(NONCLIENTMETRICS));
ncm.cbSize = sizeof(NONCLIENTMETRICS);
VERIFY(::SystemParametersInfo(SPI_GETNONCLIENTMETRICS,
sizeof(NONCLIENTMETRICS), &ncm, 0));
ncm.lfMessageFont.lfWeight = bBoldFont?700:400;
m_HeaderFont.CreateFontIndirect(&ncm.lfMessageFont);
SetFont(&m_HeaderFont);
m_bBoldFont = bBoldFont;
m_bFlatHeader = TRUE;
}
void CFlatHeadCtrl::OnPaint()
{
//CPaintDC dc(this); // device context for painting
Default();
if (m_bFlatHeader)
DrawFlatBorder();
// Do not call CHeaderCtrl::OnPaint() for painting messages
}
void CFlatHeadCtrl::OnWindowPosChanging(WINDOWPOS FAR* lpwndpos)
{
CHeaderCtrl::OnWindowPosChanging(lpwndpos);
Invalidate();
}
int CFlatHeadCtrl::SetSortImage(int nCol, BOOL bAsc)
{
int nPrevCol = m_nSortCol;
m_nSortCol = nCol;
m_bSortAsc = bAsc;
//自画表项
HD_ITEM hditem;
hditem.mask = HDI_BITMAP | HDI_FORMAT;
GetItem( nCol, &hditem );
if (hditem.hbm == NULL)
{
hditem.fmt |= HDF_OWNERDRAW;
SetItem( nCol, &hditem );
//重画表项
Invalidate();
}
return nPrevCol;
}
void CFlatHeadCtrl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
CDC dc;
dc.Attach( lpDrawItemStruct->hDC );
//获取表头的尺寸
CRect rcLabel( lpDrawItemStruct->rcItem );
//保存当前的设备描述上下文
int nSavedDC = dc.SaveDC();
//限制自画范围在表头尺寸内
CRgn rgn;
rgn.CreateRectRgnIndirect( &rcLabel );
dc.SelectObject( &rgn );
rgn.DeleteObject();
//画表头的背景
dc.FillRect(rcLabel, &CBrush(::GetSysColor(COLOR_3DFACE)));
dc.SetBkMode(TRANSPARENT);
//获取列上的文本和样式
TCHAR buf[256];
HD_ITEM hditem;
hditem.mask = HDI_TEXT | HDI_FORMAT;
hditem.pszText = buf;
hditem.cchTextMax = 255;
GetItem( lpDrawItemStruct->itemID, &hditem );
//设置写列文本的样式
UINT uFormat = DT_SINGLELINE | DT_NOPREFIX | DT_NOCLIP
| DT_VCENTER | DT_END_ELLIPSIS ;
if( hditem.fmt & HDF_CENTER)
uFormat |= DT_CENTER;
else if( hditem.fmt & HDF_RIGHT)
uFormat |= DT_RIGHT;
else
uFormat |= DT_LEFT;
//当鼠标左键点击表头时,调整其尺寸
if( lpDrawItemStruct->itemState == ODS_SELECTED )
{
rcLabel.left++;
rcLabel.top += 2;
rcLabel.right++;
}
//显示排序图标时,调整表头的尺寸
if( lpDrawItemStruct->itemID == (UINT)m_nSortCol )
{
rcLabel.right -= 3 * m_nOffset;
}
rcLabel.left += m_nOffset;
rcLabel.right -= m_nOffset;
//写列的文本
if( rcLabel.left < rcLabel.right )
{
if (m_bBoldFont) {
dc.SelectObject(&m_HeaderFont);
}
dc.DrawText(buf,-1,rcLabel, uFormat);
}
//画排序小图标
if( lpDrawItemStruct->itemID == (UINT)m_nSortCol )
{
CRect rcIcon( lpDrawItemStruct->rcItem );
//设置画三角型小图标的画笔
CPen penLite(PS_SOLID, 1, ::GetSysColor(COLOR_3DHILIGHT));
CPen penShad(PS_SOLID, 1, ::GetSysColor(COLOR_3DSHADOW));
CPen *pOldPen = dc.SelectObject( &penLite );
if( m_bSortAsc )
{
//画升序小图标
dc.MoveTo( rcIcon.right - 2*m_nOffset, m_nOffset-1);
dc.LineTo( rcIcon.right - 3*m_nOffset/2, rcIcon.bottom - m_nOffset );
dc.LineTo( rcIcon.right - 5*m_nOffset/2-2, rcIcon.bottom - m_nOffset );
dc.MoveTo( rcIcon.right - 5*m_nOffset/2-1, rcIcon.bottom - m_nOffset-1 );
dc.SelectObject( &penShad );
dc.LineTo( rcIcon.right - 2*m_nOffset, m_nOffset-2);
}
else
{
//画降序小图标
dc.MoveTo( rcIcon.right - 3*m_nOffset/2, m_nOffset-1);
dc.LineTo( rcIcon.right - 2*m_nOffset-1, rcIcon.bottom - m_nOffset + 1 );
dc.MoveTo( rcIcon.right - 2*m_nOffset-1, rcIcon.bottom - m_nOffset );
dc.SelectObject( &penShad );
dc.LineTo( rcIcon.right - 5*m_nOffset/2-1, m_nOffset -1 );
dc.LineTo( rcIcon.right - 3*m_nOffset/2, m_nOffset -1);
}
//恢复原始的画笔
dc.SelectObject( pOldPen );
}
//恢复原始的设备描述上下文
dc.RestoreDC( nSavedDC );
//销毁使用的设备描述上下文
dc.Detach();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -