skinlistctrl.cpp
来自「网狐棋牌(家园版)最新版本7.1.1源代码,共享组件源码」· C++ 代码 · 共 331 行
CPP
331 行
#include "Stdafx.h"
#include "Resource.h"
#include "SkinListCtrl.h"
//////////////////////////////////////////////////////////////////////////
IMPLEMENT_DYNAMIC(CSkinListCtrl, CListCtrl)
BEGIN_MESSAGE_MAP(CSkinHeaderCtrl, CHeaderCtrl)
ON_WM_CREATE()
ON_WM_PAINT()
ON_WM_ERASEBKGND()
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
ON_WM_RBUTTONUP()
ON_WM_RBUTTONDOWN()
END_MESSAGE_MAP()
BEGIN_MESSAGE_MAP(CSkinListCtrl, CListCtrl)
ON_WM_CREATE()
ON_WM_ERASEBKGND()
END_MESSAGE_MAP()
//////////////////////////////////////////////////////////////////////////
//静态变量
CSkinListAttribute CSkinHeaderCtrl::m_SkinAttribute; //列表属性
//默认属性
#define DEF_HEADTEXT_COLOR RGB(0,18,87)
#define DEF_HEADTEXT_COLOR_EX RGB(0,18,87)
#define LIST_STYTE LVS_EX_FULLROWSELECT|LVS_EX_HEADERDRAGDROP|LVS_EX_ONECLICKACTIVATE|LVS_EX_UNDERLINEHOT|LVS_EX_FLATSB
//////////////////////////////////////////////////////////////////////////
//构造函数
CSkinListAttribute::CSkinListAttribute() : CSkinAttribute(TEXT("CSkinListCtrl"))
{
//初始化变量
m_crHeadText=DEF_HEADTEXT_COLOR;
//注册属性
RegisterAttribute(SKIN_LIST_CRHEADTEXT,&m_crHeadText,false);
RegisterAttribute(SKIN_LIST_STRIMAGEHEADPATH,&m_strImageHeadPath,false);
}
//析构函数
CSkinListAttribute::~CSkinListAttribute()
{
}
//加载配置
bool __cdecl CSkinListAttribute::LoadSkinOption()
{
//读取配置
m_crHeadText=ReadColor(SKIN_LIST_CRHEADTEXT,DEF_HEADTEXT_COLOR);
m_ImageHead.SetLoadInfo(IDB_SKIN_HEAD_TITLE,GetModuleHandle(SKIN_CONTROL_DLL_NAME));
return true;
}
//保存配置
bool __cdecl CSkinListAttribute::SaveSkinOption()
{
WriteColor(SKIN_LIST_CRHEADTEXT,m_crHeadText);
WriteString(SKIN_LIST_STRIMAGEHEADPATH,m_strImageHeadPath);
return true;
}
//////////////////////////////////////////////////////////////////////////
//构造函数
CSkinHeaderCtrl::CSkinHeaderCtrl()
{
m_iSortCol=-1;
m_SortType=Type_NoSort;
m_pIHeaderCtrlSink=NULL;
}
//析构函数
CSkinHeaderCtrl::~CSkinHeaderCtrl()
{
}
//重画函数
void CSkinHeaderCtrl::OnPaint()
{
//获取位置
CRect ClientRect;
GetClientRect(&ClientRect);
//设置自画
HD_ITEM HDItem;
HDItem.mask=HDI_FORMAT;
int iItemCount=GetItemCount();
for (int i=0;i<iItemCount;i++)
{
GetItem(i,&HDItem);
HDItem.fmt|=HDF_OWNERDRAW;
SetItem(i,&HDItem);
}
//建立缓冲图
CBitmap BufferBmp;
CClientDC ClientDC(this);
BufferBmp.CreateCompatibleBitmap(&ClientDC,ClientRect.Width(),ClientRect.Height());
m_BufferDC.CreateCompatibleDC(&ClientDC);
m_BufferDC.SelectObject(&BufferBmp);
m_BufferDC.SetBkMode(TRANSPARENT);
m_BufferDC.SetTextColor(m_SkinAttribute.m_crHeadText);
m_BufferDC.SelectObject(m_SkinAttribute.m_DefaultFont);
//加载位图
CImageHandle ImageHandle(&m_SkinAttribute.m_ImageHead);
if (ImageHandle.IsResourceValid())
{
ImageHandle->StretchBlt(m_BufferDC,ClientRect.left,ClientRect.top,ClientRect.Width(),ClientRect.Height());
m_BufferDC.Draw3dRect(ClientRect.left,ClientRect.top,ClientRect.Width(),ClientRect.Height(),RGB(0,0,0),RGB(0,0,0));
Default();
}
//绘画界面
ClientDC.BitBlt(0,0,ClientRect.Width(),ClientRect.Height(),&m_BufferDC,0,0,SRCCOPY);
m_BufferDC.DeleteDC();
BufferBmp.DeleteObject();
return;
}
//绘画函数
void CSkinHeaderCtrl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
//获取 DC
CDC * pDC=NULL;
if (m_BufferDC.GetSafeHdc()==NULL)
{
pDC=CDC::FromHandle(lpDrawItemStruct->hDC);
pDC->SetBkMode(TRANSPARENT);
pDC->SetTextColor(m_SkinAttribute.m_crHeadText);
pDC->SelectObject(m_SkinAttribute.m_DefaultFont);
}
else pDC=&m_BufferDC;
//获取信息
HDITEM HDItem;
TCHAR szBuffer[64];
HDItem.pszText=szBuffer;
HDItem.mask=HDI_TEXT|HDI_FORMAT;
HDItem.cchTextMax=sizeof(szBuffer)/sizeof(szBuffer[0]);
CRect rcItemRect=lpDrawItemStruct->rcItem;
GetItem(lpDrawItemStruct->itemID,&HDItem);
//获取状态
bool bSelected=(lpDrawItemStruct->itemState==ODS_SELECTED);
//绘画背景
if (m_SkinAttribute.m_ImageHead.IsNull()) pDC->DrawFrameControl(&rcItemRect,DFC_BUTTON,DFCS_BUTTONPUSH);
else m_SkinAttribute.m_ImageHead.StretchBlt(pDC->m_hDC,rcItemRect.left,rcItemRect.top,rcItemRect.Width(),rcItemRect.Height());
if (bSelected) pDC->Draw3dRect(&rcItemRect,RGB(0,0,0),RGB(125,125,125));
else pDC->Draw3dRect(&rcItemRect,RGB(125,125,125),RGB(0,0,0));
rcItemRect.DeflateRect(5,0,5,0);
//绘画标志
if ((m_iSortCol==lpDrawItemStruct->itemID)&&(m_SortType!=Type_NoSort))
{
if (rcItemRect.Width()>=14)
{
int nXOff=0,nYPos=(rcItemRect.Height()-9)/2+rcItemRect.top;
if (bSelected) { nYPos++; nXOff++; }
CPen * pWhitePen=CPen::FromHandle((HPEN)GetStockObject(WHITE_PEN));
CPen * pBlackPen=CPen::FromHandle((HPEN)GetStockObject(BLACK_PEN));
if (m_SortType==Type_Ascend)
{
pDC->SelectObject(pWhitePen);
pDC->MoveTo(rcItemRect.right-5+nXOff,nYPos);
pDC->LineTo(rcItemRect.right-14+nXOff,nYPos);
pDC->LineTo(rcItemRect.right-10+nXOff,nYPos+9);
pDC->SelectObject(pBlackPen);
pDC->LineTo(rcItemRect.right-5+nXOff,nYPos);
}
else
{
pDC->SelectObject(pWhitePen);
pDC->MoveTo(rcItemRect.right-10+nXOff,nYPos);
pDC->LineTo(rcItemRect.right-14+nXOff,nYPos+9);
pDC->LineTo(rcItemRect.right-5+nXOff,nYPos+9);
pDC->SelectObject(pBlackPen);
pDC->LineTo(rcItemRect.right-10+nXOff,nYPos);
}
}
rcItemRect.right-=19;
}
//绘画标题字体
UINT uFormat=DT_WORDBREAK|DT_EDITCONTROL|DT_END_ELLIPSIS|DT_SINGLELINE|DT_VCENTER;
if (HDItem.fmt&HDF_CENTER) uFormat|=DT_CENTER;
else if (HDItem.fmt&HDF_LEFT) uFormat|=DT_LEFT;
else if (HDItem.fmt&HDF_RIGHT) uFormat|=DT_RIGHT;
if (bSelected) rcItemRect.OffsetRect(1,1);
pDC->DrawText(HDItem.pszText,lstrlen(HDItem.pszText),&rcItemRect,uFormat);
return;
}
//背景函数
BOOL CSkinHeaderCtrl::OnEraseBkgnd(CDC * pDC)
{
return TRUE;
}
//获取标题
LPCTSTR CSkinHeaderCtrl::GetItemText(int iCol, TCHAR szBuffer[], int nSize)
{
ASSERT(szBuffer!=NULL);
if (iCol<GetItemCount())
{
HDITEM HDItem;
HDItem.pszText=szBuffer;
HDItem.mask=HDI_TEXT;
HDItem.cchTextMax=nSize;
GetItem(iCol,&HDItem);
}
else szBuffer[0]=0;
return szBuffer;
}
//坐标转换
int CSkinHeaderCtrl::PointToColIndex(CPoint Point)
{
CRect rcItemRect;
int iItemCount=GetItemCount();
for (int i=0;i<iItemCount;i++)
{
GetItemRect(i,&rcItemRect);
if (rcItemRect.PtInRect(Point)) return i;
}
return -1;
}
//设置标志
void CSkinHeaderCtrl::SetSortArrow(int iSortCol, enHeaderSortType SortType)
{
m_iSortCol=iSortCol;
m_SortType=SortType;
Invalidate(FALSE);
return;
}
//获取标志
void CSkinHeaderCtrl::GetSortArrow(int & iSortCol, enHeaderSortType & SortType)
{
iSortCol=m_iSortCol;
SortType=m_SortType;
return;
}
//鼠标消息
void CSkinHeaderCtrl::OnLButtonDown(UINT nFlags, CPoint point)
{
if (m_pIHeaderCtrlSink!=NULL) m_pIHeaderCtrlSink->OnHeaderLButtonDown(this,nFlags,point);
CHeaderCtrl::OnLButtonDown(nFlags, point);
}
//鼠标消息
void CSkinHeaderCtrl::OnLButtonUp(UINT nFlags, CPoint point)
{
if (m_pIHeaderCtrlSink!=NULL) m_pIHeaderCtrlSink->OnHeaderLButtonUp(this,nFlags,point);
CHeaderCtrl::OnLButtonUp(nFlags, point);
}
//鼠标消息
void CSkinHeaderCtrl::OnRButtonUp(UINT nFlags, CPoint point)
{
if (m_pIHeaderCtrlSink!=NULL) m_pIHeaderCtrlSink->OnHeaderRButtonUp(this,nFlags,point);
CHeaderCtrl::OnRButtonUp(nFlags, point);
}
//鼠标消息
void CSkinHeaderCtrl::OnRButtonDown(UINT nFlags, CPoint point)
{
if (m_pIHeaderCtrlSink!=NULL) m_pIHeaderCtrlSink->OnHeaderRButtonDown(this,nFlags,point);
CHeaderCtrl::OnRButtonDown(nFlags, point);
}
//////////////////////////////////////////////////////////////////////////
//构造函数
CSkinListCtrl::CSkinListCtrl()
{
}
//析构函数
CSkinListCtrl::~CSkinListCtrl()
{
}
//控件绑定
void CSkinListCtrl::PreSubclassWindow()
{
__super::PreSubclassWindow();
m_SkinHeadCtrl.SubclassWindow(GetHeaderCtrl()->GetSafeHwnd());
SetExtendedStyle(LIST_STYTE);
return;
}
//建立消息
int CSkinListCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (__super::OnCreate(lpCreateStruct)==-1) return -1;
m_SkinHeadCtrl.SubclassWindow(GetHeaderCtrl()->GetSafeHwnd());
SetExtendedStyle(LIST_STYTE);
return 0;
}
//绘画背景
BOOL CSkinListCtrl::OnEraseBkgnd(CDC * pDC)
{
if (m_SkinHeadCtrl.GetSafeHwnd())
{
CRect ClientRect,ListHeaderRect;
GetClientRect(&ClientRect);
m_SkinHeadCtrl.GetWindowRect(&ListHeaderRect);
ClientRect.top=ListHeaderRect.Height();
pDC->FillSolidRect(&ClientRect,GetBkColor());
return TRUE;
}
return __super::OnEraseBkgnd(pDC);
}
//////////////////////////////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?