⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 linklistview.cpp

📁 一个快捷面板,可以将自己常用的程序放在其中!
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// 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 + -