📄 linklistview.cpp
字号:
// LinkListView.cpp : 实现文件
//
#include "stdafx.h"
#include "LinkPanel.h"
#include "LinkListView.h"
#include ".\linklistview.h"
#include "MainFrm.h"
#include "OptionDlg.h"
#include "Registry.h"
//#define SYSDRAGFORMAT 49158
#define DELETEMARK -1L
// CLinkListView
IMPLEMENT_DYNCREATE(CLinkListView, CListView)
CLinkListView::CLinkListView()
{
m_bClick = FALSE;
m_bShowExt = TRUE;
m_nHotItem = -1;
m_nCurType = 0;
m_sPath = _T("");
m_sSavePath = _T("");
m_dwViewStyle = LVS_ICON;
m_arItemInfo.RemoveAll();
}
CLinkListView::~CLinkListView()
{
m_arItemInfo.RemoveAll();
m_Menu.DestroyMenu();
}
BEGIN_MESSAGE_MAP(CLinkListView, CListView)
ON_WM_SIZE()
ON_WM_CREATE()
ON_WM_DESTROY()
ON_WM_DROPFILES()
ON_WM_CONTEXTMENU()
ON_NOTIFY_REFLECT(NM_HOVER, OnNMHover)
ON_NOTIFY_REFLECT(LVN_ITEMACTIVATE, OnLvnItemActivate)
ON_NOTIFY_REFLECT(NM_RCLICK, OnNMRclick)
//ON_NOTIFY_REFLECT(NM_CLICK, OnNMClick)
ON_COMMAND(ID_SYS_CONTROL, OnSysControl)
ON_COMMAND(ID_CLICK, OnClick)
ON_COMMAND(32775, OnOpenFolder)
ON_COMMAND(ID_ADD_LINK, OnAddLink)
ON_COMMAND(ID_DELETE_ITEM, OnDeleteItem)
ON_COMMAND(ID_FILE_UPDATE, OnFileUpdate)
ON_WM_INITMENUPOPUP()
ON_COMMAND_RANGE(ID_LARGE_ICON, ID_REPORT, OnViewStyle)
ON_UPDATE_COMMAND_UI_RANGE(ID_LARGE_ICON, ID_REPORT, OnViewStyleUI)
ON_COMMAND(ID_APP_EXIT, OnAppExit)
ON_COMMAND(ID_APP_ABOUT, OnAbout)
END_MESSAGE_MAP()
// CLinkListView 诊断
#ifdef _DEBUG
void CLinkListView::AssertValid() const
{
CListView::AssertValid();
}
void CLinkListView::Dump(CDumpContext& dc) const
{
CListView::Dump(dc);
}
#endif //_DEBUG
// CLinkListView 消息处理程序
void CLinkListView::OnInitialUpdate()
{
CListView::OnInitialUpdate();
CString sHead = _T(""), sTemp = _T("");
sHead.LoadString(IDS_HEAD);
int i = 0;
while(AfxExtractSubString(sTemp, sHead, i++, '\t'))
GetListCtrl().InsertColumn(i, sTemp);
LoadExistFile();
for (long n = 0; n < m_arItemInfo.GetCount(); n++)
AddItem(m_arItemInfo.GetAt(n));
//WINDOWPLACEMENT WinPlace;
//WinPlace.flags = 0;
//WinPlace.length = 0x2c;
//WinPlace.ptMaxPosition.x = 80;
//WinPlace.ptMaxPosition.y = 80;
//WinPlace.ptMinPosition.x = 20;
//WinPlace.ptMinPosition.y = 20;
//WinPlace.rcNormalPosition.left = 20;
//WinPlace.rcNormalPosition.top = 20;
//WinPlace.rcNormalPosition.right = 80;
//WinPlace.rcNormalPosition.bottom = 80;
////ReadKeySetting(WinPlace);
//SetWindowPlacement(&WinPlace);
CMainFrame *pFrame = (CMainFrame*)AfxGetApp()->m_pMainWnd;
if(pFrame) EnableBkImage(pFrame->m_bShowBmp);
}
void CLinkListView::OnClick()
{
DWORD dwStyle = ListView_GetExtendedListViewStyle(GetSafeHwnd());
if(!m_bClick)
{
// 设置 HotCursor 的标志位
GetListCtrl().SetExtendedStyle(LVS_EX_ONECLICKACTIVATE | LVS_EX_TRACKSELECT);;
ListView_SetExtendedListViewStyleEx(GetSafeHwnd(), LVS_EX_TRACKSELECT, LVS_EX_TRACKSELECT);
}
m_bClick = !m_bClick;
}
int CLinkListView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CListView::OnCreate(lpCreateStruct) == -1)
return -1;
DragAcceptFiles();
m_ilSmallImage.Create(16, 16, ILC_COLORDDB, 0, 1);
m_ilLargeImage.Create(32, 32, ILC_COLORDDB, 0, 1);
m_ilLargeImage.Add(AfxGetApp()->LoadIcon(IDR_TRACK_MENU));
m_ilSmallImage.Add(AfxGetApp()->LoadIcon(IDR_TRACK_MENU));
GetListCtrl().SetImageList(&m_ilSmallImage, LVSIL_SMALL);
GetListCtrl().SetImageList(&m_ilLargeImage, LVSIL_NORMAL);
ListView_SetHotCursor(GetSafeHwnd(), AfxGetApp()->LoadCursor(IDC_HAND));
OnClick();
m_Menu.CreatePopupMenu();
m_Menu.SetImageLeft(IDB_BMP_LEFTMENU);
m_Menu.AppendMenu(0,ID_EDIT_UNDO,"撤消");
return 0;
}
void CLinkListView::OnNMHover(NMHDR *pNMHDR, LRESULT *pResult)
{
int nItem = GetListCtrl().GetHotItem();
if(nItem != m_nHotItem && nItem != -1)
{
m_nHotItem = nItem;
SetPanelText(0, m_arItemInfo.GetAt(m_nHotItem));
}
*pResult = 0;
}
BOOL CLinkListView::SetPanelText(int nPos, LPCTSTR lpszText)
{
CMainFrame *pMainFrame = (CMainFrame*)GetParentFrame();
if(pMainFrame)
return pMainFrame->m_wndStatusBar.SetPaneText(nPos, lpszText);
return FALSE;
}
void CLinkListView::OnLvnItemActivate(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMITEMACTIVATE pNMIA = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
if( pNMIA && pNMIA->iItem != -1 && m_bClick)
{
CLinkPanelApp *pApp = (CLinkPanelApp*)AfxGetApp();
if(pApp)
{
::ShowWindow(pApp->m_pMainWnd->GetSafeHwnd(), SW_HIDE);
pApp->m_bHide = TRUE;
}
ShellExecute(GetSafeHwnd(), "open", m_arItemInfo.GetAt(pNMIA->iItem), _T(""), _T(""), SW_SHOW );
}
*pResult = 0;
}
void CLinkListView::OnContextMenu(CWnd* pWnd, CPoint point)
{
CMenuEx MainMenu, *pMenu;
MainMenu.LoadMenu(IDR_TRACK_MENU);
if(MainMenu.GetSafeHmenu())
{
pMenu = (CMenuEx*)MainMenu.GetSubMenu(1);
{
//pMenu->SetImageLeft(IDB_BMP_LEFTMENU);
//pMenu->InitPopupMenu(&MainMenu, IDR_TRACK_MENU, NULL);
if(pMenu) pMenu->TrackPopupMenu(0, point.x, point.y, pWnd);
}
}
}
void CLinkListView::OnSysControl()
{
CMainFrame *pMainFrame = (CMainFrame*)GetParentFrame();
if(pMainFrame && pMainFrame->GetSafeHwnd())
{
COptionDlg dlg(this, pMainFrame->GetSafeHwnd(), pMainFrame->m_bStyle);
if(dlg.DoModal() == IDOK)
{
pMainFrame->SetSyle();
EnableBkImage(dlg.m_bShowBmp);
}
}
}
CString CLinkListView::ExpandShortcut(CString &sInFile)
{
CString sOutFile = _T("");
// Make sure we have a path
ASSERT(sInFile != _T(""));
IShellLink* psl = NULL;
HRESULT hres = 0;
LPTSTR lpsz = sInFile.GetBuffer(MAX_PATH);
// Create instance for shell link
hres = ::CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER,
IID_IShellLink, (LPVOID*) &psl);
if (SUCCEEDED(hres))
{
// Get a pointer to the persist file interface
IPersistFile* ppf = NULL;
hres = psl->QueryInterface(IID_IPersistFile, (LPVOID*) &ppf);
if (SUCCEEDED(hres))
{
// Make sure it's ANSI
WORD wsz[MAX_PATH];
::MultiByteToWideChar(CP_ACP, 0, lpsz, -1, (LPWSTR)&wsz, MAX_PATH);
// Load shortcut
hres = ppf->Load((LPCOLESTR)&wsz, STGM_READ);
if (SUCCEEDED(hres)) {
WIN32_FIND_DATA wfd;
// find the path from that
HRESULT hres = psl->GetPath(sOutFile.GetBuffer(MAX_PATH),
MAX_PATH,
&wfd,
SLGP_UNCPRIORITY);
sOutFile.ReleaseBuffer();
}
ppf->Release();
}
psl->Release();
}
sInFile.ReleaseBuffer();
// if this fails, sOutFile == ""
return sOutFile;
}
int CLinkListView::InsertItem(LPCTSTR lpszPath)
{
if(lpszPath == NULL)
return -1;
CString sPath = lpszPath, sFileName = sPath.Right(sPath.GetLength() - sPath.ReverseFind('\\') - 1);
CString sFileTitle = sFileName.Left(sFileName.GetLength() - 4), sTemp = _T("");
SHFILEINFO FileInfo;
SHFILEINFO FileInfo2;
m_arItemInfo.Add(sPath);
::ZeroMemory( &FileInfo, sizeof(FileInfo));
::ZeroMemory( &FileInfo2, sizeof(FileInfo2));
::SHGetFileInfo(lpszPath, NULL, &FileInfo, sizeof(FileInfo),
SHGFI_DISPLAYNAME | SHGFI_ICON);
::SHGetFileInfo(lpszPath, NULL, &FileInfo2, sizeof(FileInfo2),
SHGFI_DISPLAYNAME | SHGFI_LARGEICON | SHGFI_ICON);
int nImage = 0, nIndex = 0;
if(FileInfo.hIcon && FileInfo2.hIcon)
{
nImage = m_ilSmallImage.Add(FileInfo.hIcon);
nImage = m_ilLargeImage.Add(FileInfo2.hIcon);
}
if(m_bShowExt)
sTemp = sFileName;
else
sTemp = sFileTitle;
nIndex = GetListCtrl().InsertItem(GetListCtrl().GetItemCount(), sTemp, nImage);
if(nIndex != LB_ERR)
{
GetListCtrl().SetItemText(nIndex, 1, sPath);
GetListCtrl().SetItemText(nIndex, 2, sFileName.Right(3));
}
::DestroyIcon(FileInfo.hIcon);
::DestroyIcon(FileInfo2.hIcon);
return nIndex;
}
int CLinkListView::AddItem(LPCTSTR lpszPath)
{
if(lpszPath == NULL)
return -1;
CString sPath = lpszPath, sFileName = sPath.Right(sPath.GetLength() - sPath.ReverseFind('\\') - 1);
CString sFileTitle = sFileName.Left(sFileName.GetLength() - 4), sTemp = _T("");
int nImage = 0, nIndex = 0;
SHFILEINFO FileInfo;
SHFILEINFO FileInfo2;
::ZeroMemory( &FileInfo, sizeof(FileInfo));
::ZeroMemory( &FileInfo2, sizeof(FileInfo2));
::SHGetFileInfo(lpszPath, NULL, &FileInfo, sizeof(FileInfo),
SHGFI_DISPLAYNAME | SHGFI_ICON);
::SHGetFileInfo(lpszPath, NULL, &FileInfo2, sizeof(FileInfo2),
SHGFI_DISPLAYNAME | SHGFI_LARGEICON | SHGFI_ICON);
if(FileInfo.hIcon && FileInfo2.hIcon)
{
nImage = m_ilSmallImage.Add(FileInfo.hIcon);
nImage = m_ilLargeImage.Add(FileInfo2.hIcon);
}
if(m_bShowExt)
sTemp = sFileName;
else
sTemp = sFileTitle;
nIndex = GetListCtrl().InsertItem(GetListCtrl().GetItemCount(), sTemp, nImage);
if(nIndex != LB_ERR)
{
GetListCtrl().SetItemText(nIndex, 1, sPath);
GetListCtrl().SetItemText(nIndex, 2, sFileName.Right(3));
}
::DestroyIcon(FileInfo.hIcon);
::DestroyIcon(FileInfo2.hIcon);
return nIndex;
}
void CLinkListView::AutoSizeListCtrl()
{
GetListCtrl().SetRedraw(FALSE);
int nWidth = 0;
for(int n = 0; n < m_arItemInfo.GetCount(); n++)
{
if(m_arItemInfo.GetAt(n).GetLength() > nWidth)
nWidth = m_arItemInfo.GetAt(n).GetLength();
}
GetListCtrl().SetColumnWidth(0, 10 * 5);
GetListCtrl().SetColumnWidth(1, nWidth * 5);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -