📄 gfxlistctrl.cpp
字号:
// GfxListCtrl.cpp : implementation file
//
#include "stdafx.h"
#include "WspProcess.h"
#include "GfxListCtrl.h"
#include "GfxInEdit.h"
#include "GfxInCombo.h"
#include "GfxPopupMenu.h"
#include "GfxCustomizeColumnDlg.h"
#include "GfxFormatColumnDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define _SORTASC_TEXT "Sort ascending"
#define _SORTDESC_TEXT "Sort descending"
#define _CUSTHEAD_TEXT "Customize header"
#define _FORMATHEAD_TEXT "Header format"
#define IDC_IPEDIT 104
/////////////////////////////////////////////////////////////////////////////
// CSortClass
CSortClass::CSortClass(CListCtrl * _pWnd, const int _iCol, const bool _bIsNumeric, const bool _bIsValute)
{
iCol = _iCol;
pWnd = _pWnd;
bIsNumeric = _bIsNumeric;
bIsValute = _bIsValute;
if (bIsValute) bIsNumeric = false;
ASSERT(pWnd);
int max = pWnd->GetItemCount();
DWORD dw;
CString txt;
if (bIsNumeric)
{
for (int t = 0; t < max; t++)
{
dw = pWnd->GetItemData(t);
txt = pWnd->GetItemText(t, iCol);
pWnd->SetItemData(t, (DWORD) new CSortItemInt(dw, txt));
}
}
else if (bIsValute)
{
for (int t = 0; t < max; t++)
{
dw = pWnd->GetItemData(t);
txt = pWnd->GetItemText(t, iCol);
pWnd->SetItemData(t, (DWORD) new CSortItemInt(dw, txt, true));
}
}
else
{
for (int t = 0; t < max; t++)
{
dw = pWnd->GetItemData(t);
txt = pWnd->GetItemText(t, iCol);
pWnd->SetItemData(t, (DWORD) new CSortItem(dw, txt));
}
}
}
CSortClass::~CSortClass()
{
ASSERT(pWnd);
int max = pWnd->GetItemCount();
if (bIsNumeric || bIsValute)
{
CSortItemInt * pItem;
for (int t = 0; t < max; t++)
{
pItem = (CSortItemInt *) pWnd->GetItemData(t);
ASSERT(pItem);
pWnd->SetItemData(t, pItem->dw);
delete pItem;
}
}
else
{
CSortItem * pItem;
for (int t = 0; t < max; t++)
{
pItem = (CSortItem *) pWnd->GetItemData(t);
ASSERT(pItem);
pWnd->SetItemData(t, pItem->dw);
delete pItem;
}
}
}
void
CSortClass::Sort(const bool bAsc)
{
if (bIsNumeric || bIsValute)
{
if (bAsc)
pWnd->SortItems(CompareAscI, 0L);
else
pWnd->SortItems(CompareDesI, 0L);
}
else
{
if (bAsc)
pWnd->SortItems(CompareAsc, 0L);
else
pWnd->SortItems(CompareDes, 0L);
}
}
int CALLBACK CSortClass::CompareAsc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
CSortItem * i1 = (CSortItem *) lParam1;
CSortItem * i2 = (CSortItem *) lParam2;
ASSERT(i1 && i2);
return i1->txt.CompareNoCase(i2->txt);
}
int CALLBACK CSortClass::CompareDes(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
CSortItem * i1 = (CSortItem *) lParam1;
CSortItem * i2 = (CSortItem *) lParam2;
ASSERT(i1 && i2);
return i2->txt.CompareNoCase(i1->txt);
}
int CALLBACK CSortClass::CompareAscI(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
CSortItemInt * i1 = (CSortItemInt *) lParam1;
CSortItemInt * i2 = (CSortItemInt *) lParam2;
ASSERT(i1 && i2);
if (i1->iInt == i2->iInt) return 0;
return i1->iInt > i2->iInt ? 1 : -1;
}
int CALLBACK CSortClass::CompareDesI(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
CSortItemInt * i1 = (CSortItemInt *) lParam1;
CSortItemInt * i2 = (CSortItemInt *) lParam2;
ASSERT(i1 && i2);
if (i1->iInt == i2->iInt) return 0;
return i1->iInt < i2->iInt ? 1 : -1;
}
CSortClass::CSortItem::CSortItem(const DWORD _dw, const CString & _txt)
{
dw = _dw;
txt = _txt;
}
CSortClass::CSortItem::~CSortItem()
{
}
CSortClass::CSortItemInt::CSortItemInt(const DWORD _dw, CString & _txt, bool bIsValute)
{
if (bIsValute)
{
static char newtxt[256];
newtxt[0] = 0;
char * ch = _txt.LockBuffer();
int lmax = _txt.GetLength(), lidx = 0;
for (int i = 0; i < lmax; i++)
{
if (ch[i] != '.') newtxt[lidx++] = ch[i];
}
newtxt[lidx] = 0;
_txt.UnlockBuffer();
iInt = atoi(newtxt);
}
else
{
iInt = atoi(_txt);
}
dw = _dw;
}
/////////////////////////////////////////////////////////////////////////////
// CGfxListCtrl
CGfxListCtrl::CGfxListCtrl()
{
dwFlag = fHighRowSelect|fVertGrid|fHorizGrid|fAutoSort|fExInfo|fSubItemImages|fCellToolTip|fReturnModify|fReturnDblClk|fScrollBarAlways|fShowSelCell;
dwhCombo = dwhComboEx = dwhEdit = dwhNumeric = dwhValute = dwhCombo = dwhImages = 0;
wndHeader.dwSortUp = 0;
m_clrText = GetSysColor(COLOR_WINDOWTEXT);
m_clrTextBk= GetSysColor(COLOR_WINDOW);
m_clrBkgnd = GetSysColor(COLOR_WINDOW);
crBackSel = GetSysColor(COLOR_HIGHLIGHT);
crCategoryBck = GetSysColor(COLOR_INACTIVECAPTION);
cr3dFace = GetSysColor(COLOR_3DFACE);
m_cxClient = 0;
gpn = new CPen(PS_SOLID, 1, RGB(192,192,192));//GetSysColor(COLOR_INACTIVECAPTION));
gcatpn = new CPen(PS_SOLID, 1, RGB(128,128,128));
m_cxStateImageOffset = 0;
CFont * ft = CFont::FromHandle((HFONT) GetStockObject(DEFAULT_GUI_FONT));
LOGFONT lf;
ASSERT(ft);
ft->GetLogFont(&lf);
ftNormal.CreateFontIndirect(&lf);
lf.lfWeight = 700;
ftBold.CreateFontIndirect(&lf);
lf.lfWeight = 0;
lf.lfUnderline = TRUE;
ftUnderline.CreateFontIndirect(&lf);
lf.lfUnderline = FALSE;
lf.lfItalic = TRUE;
ftItalic.CreateFontIndirect(&lf);
pReciper = NULL;
iSubItemFocus = -1;
pItemImageList = NULL;
iCtrlId = -1;
wndHeader.SetCallback((void (CWnd::*)(int &, int &))DragColumn);
pManager = NULL;
pCategoryManager = NULL;
m_fpGetTextCallback = NULL;
m_fpDaoCategoryFun = NULL;
m_fpExInfoFun = NULL;
iInternal1 = -1;
iItemHeight = 17;
iItemHeightCategory = 16;
bBlendBitmap = true;
iAutoPreviewHeight = 0;
bDaoBind = false;
pRecordSet = NULL;
rcMarginMM = CRect(0,0,0,0);
dwPrintFlag = 0;
csPrintName = "Gfx list Control";
}
CGfxListCtrl::~CGfxListCtrl()
{
if (gpn) delete gpn;
if (gcatpn) delete gcatpn;
if (ftNormal.GetSafeHandle()) ftNormal.DeleteObject();
if (ftUnderline.GetSafeHandle()) ftUnderline.DeleteObject();
if (ftBold.GetSafeHandle()) ftBold.DeleteObject();
if (ftItalic.GetSafeHandle()) ftItalic.DeleteObject();
if (pManager) delete pManager;
if (pCategoryManager) delete pCategoryManager;
}
BEGIN_MESSAGE_MAP(CGfxListCtrl, CListCtrl)
//{{AFX_MSG_MAP(CGfxListCtrl)
ON_WM_CREATE()
ON_NOTIFY_REFLECT(LVN_COLUMNCLICK, OnColumnclick)
ON_WM_MOUSEMOVE()
ON_WM_SIZE()
ON_WM_PAINT()
ON_WM_LBUTTONUP()
ON_NOTIFY_REFLECT(NM_CLICK, OnClick)
ON_NOTIFY_REFLECT(LVN_ENDLABELEDIT, OnEndlabeledit)
ON_WM_HSCROLL()
ON_WM_VSCROLL()
ON_WM_LBUTTONDOWN()
ON_NOTIFY_REFLECT(LVN_KEYDOWN, OnKeydown)
ON_COMMAND(ID_GFX_CUSTOMIZEHEAD, OnGfxCustomizehead)
ON_UPDATE_COMMAND_UI(ID_GFX_CUSTOMIZEHEAD, OnUpdateGfxCustomizehead)
ON_COMMAND(ID_GFX_FORMATHEADER, OnGfxFormatheader)
ON_UPDATE_COMMAND_UI(ID_GFX_FORMATHEADER, OnUpdateGfxFormatheader)
ON_COMMAND(ID_GFX_SORTASC, OnGfxSortasc)
ON_UPDATE_COMMAND_UI(ID_GFX_SORTASC, OnUpdateGfxSortasc)
ON_COMMAND(ID_GFX_SORTDESC, OnGfxSortdesc)
ON_UPDATE_COMMAND_UI(ID_GFX_SORTDESC, OnUpdateGfxSortdesc)
ON_WM_LBUTTONDBLCLK()
ON_WM_QUERYNEWPALETTE()
ON_WM_PALETTECHANGED()
ON_WM_ERASEBKGND()
//}}AFX_MSG_MAP
ON_MESSAGE(LVM_SETTEXTCOLOR, OnSetTextColor)
ON_MESSAGE(LVM_SETTEXTBKCOLOR, OnSetTextBkColor)
ON_MESSAGE(LVM_SETBKCOLOR, OnSetBkColor)
ON_MESSAGE(LVM_SETIMAGELIST, OnSetImageList)
ON_MESSAGE(WM_USER_TAB, OnUserTab)
ON_WM_MEASUREITEM_REFLECT()
END_MESSAGE_MAP()
// ON_NOTIFY_REFLECT(NM_DBLCLK, OnDblclk)
/////////////////////////////////////////////////////////////////////////////
// CGfxListCtrl message handlers
LRESULT CGfxListCtrl::OnSetTextColor(WPARAM wParam, LPARAM lParam)
{
m_clrText = (COLORREF) lParam;
return (Default());
}
LRESULT CGfxListCtrl::OnSetTextBkColor(WPARAM wParam, LPARAM lParam)
{
m_clrTextBk = (COLORREF) lParam;
return (Default());
}
LRESULT CGfxListCtrl::OnSetBkColor(WPARAM wParam, LPARAM lParam)
{
m_clrBkgnd = (COLORREF) lParam;
return (Default());
}
LRESULT CGfxListCtrl::OnSetImageList(WPARAM wParam, LPARAM lParam)
{
if ((int)wParam == LVSIL_STATE)
{
int cx, cy;
if(::ImageList_GetIconSize((HIMAGELIST)lParam,&cx,&cy)) m_cxStateImageOffset=cx;
else m_cxStateImageOffset=0;
}
return(Default());
}
int CGfxListCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CListCtrl::OnCreate(lpCreateStruct) == -1)
return -1;
if (wndToolTip.GetSafeHwnd() == NULL) OnInit();
/*
if ((GetStyle()&LVS_TYPEMASK) == LVS_REPORT)
{
HWND hHead = ::GetDlgItem(m_hWnd,0);
VERIFY(wndHeader.SubclassWindow(hHead));
TRACE0("Header subclassed.\n");
wndToolTip.Create(this);
wndToolTip.ShowWindow(SW_HIDE);
wndHeader.ModifyStyle(0,HDS_DRAGDROP|HDS_FULLDRAG, SWP_FRAMECHANGED);
}
*/
return 0;
}
int CGfxListCtrl::InsertColumnEx(int iPos, const char * cText, int iAlign, int iWidth, DWORD exData)
{
int idx = InsertColumn(iPos, cText, iAlign, iWidth, iPos);
ASSERT(idx >= 0);
if (exData & fhComboBox) dwhCombo |= (1 << iPos);
if (exData & fhComboBoxEx) dwhComboEx |= (1 << iPos);
if (exData & fhEdit) dwhEdit |= (1 << iPos);
if (exData & fhNumeric) dwhNumeric |= (1 << iPos);
if (exData & fhValute) dwhValute |= (1 << iPos);
if (exData & fhSortAble) wndHeader.dwSortUp |= (1 << iPos);
if (exData & fhImage) dwhImages |= (1 << iPos);
if (exData & fhNoSortArrow) wndHeader.dwDontShowSortArrow |= (1 << iPos);
if (exData & fhNoResizeColumn) wndHeader.dwNoResizeColumn |= (1 << iPos);
return idx;
}
LPCTSTR CGfxListCtrl::MakeShortString(CDC* pDC, LPCTSTR lpszLong, int nColumnLen, int nOffset)
{
static const _TCHAR szThreeDots[]=_T("...");
int nStringLen=lstrlen(lpszLong);
if(nStringLen==0 || pDC->GetTextExtent(lpszLong,nStringLen).cx+nOffset<=nColumnLen)
return(lpszLong);
static _TCHAR szShort[MAX_PATH];
lstrcpy(szShort,lpszLong);
int nAddLen=pDC->GetTextExtent(szThreeDots,sizeof(szThreeDots)).cx;
for(int i=nStringLen-1; i>0; i--)
{
szShort[i]=0;
if(pDC->GetTextExtent(szShort,i).cx+nOffset+nAddLen<=nColumnLen)
break;
}
lstrcat(szShort,szThreeDots);
return(szShort);
}
void CGfxListCtrl::MakeShortString(CDC* pDC, CString &cs, int nColumnLen, int nOffset)
{
static const _TCHAR szThreeDots[]=_T("...");
int nStringLen = cs.GetLength();
if (nStringLen == 0 || pDC->GetTextExtent(cs).cx + nOffset <= nColumnLen) return;
static _TCHAR szShort[MAX_PATH];
lstrcpy(szShort, cs);
int nAddLen = pDC->GetTextExtent(szThreeDots,sizeof(szThreeDots)).cx;
for (int i = nStringLen-1; i > 0; i--)
{
szShort[i]=0;
if(pDC->GetTextExtent(szShort,i).cx+nOffset+nAddLen<=nColumnLen)
break;
}
lstrcat(szShort,szThreeDots);
cs = szShort;
}
void CGfxListCtrl::DrawItemCategory(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
CRect rcItem(lpDrawItemStruct->rcItem);
UINT uiFlags = ILD_TRANSPARENT;
CImageList* pImageList;
int nItem = lpDrawItemStruct->itemID;
BOOL bFocus = (GetFocus() == this);
COLORREF clrTextSave, clrBkSave;
COLORREF clrImage = m_clrBkgnd;
LV_ITEM lvi;
lvi.mask = LVIF_IMAGE | LVIF_STATE | LVIF_PARAM;
lvi.iItem = nItem;
lvi.iSubItem = 0;
lvi.stateMask = 0xFFFF; // get all state flags
GetItem(&lvi);
CString csItem;
DWORD dwItemData = GetItemData(nItem);
csItem = GetItemText(nItem, 0);
CRect clipBox;
pDC->GetClipBox(clipBox);
BOOL bSelected=(bFocus || (GetStyle() & LVS_SHOWSELALWAYS)) && lvi.state & LVIS_SELECTED;
bSelected=bSelected || (lvi.state & LVIS_DROPHILITED);
CRect rcAllLabels;
GetItemRect(nItem,rcAllLabels,LVIR_BOUNDS);
CRect rcLabel;
GetItemRect(nItem,rcLabel,LVIR_LABEL);
if (dwFlag&fHighRowSelect && rcAllLabels.right<m_cxClient) rcAllLabels.right = m_cxClient;
CPen *opn = pDC->SelectObject(gcatpn);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -