⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 flatheadctrl.cpp

📁 本程序为求解博弈纳什均衡解的源程序
💻 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 + -