📄 tlistview.cpp
字号:
/*****************************************************************************/
/* TListView.cpp Copyright (c) Ladislav Zezula 2003 */
/*---------------------------------------------------------------------------*/
/* Implementation of the TListView class */
/*---------------------------------------------------------------------------*/
/* Date Ver Who Comment */
/* -------- ---- --- ------- */
/* 03.04.03 1.00 Lad The first version of TListView.cpp */
/*****************************************************************************/
#include "stdafx.h"
#include "TMainFrm.h"
#include "TListView.h"
#include "TTreeView.h"
#include "StormHelp.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
//-----------------------------------------------------------------------------
// Local functions
int CALLBACK TListView::CompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParam)
{
TListView * pListView = (TListView *)lParam;
if(pListView != NULL)
return pListView->CompareItems(lParam1, lParam2);
return 0;
}
//-----------------------------------------------------------------------------
// TListView
IMPLEMENT_DYNCREATE(TListView, CListView);
BEGIN_MESSAGE_MAP(TListView, CListView)
//{{AFX_MSG_MAP(TListView)
ON_WM_CREATE()
ON_NOTIFY_REFLECT(NM_DBLCLK, OnDblClick)
ON_WM_CONTEXTMENU()
ON_NOTIFY_REFLECT(LVN_BEGINLABELEDIT, OnBeginLabelEdit)
ON_NOTIFY_REFLECT(LVN_ENDLABELEDIT, OnEndLabelEdit)
ON_WM_CHAR()
ON_WM_KEYDOWN()
ON_WM_DROPFILES()
ON_NOTIFY_REFLECT(LVN_COLUMNCLICK, OnColumnClick)
ON_NOTIFY_REFLECT(LVN_BEGINDRAG, OnBeginDrag)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
//-----------------------------------------------------------------------------
// Constructor and destructor
TListView::TListView()
{
SHFILEINFO sfi;
// Retrieve handle to the system image list
ZeroMemory(&sfi, sizeof(SHFILEINFO));
m_hImlNormal = (HIMAGELIST)SHGetFileInfo("a.txt", FILE_ATTRIBUTE_ARCHIVE, &sfi, sizeof(SHFILEINFO), SHGFI_USEFILEATTRIBUTES | SHGFI_SYSICONINDEX | SHGFI_LARGEICON);
m_hImlSmall = (HIMAGELIST)SHGetFileInfo("a.txt", FILE_ATTRIBUTE_ARCHIVE, &sfi, sizeof(SHFILEINFO), SHGFI_USEFILEATTRIBUTES | SHGFI_SYSICONINDEX | SHGFI_SMALLICON);
m_hCurrent = NULL;
m_uSortColumn = 0;
m_bAscending = TRUE;
}
TListView::~TListView()
{}
//-----------------------------------------------------------------------------
// Public functions
void TListView::SetLinkPointers(TMainFrame * pMainFrame, TTreeView * pTreeView)
{
m_pMainFrame = pMainFrame;
m_pTreeView = pTreeView;
}
int TListView::CompareItems(LPARAM lParam1, LPARAM lParam2)
{
char * szExt1 = NULL;
char * szExt2 = NULL;
int nResult = 0;
// If comparing two directories, compare them by name
if((lParam1 & 0x80000000) == 0 && (lParam2 & 0x80000000) == 0)
{
char szText1[MAX_PATH] = "";
char szText2[MAX_PATH] = "";
m_pTreeView->GetItemData((HTREEITEM)lParam1, szText1, sizeof(szText1));
m_pTreeView->GetItemData((HTREEITEM)lParam2, szText2, sizeof(szText2));
nResult = stricmp(szText1, szText2);
// If descending, reverse the result
if(m_bAscending == FALSE)
nResult = -nResult;
return nResult;
}
// If comparing directory, the directory is always first
if((lParam1 & 0x80000000) == 0 && (lParam2 & 0x80000000) != 0)
return -1;
// If comparing file and directory, the directory is always first
if((lParam1 & 0x80000000) != 0 && (lParam2 & 0x80000000) == 0)
return 1;
// If comparing two files, compare by the sort column
TFileInfo * pInfo1 = (TFileInfo *)(lParam1 & 0x7FFFFFFF);
TFileInfo * pInfo2 = (TFileInfo *)(lParam2 & 0x7FFFFFFF);
szExt1 = strrchr(pInfo1->szPlainName, '.');
szExt2 = strrchr(pInfo2->szPlainName, '.');
switch(m_uSortColumn)
{
case 0:
nResult = stricmp(pInfo1->szPlainName, pInfo2->szPlainName);
break;
case 1:
if(szExt1 != NULL && szExt2 != NULL)
nResult = stricmp(szExt1, szExt2);
break;
case 2:
if(pInfo1->lcLocale != pInfo2->lcLocale)
nResult = (pInfo1->lcLocale < pInfo2->lcLocale) ? -1 : 1;
break;
case 3:
if(pInfo1->dwFileSize != pInfo2->dwFileSize)
nResult = (pInfo1->dwFileSize < pInfo2->dwFileSize) ? -1 : 1;
break;
}
// If the result is still fifty-fifty, continue comparing
if(nResult == 0)
nResult = stricmp(pInfo1->szPlainName, pInfo2->szPlainName);
if(nResult == 0 && szExt1 != NULL && szExt2 != NULL)
nResult = stricmp(szExt1, szExt2);
if(nResult == 0 && pInfo1->dwFileSize != pInfo2->dwFileSize)
nResult = (pInfo1->dwFileSize < pInfo2->dwFileSize) ? -1 : 1;
// If descending, reverse the result
if(m_bAscending == FALSE)
nResult = -nResult;
return nResult;
}
void TListView::LoadListView(HTREEITEM hItem)
{
SHFILEINFO sfi;
CPtrList * pFileList = NULL;
HTREEITEM hSubItem;
LVITEM lvitem;
LPARAM ClickPoint;
RECT RectHeader;
HWND hTreeView = m_pTreeView->GetHwnd();
UINT nIconIndex = (UINT)-1;
UINT nItemIndex = 0;
UINT nInsertedIndex = 0;
// Disable redrawing and removeall items
SendMessage(WM_SETREDRAW, FALSE, 0);
ListView_DeleteAllItems(m_hListView);
m_hCurrent = hItem;
// Fill the subdirectories
if(hItem != NULL)
{
char szText[MAX_PATH] = "";
SHGetFileInfo("A", FILE_ATTRIBUTE_DIRECTORY, &sfi, sizeof(SHFILEINFO), SHGFI_USEFILEATTRIBUTES | SHGFI_SYSICONINDEX | SHGFI_TYPENAME);
nIconIndex = sfi.iIcon;
pFileList = m_pTreeView->GetItemData(hItem);
// Walk through all subitems and add them as directories
hSubItem = TreeView_GetNextItem(hTreeView, hItem, TVGN_CHILD);
while(hSubItem != NULL)
{
// Retrieve the data of the tree view item
m_pTreeView->GetItemData(hSubItem, szText, sizeof(szText));
ZeroMemory(&lvitem, sizeof(LV_ITEM));
lvitem.mask = LVIF_IMAGE | LVIF_TEXT | LVIF_PARAM;
lvitem.iItem = nItemIndex++;
lvitem.pszText = szText;
lvitem.iImage = nIconIndex;
lvitem.lParam = (LPARAM)hSubItem;
nInsertedIndex = ListView_InsertItem(m_hListView, &lvitem);
ListView_SetItemText(m_hListView, nInsertedIndex, 1, sfi.szTypeName);
ListView_SetItemText(m_hListView, nInsertedIndex, 3, "<DIR>");
ListView_SetItemText(m_hListView, nInsertedIndex, 4, "--");
hSubItem = TreeView_GetNextItem(hTreeView, hSubItem, TVGN_NEXT);
}
}
// Now fill the files
if(pFileList != NULL)
{
POSITION pos = pFileList->GetHeadPosition();
while(pos != NULL)
{
TFileInfo * pInfo = (TFileInfo *)pFileList->GetNext(pos);
char szItemText[128] = "";
// If the file was deleted, don't show it
if(pInfo->bDeleted)
continue;
// Retrieve file type
SHGetFileInfo(pInfo->szPlainName, FILE_ATTRIBUTE_ARCHIVE, &sfi, sizeof(SHFILEINFO), SHGFI_USEFILEATTRIBUTES | SHGFI_SYSICONINDEX | SHGFI_TYPENAME);
GetBlizzardFileTypeName(pInfo->szPlainName, sfi);
nIconIndex = sfi.iIcon;
// File name
ZeroMemory(&lvitem, sizeof(LV_ITEM));
lvitem.mask = LVIF_IMAGE | LVIF_TEXT | LVIF_PARAM;
lvitem.iItem = nItemIndex++;
lvitem.pszText = pInfo->szPlainName;
lvitem.iImage = nIconIndex;
lvitem.lParam = (LPARAM)pInfo | 0x80000000;
nInsertedIndex = ListView_InsertItem(m_hListView, &lvitem);
// File type
ListView_SetItemText(m_hListView, nInsertedIndex, 1, sfi.szTypeName);
// File locale
if(pInfo->lcLocale != LANG_NEUTRAL)
GetLocaleInfo(pInfo->lcLocale, LOCALE_SLANGUAGE, szItemText, sizeof(szItemText)-1);
else
LoadString(AfxGetResourceHandle(), IDS_NEUTRAL, szItemText, sizeof(szItemText)-1);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -