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

📄 folderdialog.cpp

📁 eCos1.31版
💻 CPP
字号:
//####COPYRIGHTBEGIN####//                                                                          // ----------------------------------------------------------------------------// Copyright (C) 1998, 1999, 2000 Red Hat, Inc.//// This program is part of the eCos host tools.//// This program is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the Free // Software Foundation; either version 2 of the License, or (at your option) // any later version.// // This program is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for // more details.// // You should have received a copy of the GNU General Public License along with// this program; if not, write to the Free Software Foundation, Inc., // 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.//// ----------------------------------------------------------------------------//                                                                          //####COPYRIGHTEND####// FolderDialog.cpp : implementation file//////===========================================================================//#####DESCRIPTIONBEGIN####//// Author(s): 	sdf// Contact(s):	sdf// Date:		1998/08/11// Version:		0.01// Purpose:	// Description:	This is the implementation of the _T("browse for folder") dialog class// Requires:	// Provides:	// See also:    // Known bugs:	// Usage:	////####DESCRIPTIONEND####////===========================================================================#include "stdafx.h"#include "FolderDialog.h"#include "shlobj.h"#include "CTUtils.h"#include "NewFolderDialog.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif/////////////////////////////////////////////////////////////////////////////// CFolderDialog dialogCFolderDialog::CFolderDialog(BOOL bAllowCreation/*=TRUE*/,UINT id/*=0*/)    : CeCosDialog(id?id:IDD_FOLDER_DIALOG, NULL),	m_bAllowCreation(bAllowCreation),	m_pButton(NULL){	//{{AFX_DATA_INIT(CFolderDialog)	//}}AFX_DATA_INIT	m_strTitle=_T("Choose Folder");	GetCurrentDirectory(MAX_PATH,m_strFolder.GetBuffer(MAX_PATH));	m_strFolder.ReleaseBuffer();}void CFolderDialog::DoDataExchange(CDataExchange* pDX){	CeCosDialog::DoDataExchange(pDX);	//{{AFX_DATA_MAP(CFolderDialog)	//}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(CFolderDialog, CeCosDialog)	//{{AFX_MSG_MAP(CFolderDialog)	ON_BN_CLICKED(IDC_FOLDER_DIALOG_BROWSE, OnBrowse)	ON_EN_CHANGE(IDC_FOLDER, OnChangeFolder)	//}}AFX_MSG_MAPEND_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// CFolderDialog message handlersvoid CFolderDialog::OnBrowse() {    m_wndProc=NULL;	GetDlgItemText(IDC_FOLDER,m_strFolder);	BROWSEINFO bi;    bi.hwndOwner = GetSafeHwnd();     bi.pidlRoot = NULL;       bi.pszDisplayName = m_strFolder.GetBuffer(MAX_PATH);    bi.lpszTitle = _T("");    bi.ulFlags = BIF_RETURNONLYFSDIRS/*|0x0010 BIF_EDITBOX*/;                 bi.lpfn = (BFFCALLBACK)CBBrowseCallbackProc;    bi.lParam = (LPARAM)this;	static const UINT arids[]={IDOK,IDCANCEL,IDC_FOLDER_DIALOG_BROWSE,IDC_FOLDER};	BOOL arbEnabled[4];	ASSERT(sizeof arids/sizeof arids[0] == sizeof arbEnabled/sizeof arbEnabled[0]);		for(int i=0;i<sizeof arids/sizeof arids[0];i++){		UINT id=arids[i];		arbEnabled[i]=GetDlgItem(id)->IsWindowEnabled();		GetDlgItem(id)->EnableWindow(FALSE);	}    LPITEMIDLIST iil = SHBrowseForFolder(&bi);	m_strFolder.ReleaseBuffer();	if(iil)	{		SHGetPathFromIDList(iil,m_strFolder.GetBuffer(MAX_PATH));        m_strFolder.ReleaseBuffer();        SetDlgItemText(IDC_FOLDER,m_strFolder);	}	for(i=0;i<sizeof arids/sizeof arids[0];i++){		UINT id=arids[i];		GetDlgItem(id)->EnableWindow(arbEnabled[i]);	}	GetDlgItem(IDOK)->EnableWindow(!m_strFolder.IsEmpty());	if(m_bAllowCreation){		deleteZ(m_pButton);	}}// Use callback to expand folder in edit box at time of browseint CALLBACK CFolderDialog::CBBrowseCallbackProc( HWND hwnd, 	UINT uMsg, 	LPARAM lParam, 	LPARAM lpData 	){    CFolderDialog *pDlg=(CFolderDialog *)lpData;    switch(uMsg){        case BFFM_INITIALIZED:	        if(pDlg->m_bAllowCreation){		        CWnd *pWnd=CWnd::FromHandle(hwnd);		        pDlg->m_pButton=new CButton();		        // Get rect of IDOK button		        CRect rect1;		        pWnd->GetDlgItem(IDOK)->GetWindowRect(&rect1);		        pWnd->ScreenToClient(&rect1);		        // Get rect of IDCANCEL button to the right		        CRect rect2;		        pWnd->GetDlgItem(IDCANCEL)->GetWindowRect(&rect2);		        pWnd->ScreenToClient(&rect2);		        int nXDiff=rect2.left-rect1.left;		        CRect rect(rect1);		        rect.left-=nXDiff;		        rect.right-=nXDiff;		        pDlg->m_pButton->Create(_T("&New..."), WS_VISIBLE|WS_CHILD|BS_DEFPUSHBUTTON, rect, pWnd, ID_NEW_FOLDER);		        pDlg->m_pButton->SendMessage(WM_SETFONT, (WPARAM)GetStockObject(DEFAULT_GUI_FONT), 0);		        m_wndProc = (WNDPROC)SetWindowLong(hwnd, GWL_WNDPROC, (long)WindowProcNew);	        }            ::SendMessage(hwnd,BFFM_SETSELECTION,TRUE,(LPARAM)(LPCTSTR)pDlg->m_strFolder);        case BFFM_SELCHANGED:            {                // Change the cwd such that if the New button is used, we know where we are to start from                ITEMIDLIST *iil=(ITEMIDLIST *)lParam;                CString strFolder;		        SHGetPathFromIDList(iil,strFolder.GetBuffer(MAX_PATH));                strFolder.ReleaseBuffer();                SetCurrentDirectory(strFolder);            }            break;        default:            ;    }	return 0;}WNDPROC CFolderDialog::m_wndProc=NULL;LRESULT CALLBACK CFolderDialog::WindowProcNew(HWND hwnd,UINT message, WPARAM wParam, LPARAM lParam){	if (message ==  WM_COMMAND && wParam==MAKEWPARAM(ID_NEW_FOLDER,BN_CLICKED)){		CNewFolderDialog dlg;        // Start from the cwd (maintained by BFFM_SELCHANGED above)		GetCurrentDirectory(MAX_PATH,dlg.m_strFolder.GetBuffer(MAX_PATH));		dlg.m_strFolder.ReleaseBuffer();		if(IDOK==dlg.DoModal()){            // Feed the new directory back as the current selection in the browse dialog			::SendMessage (hwnd, BFFM_SETSELECTION, TRUE, (LPARAM)(LPCTSTR )dlg.m_strFolder);		}		return 0;	} else {		return CallWindowProc(m_wndProc, hwnd, message, wParam, lParam);	}} void CFolderDialog::OnOK() {	GetDlgItemText(IDC_FOLDER,m_strFolder);	if(!m_strFolder.IsDir()){		if(m_bAllowCreation){			if(!m_strFolder.CreateDirectory()){				CUtils::MessageBoxF(_T("Could not create folder %s"),m_strFolder);				return;			}		} else {			CUtils::MessageBoxF(_T("Folder %s does not exist"),m_strFolder);			return;		}	} else if (m_bAllowCreation && IDNO==CUtils::MessageBoxFT(MB_YESNO|MB_DEFBUTTON2, _T("Folder %s already exists - overwrite?"),m_strFolder)){		return;	}	CeCosDialog::OnOK();}BOOL CFolderDialog::OnInitDialog() {	CeCosDialog::OnInitDialog();	if(m_bAllowCreation&&m_strDesc.IsEmpty()){		m_strDesc.LoadString(IDS_DEFAULT_FOLDER_DIALOG_DESC);	}	SetDlgItemText(IDC_STATIC_DESC,m_strDesc);	SetDlgItemText(IDC_FOLDER,m_strFolder);	SetWindowText(m_strTitle);	SetCurrentDirectory(m_strFolder);	SetDlgItemText(IDC_FOLDER,m_strFolder);	GetDlgItem(IDC_FOLDER)->SetFocus();	GetDlgItem(IDC_FOLDER)->SendMessage(EM_SETSEL,0,-1);	GetDlgItem(IDOK)->EnableWindow(!m_strFolder.IsEmpty());	return FALSE;  // return TRUE unless you set the focus to a control	              // EXCEPTION: OCX Property Pages should return FALSE}void CFolderDialog::OnCancel() {	CeCosDialog::OnCancel();}void CFolderDialog::OnChangeFolder() {	CString str;	GetDlgItemText(IDC_FOLDER,str);	GetDlgItem(IDOK)->EnableWindow(!str.IsEmpty());}

⌨️ 快捷键说明

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