?? tsyslistviewex.cpp
字號:
/************************************
REVISION LOG ENTRY
Revision By: Mihai Filimon
Revised on 5/22/98 9:23:23 AM
Comments: Tsyslistviewex.cpp : implementation file
************************************/
#include "stdafx.h"
#include "Tsyslistviewex.h"
#include "resource.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define scanCodeS 0x13
/////////////////////////////////////////////////////////////////////////////
// CTsyslistviewex
TCHAR CTsyslistviewex::m_cImageTextSeparator = TCHAR(':');
// Function name : CTsyslistviewex::CTsyslistviewex
// Description : constructor
// In contructor u must set the height of item list. (MeasureItem is called before
// PreSubclassWindow!). U can not modify item height at runtime, therefore.
// Return type : void
// Argument : int nHeightRel ; set item height
CTsyslistviewex::CTsyslistviewex(int nHeightRel)
{
m_fctDrawItem = CTsyslistviewex::DrawItemNoGrid;
m_nHeightRel = nHeightRel;
m_bSorted = false;
m_bSortWhenClickHeader = TRUE;
m_nSortItems = 0;
m_nIProgress = 0;
m_bSaveHeader = false;
ResetBoldLines();
}
// Function name : CTsyslistviewex::~CTsyslistviewex
// Description : destructor
// Return type : void
CTsyslistviewex::~CTsyslistviewex()
{
// Remove the CTColumnBitmap from m_bmpColumns
POSITION posBmp = m_bmpColumns.GetStartPosition( );
while (posBmp)
{
CTColumnBitmap* pBitmap = NULL;
int nColumn = 0;
m_bmpColumns.GetNextAssoc( posBmp , nColumn, pBitmap );
if (pBitmap)
delete pBitmap;
}
m_bmpColumns.RemoveAll();
// Remove the CTColumnBitmap from m_bmpCells
posBmp = m_bmpCells.GetStartPosition( );
while (posBmp)
{
CTColumnBitmap* pBitmap = NULL;
DWORD nKey = 0;
m_bmpCells.GetNextAssoc( posBmp , nKey, pBitmap );
if (pBitmap)
delete pBitmap;
}
m_bmpCells.RemoveAll();
}
// Function name : CTsyslistviewex::IsHeaderSaved
// Description : accessor: header saved
// Return type : BOOL ;Return TRUE if EnableSaveHeader was called
BOOL CTsyslistviewex::IsHeaderSaved()
{
return m_bSaveHeader;
}
// Function name : CTsyslistviewex::GetRegisteredSort
// Description : Read form registry in dest for Sort:ID.
// Return type : BOOL ; Return TRUE if key exist.
// Argument : CString & dest ; string to put value into
BOOL CTsyslistviewex::GetRegisteredSort(CString & dest)
{
BOOL bResult = false;
if (IsHeaderSaved())
{
CString secid; secid.Format(_T("Sort:%08X"), GetDlgCtrlID());
CString result = AfxGetApp()->GetProfileString(LIST_SECTION, secid, _T("Default"));
if (result != _T("Default"))
{
dest = result;
bResult = true;
}
}
return bResult;
}
// Function name : CTsyslistviewex::SaveHeader
// Description : Save widths and sort columns in registry in fromat:
// Header:ID = Column1:C:126, ...
// Sort:ID = 1D,2,3 ...
// Return type : void
void CTsyslistviewex::SaveHeader()
{
if (IsHeaderSaved())
{
CString secid; secid.Format(_T("Header:%08X"), GetDlgCtrlID());
AfxGetApp()->WriteProfileString(LIST_SECTION, secid, (LPCTSTR)GetHeaderString());
secid.Format(_T("Sort:%08X"), GetDlgCtrlID());
AfxGetApp()->WriteProfileString(LIST_SECTION, secid, (LPCTSTR)GetHeaderSortString());
}
}
BEGIN_MESSAGE_MAP(CTsyslistviewex, CListCtrl)
//{{AFX_MSG_MAP(CTsyslistviewex)
ON_WM_LBUTTONDOWN()
ON_NOTIFY_REFLECT(LVN_COLUMNCLICK, OnColumnclick)
ON_WM_CHAR()
//}}AFX_MSG_MAP
ON_WM_MEASUREITEM_REFLECT()
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CTsyslistviewex message handlers
// Function name : CTsyslistviewex::PreSubclassWindow
// Description : Called when user subclass list control form resource
// Return type : void
void CTsyslistviewex::PreSubclassWindow( )
{
// Must be owner draw and report mode....
ModifyStyle(LVS_SMALLICON | LVS_LIST | LVS_ICON , LVS_OWNERDRAWFIXED | LVS_REPORT);
m_pOldHeaderCtrl = GetDlgItem(0);
// Create different fonts..
if (CFont* pFont = GetFont())
{
LOGFONT lf;
pFont->GetLogFont(&lf);
lf.lfWeight = FW_BOLD;
m_boldFont.CreateFontIndirect(&lf);
lf.lfWeight = FW_NORMAL;
lf.lfItalic = TRUE;
m_italicFont.CreateFontIndirect(&lf);
lf.lfWeight = FW_BOLD;
lf.lfItalic = TRUE;
m_italicBoldFont.CreateFontIndirect(&lf);
}
SetWindowLong(m_hWnd, GWL_USERDATA , LIST_SUBCLASSED);
}
// Function name : CTsyslistviewex::OnLButtonDown
// Description : If user click in list ctrl, test item, subItem
// Return type : void
// Argument : UINT nFlags
// Argument : CPoint point
void CTsyslistviewex::OnLButtonDown(UINT nFlags, CPoint point)
{
SetFocus();
int item = -1, subItem = -1 ;
item = HitTestEx(point, subItem);
CListCtrl::OnLButtonDown(nFlags, point);
}
// Function name : CTsyslistviewex::MakeShortString
// Description : Return shorted string lpszLong in device pDC
// Return type : LPCTSTR
// Argument : CDC* pDC
// Argument : LPCTSTR lpszLong
// Argument : int nColumnLen
// Argument : int nOffset
LPCTSTR CTsyslistviewex::MakeShortString(CDC* pDC, LPCTSTR lpszLong, int nColumnLen, int nOffset)
{
static const TCHAR szThreeDots[] = _T("...\0");
static TCHAR szShort[MAX_PATH];
int nStringLen = strlen(lpszLong);
if(nStringLen == 0 ||
(pDC->GetTextExtent(lpszLong, nStringLen).cx + nOffset) <= nColumnLen)
{
return(lpszLong);
}
strcpy(szShort,lpszLong);
int nAddLen = pDC->GetTextExtent(szThreeDots,strlen(szThreeDots)).cx;
for(int i = nStringLen-1; i > 0; i--)
{
szShort[i] = '\0';
if((pDC->GetTextExtent(szShort, i).cx + nOffset + nAddLen)
<= nColumnLen)
{
break;
}
}
strcat(szShort, szThreeDots);
return(szShort);
}
// Function name : CTsyslistviewex::DrawCell
// Description : Draw at pDC in drawRect cell(nItem,nColumn) with format
// Return type : void
// Argument : CDC* pDC
// Argument : CRect& drawRect
// Argument : int nItem
// Argument : int nColumn
void CTsyslistviewex::DrawCell(CDC* pDC, CRect& drawRect, DWORD format, int nItem, int nColumn)
{
static TCHAR szBuff[MAX_PATH];
LPCTSTR pszText;
GetItemText(nItem, nColumn, szBuff, sizeof(szBuff));
{
CTColumnBitmap* pBitmap = GetBitmapCell(GetItemData(nItem),nColumn);
int dxBitmap = 0;
CString sImageBitmap, sText(szBuff);
if (pBitmap)
{
dxBitmap = min(pBitmap->GetWidth(),drawRect.Width());
int p = sText.Find(m_cImageTextSeparator);
sImageBitmap = sText.Left(max(0,p));
sText = sText.Mid(p + 1);
if (p < 0)
{
sImageBitmap = sText;
sText.Empty();
}
}
pszText = MakeShortString(pDC, (LPCTSTR)sText, (drawRect.right - (drawRect.left + dxBitmap + OFFSET)), OFFSET);
if (*pszText != TCHAR('\0'))
{
UINT nJustify = DT_LEFT;
if(pszText == sText)
{
switch(format & LVCFMT_JUSTIFYMASK)
{
case LVCFMT_RIGHT:
nJustify = DT_RIGHT;
break;
case LVCFMT_CENTER:
nJustify = DT_CENTER;
break;
default:
break;
}
}
drawRect.left = drawRect.left + dxBitmap + OFFSET;
pDC->DrawText(pszText, -1, drawRect, nJustify | DT_SINGLELINE | DT_NOPREFIX | DT_VCENTER);
drawRect.left = drawRect.left -(dxBitmap + OFFSET);
}
if (dxBitmap)
{
int nImageColumn = atoi(sImageBitmap);
int x = drawRect.left;
CRect rectImage = pBitmap->GetRectImage(nImageColumn);
pBitmap->Put(nImageColumn, pDC, x , drawRect.top + (drawRect.Height() - rectImage.Height())/2, dxBitmap);
}
}
}
// Function name : CTsyslistviewex::DrawItemGrid
// Description : Draw item with grid lines
// Return type : void
// Argument : LPDRAWITEMSTRUCT lpDrawItemStruct
void CTsyslistviewex::DrawItemGrid(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
// device contextul itemului
CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
// dreptunghiul corespunzator itemului
CRect rcItem(lpDrawItemStruct->rcItem);
// identificatorul itemului
int nItem = lpDrawItemStruct->itemID;
BYTE value = 0;
CFont* pOldFont = NULL;
if (m_mapRowsBold.Lookup(lpDrawItemStruct->itemData, value))
pOldFont = (CFont*)pDC->SelectObject(&m_boldFont);
if (m_mapRowsItalic.Lookup(lpDrawItemStruct->itemData, value))
{
CFont* pF = (CFont*)pDC->SelectObject(&m_italicFont);
if (pOldFont)
pF = (CFont*)pDC->SelectObject(&m_italicBoldFont);
else
pOldFont = pF;
}
// culori
COLORREF clrTextSave, clrBkSave;
// get item data
LV_ITEM lvi;
lvi.mask = LVIF_STATE;
lvi.iItem = nItem;
lvi.iSubItem = 0;
lvi.stateMask = 0xFFFF; // get all state flags
GetItem(&lvi);
BOOL bFocus = ((lvi.state & LVIS_FOCUSED) == LVIS_FOCUSED);
BOOL bSelected = (GetStyle() & LVS_SHOWSELALWAYS) && (lvi.state & LVIS_SELECTED);
bSelected = bSelected || (lvi.state & LVIS_DROPHILITED);
// set colors if item is selected
CRect rcAllLabels;
GetItemRect(nItem, rcAllLabels, LVIR_BOUNDS);
if (bSelected)
{
clrTextSave = pDC->SetTextColor(::GetSysColor(COLOR_HIGHLIGHTTEXT));
clrBkSave = pDC->SetBkColor(::GetSysColor(COLOR_HIGHLIGHT));
}
pDC->FillRect(rcAllLabels, &CBrush(::GetSysColor(bSelected ? COLOR_HIGHLIGHT : COLOR_WINDOW)));
// draw item
CBrush brush(RGB(128,128,128));
GetItemRect(nItem, rcItem, LVIR_LABEL);
LV_COLUMN lvc;
lvc.mask = LVCF_FMT | LVCF_WIDTH;
rcItem.OffsetRect(-OFFSET,0);
for(int nColumn = 0; GetColumn(nColumn, &lvc); nColumn++)
{
rcItem.right = rcItem.left + lvc.cx;
CRect drawRect(rcItem);
drawRect.InflateRect(-1,-1);
pDC->FrameRect(drawRect, &brush);
drawRect.OffsetRect(1,0);
drawRect.InflateRect(-2,0);
DrawCell(pDC,drawRect,lvc.fmt, nItem,nColumn);
rcItem.left = rcItem.right;
}
pDC->SelectObject(pOldFont);
// draw focus rectangle if item has focus
if (bFocus)
pDC->DrawFocusRect(rcAllLabels);
// set original colors if item was selected
if (bSelected)
{
pDC->SetTextColor(clrTextSave);
pDC->SetBkColor(clrBkSave);
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -