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

📄 fileopendlg.cpp

📁 wince 文件打开对话框自定义 文件对话框
💻 CPP
📖 第 1 页 / 共 2 页
字号:

//---------------------------------------------------------------------------
//
//	CFileOpenDlg message handlers
//
//---------------------------------------------------------------------------




// CFileOpenDlg::OnInitDialog
//
//		Initialize the dialog
//
BOOL CFileOpenDlg::OnInitDialog() 
{
	CWinApp*		pApp = AfxGetApp();
	HTREEITEM		hItemRoot;
	HIMAGELIST		hImlSys;
	SHFILEINFO		ssfi;
	CWaitCursor		wait;
	TCHAR			szRoot[]	= _T("\\");

	CExDialog::OnInitDialog();

	//
	// Create the toolbar
	//
#ifdef WIN32_PLATFORM_PSPC
	if(!m_wndCommandBar.Create(this) ||
		!m_wndCommandBar.InsertMenuBar(IDR_MAINFRAME) ||
		!m_wndCommandBar.AddAdornments() ||
		!m_wndCommandBar.LoadToolBar(IDR_FILEOPEN))
	{
		TRACE0("Failed to create CommandBar\n");
		return -1; // fail to create
	}
#endif
	#ifdef WIN32_PLATFORM_WFSP
	if (!m_wndCommandBar.Create(this) ||
	    !m_wndCommandBar.InsertMenuBar(IDR_MAINFRAME) ||
	    !m_wndCommandBar.AddAdornments())
	{
		TRACE0("Failed to create CommandBar\n");
		return -1;      // fail to create
	}
	CWnd* pWnd = CWnd::FromHandlePermanent(m_wndCommandBar.m_hWnd);

	RECT rect, rectDesktop;
	pWnd->GetWindowRect(&rect);
	pWnd->GetDesktopWindow()->GetWindowRect(&rectDesktop);

	int cx = rectDesktop.right - rectDesktop.left;
	int cy = (rectDesktop.bottom - rectDesktop.top) - (rect.bottom - rect.top);
	this->SetWindowPos(NULL, 0, 0, cx, cy, SWP_NOMOVE | SWP_NOZORDER);
	#endif


	//
	// Position the tree.
	//
	GetClientRect(&m_rcTree);
	m_rcTree.top	= GetHeaderHeight() + 1;
	m_rcTree.bottom	= m_ySplit;
	m_treeFolder.MoveWindow(&m_rcTree);

	//
	// Position the list
	//
	GetClientRect(&m_rcList);
	m_rcList.top	= m_ySplit + nTrackHeight + 1;
	m_listFile.MoveWindow(&m_rcList);

	//
	// Hide the OK button
	//
	ModifyStyle(0, WS_NONAVDONEBUTTON, SWP_NOSIZE); 
	::SHDoneButton(m_hWnd, SHDB_HIDE);

	//
	// Retrieve the small system image list
	//
	hImlSys = (HIMAGELIST)SHGetFileInfo(_T("dummy.txt"), 0, &ssfi,
				sizeof(SHFILEINFO), 
				SHGFI_USEFILEATTRIBUTES | SHGFI_SYSICONINDEX | SHGFI_SMALLICON);
	
	m_imlSystem.Attach(hImlSys);
	m_listFile.SetImageList(&m_imlSystem, LVSIL_SMALL);
	m_treeFolder.SetImageList(&m_imlSystem, TVSIL_NORMAL);
	m_imlSystem.Detach();

	//
	// Initialize the tree
	//
	hItemRoot = TVI_ROOT;//m_treeFolder.InsertItem(GetSystemName(), 0, 1);
	if(hItemRoot)
	{
		TVINSERTSTRUCT	tvi;
		int				iIcon		= GetIconIndex(szRoot);

		tvi.hParent				= TVI_ROOT;
		tvi.hInsertAfter		= TVI_LAST;
		tvi.item.mask			= TVIF_CHILDREN | TVIF_IMAGE | TVIF_SELECTEDIMAGE |
								  TVIF_TEXT | TVIF_PARAM;
		tvi.item.pszText		= szRoot;
		tvi.item.iImage			= iIcon;
		tvi.item.iSelectedImage	= iIcon;
		tvi.item.cChildren		= I_CHILDRENCALLBACK;
		tvi.item.lParam			= -1;

		m_treeFolder.InsertItem(&tvi);

		//m_treeFolder.SetItemData(hItemRoot, 0);

		//EnumDirs(_T("\\"), _T("*"), hItemRoot);
		//m_treeFolder.Expand(hItemRoot, TVE_EXPAND);
	}

	//
	// Initialize the list
	//
	m_listFile.InsertColumn(0, _T("Name"), LVCFMT_LEFT,  80, -1);
	m_listFile.InsertColumn(1, _T("Size"), LVCFMT_RIGHT, 60,  1);
	m_listFile.InsertColumn(2, _T("Date"), LVCFMT_LEFT,  60,  2);
	EnumFiles(szRoot, m_strFilter);
	
	//
	// Initialize the header imagelist
	//
	if(m_imlHeader.Create(IDB_SORT_ARROWS, 16, 8, RGB(255,0,255)))
	{
		CHeaderCtrl*	pHeader = m_listFile.GetHeaderCtrl();

		if(pHeader)
			pHeader->SetImageList(&m_imlHeader);
	}

	SetColumnIcons();

	//
	// Update toolbar buttons
	//
	UpdateControls();

	OnViewTree();
	
	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}



void CFileOpenDlg::OnOK( )
{

}

// CFileOpenDlg::OnSelchangedFolderTree
//
//		The tree has changed its selection
//
void CFileOpenDlg::OnSelchangedFolderTree(NMHDR* pNMHDR, LRESULT* pResult) 
{
	NM_TREEVIEW*	pNMTreeView = (NM_TREEVIEW*)pNMHDR;
	HTREEITEM		hItem;
	
	hItem = pNMTreeView->itemNew.hItem;
	if(hItem)
	{
		m_strPath = GetFullPath(hItem);

		//
		// If displaying only the tree, do not enumerate files
		//
		if(m_nState != vsTreeOnly)
			EnumFiles(m_strPath, m_strFilter);
	}

	*pResult = 0;
}


// CFileOpenDlg::OnClickFileList
//
//		The user clicked the file list
//
void CFileOpenDlg::OnClickFileList(NMHDR* pNMHDR, LRESULT* pResult) 
{
	int iItem;

	iItem = m_listFile.GetNextItem(-1, LVNI_SELECTED);
	if(iItem != -1)
	{
		m_strFile = m_listFile.GetItemText(iItem, 0);
	}

	//
	// Enable or disable the OK button
	//
	m_bOk = iItem != -1;
	UpdateControls();
	
	*pResult = 0;
}


// CFileOpenDlg::OnLButtonDown
//
//		Processes the button down message.

void CFileOpenDlg::OnLButtonDown(UINT nFlags, CPoint point) 
{
	if(m_nState == vsStandard)
	{
		SetCapture();

		m_bTracking = TRUE;
		m_yTrackDel = point.y - m_ySplit;
		m_yTrack	= m_ySplit;
	}

	Default();
}


// CFileOpenDlg::OnLButtonUp
//
//		The user stopped dragging
//
void CFileOpenDlg::OnLButtonUp(UINT nFlags, CPoint point) 
{
	if(m_nState == vsStandard)
	{
		ReleaseCapture();

		m_bTracking = FALSE;

		InvalidateRect(NULL);
		UpdateWindow();
	}

	CExDialog::OnLButtonUp(nFlags, point);
}


// CFileOpenDlg::OnMouseMove
//
//		The user is dragging the stylus.
//
void CFileOpenDlg::OnMouseMove(UINT nFlags, CPoint point) 
{
	if(m_nState == vsStandard && m_bTracking)
	{
		m_yTrack = point.y - m_yTrack;
		m_ySplit = point.y - m_yTrackDel;

		//
		// Position the controls
		//
		m_rcTree.bottom = m_ySplit;
		m_treeFolder.MoveWindow(&m_rcTree);

		m_rcList.top	= m_ySplit + nTrackHeight + 1;
		m_listFile.MoveWindow(&m_rcList);

		InvalidateRect(NULL);
		UpdateWindow();
	}

	CExDialog::OnMouseMove(nFlags, point);
}


// CFileOpenDlg::OnHeaderClickFileList
//
//		The header was clicked: sort the file list
//
void CFileOpenDlg::OnHeaderClickFileList(NMHDR* pNMHDR, LRESULT* pResult) 
{
	HD_NOTIFY*	phdn = (HD_NOTIFY *) pNMHDR;
	int			iItem;

	iItem = phdn->iItem + 1;

	if(m_nSort == iItem)
		m_nSort = -iItem;
	else
		m_nSort = iItem;

	SetColumnIcons();
	DoSortList();
	
	*pResult = 0;
}


// CFileOpenDlg::OnCustomDrawList
//
//		Draws the list with stripes
//
void CFileOpenDlg::OnCustomDrawList(NMHDR* pNMHDR, LRESULT* pResult)
{
	NMLVCUSTOMDRAW*	pLVCD = (NMLVCUSTOMDRAW*) pNMHDR;
	DWORD			dwDrawStage;

	*pResult = CDRF_DODEFAULT;

	dwDrawStage = pLVCD->nmcd.dwDrawStage;

	if(dwDrawStage == CDDS_PREPAINT)
	{
		*pResult = CDRF_NOTIFYITEMDRAW;
	}
	else if(dwDrawStage == CDDS_ITEMPREPAINT)
	{
		*pResult = CDRF_NOTIFYSUBITEMDRAW;
	}
	else if(dwDrawStage == (CDDS_ITEMPREPAINT | CDDS_SUBITEM))
	{
		COLORREF	colBack;
		int			/*iItem,*/
					iSubItem;
		
		//
		// Get the list column pointer
		//
//		iItem		= pLVCD->nmcd.dwItemSpec;
		iSubItem	= pLVCD->iSubItem;

		if(iSubItem + 1 == abs(m_nSort))
			colBack = RGB(224, 224, 255);	// Light blue?
		else
			colBack = RGB(255, 255, 255);	// White

			pLVCD->clrTextBk = colBack;

		*pResult = CDRF_DODEFAULT;
	}
}


// CFileOpenDlg::OnItemExpandingFolderTree
//
//		The user is expanding a tree node
//
void CFileOpenDlg::OnItemExpandingFolderTree(NMHDR* pNMHDR, LRESULT* pResult) 
{
	NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;

	if(pNMTreeView->action & TVE_EXPAND)
	{
		TVITEM	item;

		item.mask	= TVIF_HANDLE | TVIF_PARAM;
		item.hItem	= pNMTreeView->itemNew.hItem;

		if(pNMTreeView->itemNew.lParam == -1)
		{
			CString	strFullPath = GetFullPath(item.hItem);
			RECT	rc;

//			if(strFullPath != _T("\\"))
//				strFullPath += _T("\\");

			if(EnumDirs(strFullPath, _T("*"), item.hItem))
				item.lParam	   = 1;
			else
				item.lParam	   = 0;
			m_treeFolder.SetItem(&item);

			m_treeFolder.GetItemRect(item.hItem, &rc, FALSE);
			m_treeFolder.InvalidateRect(&rc);
			m_treeFolder.UpdateWindow();
		}
	}

	*pResult = 0;
}


// CFileOpenDlg::OnGetDispInfoFolderTree
//
//		
void CFileOpenDlg::OnGetDispInfoFolderTree(NMHDR* pNMHDR, LRESULT* pResult) 
{
	TV_DISPINFO* pTVDispInfo = (TV_DISPINFO*)pNMHDR;

	if(pTVDispInfo->item.mask & TVIF_CHILDREN)
	{
		if(pTVDispInfo->item.lParam)
			pTVDispInfo->item.cChildren	= 1;
		else
			pTVDispInfo->item.cChildren	= 0;
	}
	*pResult = 0;
}


//---------------------------------------------------------------------------
//
//	CFileOpenDlg command handlers
//
//---------------------------------------------------------------------------


// CFileOpenDlg::OnViewStandard
//
//		Enables the standard view
//
void CFileOpenDlg::OnViewStandard() 
{
	m_treeFolder.ShowWindow(SW_SHOW);
	m_treeFolder.MoveWindow(&m_rcTree);

	m_listFile.ShowWindow(SW_SHOW);
	m_listFile.MoveWindow(&m_rcList);

	if(m_nState == vsTreeOnly)
		EnumFiles(m_strPath, m_strFilter);
	m_nState = vsStandard;

	UpdateControls();
}


// CFileOpenDlg::OnViewTree
//
//		Enables the tree view only
//
void CFileOpenDlg::OnViewTree() 
{
	m_treeFolder.ShowWindow(SW_SHOW);
	m_treeFolder.MoveWindow(m_rcTree.left,
							m_rcTree.top,
							m_rcList.right - m_rcList.left,
							m_rcList.bottom - m_rcTree.top);

	m_listFile.ShowWindow(SW_HIDE);

	m_nState = vsTreeOnly;

	UpdateControls();
}


// CFileOpenDlg::OnViewList
//
//		Enables the list view only
//
void CFileOpenDlg::OnViewList() 
{
	m_treeFolder.ShowWindow(SW_HIDE);

	m_listFile.ShowWindow(SW_SHOW);
	m_listFile.MoveWindow(m_rcTree.left,
							m_rcTree.top,
							m_rcList.right - m_rcList.left,
							m_rcList.bottom - m_rcTree.top);

	if(m_nState == vsTreeOnly)
		EnumFiles(m_strPath, m_strFilter);
	m_nState = vsListOnly;

	UpdateControls();
}


// CFileOpenDlg::OnBarOk
//
//		Confirms the selection
//
void CFileOpenDlg::OnBarOk() 
{
	EndDialog(IDOK);
}


// CFileOpenDlg::OnBarCancel
//
//		Cancels the operation
//
void CFileOpenDlg::OnBarCancel() 
{
	EndDialog(IDCANCEL);
}


//---------------------------------------------------------------------------
//
//	Sorting functions
//
//---------------------------------------------------------------------------


static int SortNameAsc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
	CFileInfoCont*	pCont = (CFileInfoCont*)lParamSort;

	return _wcsicmp((*pCont)[lParam1].cFileName, (*pCont)[lParam2].cFileName);
}


static int SortNameDes(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
	CFileInfoCont*	pCont = (CFileInfoCont*)lParamSort;

	return _wcsicmp((*pCont)[lParam2].cFileName, (*pCont)[lParam1].cFileName);
}


static int SortSizeAsc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
	CFileInfoCont*	pCont = (CFileInfoCont*)lParamSort;

	return (int)(*pCont)[lParam1].nFileSizeLow - 
		   (int)(*pCont)[lParam2].nFileSizeLow;
}


static int SortSizeDes(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
	CFileInfoCont*	pCont = (CFileInfoCont*)lParamSort;

	return (int)(*pCont)[lParam2].nFileSizeLow - 
		   (int)(*pCont)[lParam1].nFileSizeLow;
}


static int SortDateAsc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
	CFileInfoCont*	pCont = (CFileInfoCont*)lParamSort;

	return CompareFileTime(&(*pCont)[lParam1].ftLastWriteTime,  
						   &(*pCont)[lParam2].ftLastWriteTime);
}


static int SortDateDes(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
	CFileInfoCont*	pCont = (CFileInfoCont*)lParamSort;

	return CompareFileTime(&(*pCont)[lParam2].ftLastWriteTime,  
						   &(*pCont)[lParam1].ftLastWriteTime);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -