// HeadCtrl.cpp : implementation file // #include "stdafx.h" #include "HeadCtrl.h" #include "CellCtrl.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif #define NORML 0x00000000 #define MERGE 0x00000001 #define UNUSE 0x00000002 #define SetFlag(n) DWORD(BYTE(n)<<16) #define GetFlag(d) int((d & 0x00FF0000)>>16) #define SetDown(n) DWORD(BYTE(n)<<8) #define GetDown(d) int((d & 0x0000FF00)>>8) #define SetRight(n) DWORD(BYTE(n)) #define GetRight(d) int((d & 0x000000FF)) ///////////////////////////////////////////////////////////////////////////// // CHeadCtrl CHeadCtrl::CHeadCtrl() { m_bclick=FALSE; m_count=1; m_Info.SetSize(1); } CHeadCtrl::~CHeadCtrl() { m_Info.RemoveAll(); } BEGIN_MESSAGE_MAP(CHeadCtrl, CHeaderCtrl) //{{AFX_MSG_MAP(CHeadCtrl) ON_WM_LBUTTONDBLCLK() ON_WM_LBUTTONDOWN() ON_WM_PAINT() ON_WM_LBUTTONUP() //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CHeadCtrl message handlers int CHeadCtrl::GetHeadHeight() { CRect rect; GetItemRect(0, &rect); return rect.Height(); } void CHeadCtrl::SetCount(int nCount, CFont* pFont) { LOGFONT logfont; pFont->GetLogFont(&logfont); m_count=nCount; FontChange(logfont); m_Info.SetSize(nCount); } void CHeadCtrl::DeleteColumn(int nCol) { int nSize = static_cast(m_Info.GetSize()); for( int i=0; inCol) m_Info[i].RemoveAt(nCol); } } void CHeadCtrl::FontChange(LOGFONT logfont) { if(m_font.GetSafeHandle()) m_font.DeleteObject(); CFont font; m_font.CreateFontIndirect(&logfont); logfont.lfHeight-=m_count; logfont.lfHeight*=m_count; font.CreateFontIndirect(&logfont); SetFont(&font); font.DeleteObject(); } void CHeadCtrl::InsertColumn(int nCol) { for( int i=0; im_pnt.x && rect.topm_pnt.y && m_bclick) { dc.DrawEdge( &rect, EDGE_SUNKEN, BF_RECT | BF_SOFT); } else { dc.DrawEdge( &rect, EDGE_RAISED, BF_RECT | BF_SOFT); } BOOL bMulti = GetTextRect(&dc, strText, rect); if(bMulti) { dc.DrawText( strText, -1, rect, DT_CENTER | DT_VCENTER ); } else { dc.DrawText( strText, -1, rect, DT_CENTER | DT_SINGLELINE | DT_VCENTER ); } } } if(pOldFont) dc.SelectObject(pOldFont); } BOOL CHeadCtrl::GetTextRect(CDC* pDC, CString strText, CRect& rect) { int nCount=1, nStart=0; TEXTMETRIC metrics; while(1) { nStart = strText.Find('\n', nStart)+1; if(nStart < 1) break; nCount++; } if(nCount==1) return 0; pDC->GetOutputTextMetrics(&metrics) ; rect.top += ((rect.Height() - metrics.tmHeight * nCount)/2); return 1; } BOOL CHeadCtrl::IsDraw(CRect rect) { CRect rectCC; CCellCtrl* pCC=(CCellCtrl*)GetParent(); pCC->GetClientRect(&rectCC); int nPos = pCC->GetScrollPos(SB_HORZ); if(nPos>rect.right) return 0; if((nPos+rectCC.Width())