📄 tlistview.cpp
字号:
ListView_SetItemText(m_hListView, nInsertedIndex, 2, szItemText);
// File size
sprintf(szItemText, "%u", pInfo->dwFileSize);
ListView_SetItemText(m_hListView, nInsertedIndex, 3, szItemText);
// File attributes
szItemText[0] = szItemText[1] = '-';
szItemText[2] = 0;
if(pInfo->dwAttributes & MPQ_FILE_COMPRESSED)
szItemText[0] = 'C';
if(pInfo->dwAttributes & MPQ_FILE_ENCRYPTED)
szItemText[1] = 'E';
ListView_SetItemText(m_hListView, nInsertedIndex, 4, szItemText);
}
}
// Enable the redraw and repaint
ListView_SortItems(m_hListView, CompareFunc, this);
SendMessage(WM_SETREDRAW, TRUE, 0);
::InvalidateRect(m_hListView, NULL, TRUE);
// Select the first item
if(::GetFocus() == m_hWnd)
{
::GetWindowRect(ListView_GetHeader(m_hListView), &RectHeader);
ClickPoint = MAKELPARAM(2, RectHeader.bottom - RectHeader.top + 2);
::PostMessage(m_hListView, WM_LBUTTONDOWN, MK_LBUTTON, ClickPoint);
::PostMessage(m_hListView, WM_LBUTTONUP, MK_LBUTTON, ClickPoint);
}
}
TFileInfo * TListView::GetItemData(UINT nItem, HTREEITEM * phItem, char * szText, int nMaxChars)
{
TFileInfo * pInfo = NULL;
HTREEITEM hItem = NULL;
LVITEM lvitem;
// Prepare the list view item
ZeroMemory(&lvitem, sizeof(LVITEM));
lvitem.mask = LVIF_PARAM;
lvitem.iItem = nItem;
if(szText != NULL)
{
lvitem.mask |= LVIF_TEXT;
lvitem.pszText = szText;
lvitem.cchTextMax = nMaxChars - 1;
}
// Retrieve the item and return the item data
ListView_GetItem(m_hListView, &lvitem);
// If masked with the upper bit, it is a file info, otherwise
// it it a tree view handle
if(lvitem.lParam & 0x80000000)
pInfo = (TFileInfo *)(lvitem.lParam & 0x7FFFFFFF);
else
hItem = (HTREEITEM)lvitem.lParam;
if(phItem != NULL)
*phItem = hItem;
return pInfo;
}
//-----------------------------------------------------------------------------
// TListView message handlers
BOOL TListView::PreCreateWindow(CREATESTRUCT& cs)
{
cs.style |= LVS_REPORT | LVS_EDITLABELS | LVS_SHAREIMAGELISTS;
return CListView::PreCreateWindow(cs);
}
#define COL_TYPE_WIDTH 150
#define COL_LOCALE_WIDTH 140
#define COL_SIZE_WIDTH 60
#define COL_ATTR_WIDTH 60
int TListView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
CListCtrl & ListCtrl = GetListCtrl();
DWORD dwWidth;
char szText[64];
__try
{
if (CListView::OnCreate(lpCreateStruct) == -1)
return -1;
// Remember the window handle
ListCtrl.SetExtendedStyle(LVS_EX_FULLROWSELECT);
m_hListView = ListCtrl.m_hWnd;
// Set the image list to the list view
ListCtrl.SetImageList(CImageList::FromHandle(m_hImlNormal), LVSIL_NORMAL);
ListCtrl.SetImageList(CImageList::FromHandle(m_hImlSmall), LVSIL_SMALL);
// Set the columns
dwWidth = GetSystemMetrics(SM_CXSCREEN) - GetSystemMetrics(SM_CXVSCROLL) - 270 - COL_TYPE_WIDTH - COL_LOCALE_WIDTH - COL_SIZE_WIDTH - COL_ATTR_WIDTH;
LoadString(AfxGetResourceHandle(), IDS_FILE_NAME, szText, sizeof(szText)-1);
ListCtrl.InsertColumn(0, szText, LVCFMT_LEFT, dwWidth, 0);
LoadString(AfxGetResourceHandle(), IDS_TYPE, szText, sizeof(szText)-1);
ListCtrl.InsertColumn(1, szText, LVCFMT_LEFT, COL_TYPE_WIDTH, 1);
LoadString(AfxGetResourceHandle(), IDS_LOCALE, szText, sizeof(szText)-1);
ListCtrl.InsertColumn(2, szText, LVCFMT_LEFT, COL_LOCALE_WIDTH, 1);
LoadString(AfxGetResourceHandle(), IDS_SIZE, szText, sizeof(szText)-1);
ListCtrl.InsertColumn(3, szText, LVCFMT_LEFT, COL_SIZE_WIDTH, 2);
LoadString(AfxGetResourceHandle(), IDS_ATTR, szText, sizeof(szText)-1);
ListCtrl.InsertColumn(4, szText, LVCFMT_LEFT, COL_ATTR_WIDTH, 3);
// Allow file dropping
ListCtrl.DragAcceptFiles(TRUE);
// Allow file dragging
m_DropTarget.Register(this);
}
__except(EXCEPTION_EXECUTE_HANDLER)
{}
return 0;
}
void TListView::OnDblClick(NMHDR *, LRESULT * pResult)
{
// Send the event to the parent
GetParent()->SendMessage(WM_COMMAND, ID_OPS_OPEN, (LPARAM)m_hListView);
*pResult = 0;
}
void TListView::OnContextMenu(CWnd *, CPoint point)
{
HMENU hMenu = LoadMenu(AfxGetResourceHandle(), MAKEINTRESOURCE(IDR_CTXMPQLISTVIEW));
HMENU hSubMenu = NULL;
HWND hWnd = ::GetParent(m_hListView);
hSubMenu = GetSubMenu(hMenu, 0);
m_pMainFrame->SendMessage(WM_INITMENUPOPUP, (WPARAM)hSubMenu, 0);
// If valid context menu
if(hSubMenu != NULL)
{
SetMenuDefaultItem(hSubMenu, ID_OPS_OPEN, FALSE);
TrackPopupMenu(hSubMenu, (TPM_LEFTBUTTON | TPM_RIGHTBUTTON), point.x, point.y, 0, hWnd, NULL);
}
}
void TListView::OnBeginLabelEdit(NMHDR* pNMHDR, LRESULT* pResult)
{
LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;
*pResult = TRUE;
// If working, do nothing
if(!m_pMainFrame->IsIdle())
return;
// If directory, show error and do nothing
if((pDispInfo->item.lParam & 0x80000000) == 0)
AfxMessageBox(IDS_CANTDOWITHDIRS, MB_OK | MB_ICONERROR);
else
*pResult = FALSE;
}
void TListView::OnEndLabelEdit(NMHDR* pNMHDR, LRESULT* pResult)
{
LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;
TFileInfo * pInfo = GetItemData(pDispInfo->item.iItem, NULL);
// If the user canceled editing, do nothing
if(pInfo != NULL && pDispInfo->item.pszText != NULL)
{
m_pMainFrame->RenameFile(pInfo, pDispInfo->item.pszText);
*pResult = TRUE;
}
else
*pResult = FALSE;
}
void TListView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// Open a file/folder
if(nChar == 13)
GetParent()->SendMessage(WM_COMMAND, ID_OPS_OPEN, (LPARAM)m_hListView);
// Move up
if(nChar == 8)
{
HTREEITEM hParent = NULL;
HWND hTreeView = m_pTreeView->GetHwnd();
hParent = TreeView_GetNextItem(hTreeView, m_hCurrent, TVGN_PARENT);
if(hParent != NULL)
TreeView_SelectItem(hTreeView, hParent);
}
CListView::OnChar(nChar, nRepCnt, nFlags);
}
void TListView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// Send the delete to the parent
if(nChar == VK_DELETE)
GetParent()->SendMessage(WM_COMMAND, ID_OPS_REMOVE, (LPARAM)m_hListView);
CListView::OnKeyDown(nChar, nRepCnt, nFlags);
}
void TListView::OnColumnClick(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
if(pNMListView->iSubItem != m_uSortColumn)
{
m_uSortColumn = pNMListView->iSubItem;
m_bAscending = TRUE;
}
else
m_bAscending = !m_bAscending;
ListView_SortItems(m_hListView, CompareFunc, this);
*pResult = 0;
}
// Implements Drag to Windows Explorer
void TListView::OnBeginDrag(NMHDR * /* pNMHDR */, LRESULT * pResult)
{
m_pMainFrame->DragFiles();
*pResult = 0;
}
// Implements drop from Windows Explorer
void TListView::OnDropFiles(HDROP hDropInfo)
{
m_pMainFrame->AddFiles(hDropInfo);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -