📄 dialogs.cpp.svn-base
字号:
{
::GetCurrentDirectory(MAX_PATH, szTemp );
lpszPath = szTemp;
}
// WParam is TRUE since you are passing a path.
// It would be FALSE if you were passing a pidl.
::SendMessage(hwnd,BFFM_SETSELECTION,TRUE,
(LPARAM)lpszPath);
break;
}
case BFFM_SELCHANGED:
{
char szSelection[MAX_PATH];
if(!::SHGetPathFromIDList((LPITEMIDLIST)lParam, szSelection) ||
szSelection[1]!=':')
{
szSelection[0] = '\0';
::SendMessage(hwnd, BFFM_ENABLEOK, 0, FALSE);
}
else
{
::SendMessage(hwnd, BFFM_ENABLEOK, 0, TRUE);
}
::SendMessage(hwnd,BFFM_SETSTATUSTEXT,0,(LPARAM)szSelection);
::SetWindowText(::GetDlgItem(hwnd, PATHDLG_IDC_NEW_EDIT_PATH), szSelection);
break;
}
default:
break;
}
return 0;
}
int CPathDialog::DoModal()
{
/////////////////////////////////////////////////////////
TCHAR szPathTemp[MAX_PATH];
m_bi.lpfn = BrowseCallbackProc; // address of callback function
m_bi.lParam = (LPARAM)this; // pass address of object to callback function
m_bi.pszDisplayName = szPathTemp;
LPITEMIDLIST pidl;
LPMALLOC pMalloc;
int iResult=-1;
if(SUCCEEDED(SHGetMalloc(&pMalloc)))
{
// if((m_pParentWnd!=NULL) && m_pParentWnd->IsWindowEnabled())
// {
// m_pParentWnd->EnableWindow(FALSE);
// m_bParentDisabled = TRUE;
// }
m_bGetSuccess = FALSE;
pidl = SHBrowseForFolder(&m_bi);
if (pidl!=NULL)
{
//not need do this because OnOK function did
//bSucceeded = SHGetPathFromIDList(pidl, m_szPathName);
// In C++:
pMalloc->Free(pidl);
//In C:
//pMalloc->lpVtbl->Free(pMalloc,pidl);
//pMalloc->lpVtbl->Release(pMalloc);
}
if(m_bGetSuccess)
{
iResult = IDOK;
}
pMalloc->Release();
}
if(m_bParentDisabled && (m_pParentWnd!=NULL))
{
m_pParentWnd->EnableWindow(TRUE);
}
m_bParentDisabled=FALSE;
return iResult;
}
BOOL CPathDialog::IsFileNameValid(LPCTSTR lpFileName)
{
if(lpFileName==NULL)
{
return FALSE;
}
int nLen = _tcslen(lpFileName);
if(nLen<=0)
{
return FALSE;
}
//check first char
switch(lpFileName[0])
{
case _T('.'):
case _T(' '):
case _T('\t'):
return FALSE;
}
//check last char
switch(lpFileName[nLen-1])
{
case _T('.'):
case _T(' '):
case _T('\t'):
return FALSE;
}
//check all
int i=0;
while(lpFileName[i]!=0)
{
switch(lpFileName[i])
{
case _T('\\'):
case _T('/'):
case _T(':'):
case _T('*'):
case _T('?'):
case _T('\"'):
case _T('<'):
case _T('>'):
case _T('|'):
return FALSE;
}
i++;
}
return TRUE;
}
/*
const TCHAR c_FolderDoesNotExist[] = _T(
"The folder:\n\n"
"%s\n\n"
"does not exist. Do you want the folder to be created?");
const TCHAR c_szErrInvalidPath[] = _T(
"The folder:"
"\n\n"
"%s\n\n"
"is invalid. Please reenter.");
const TCHAR c_szErrCreatePath[] = _T(
"The folder:"
"\n\n"
"%s"
"\n\ncan not be created. Please double check.");
*/
//return -1: user break;
//return 0: no error
//return 1: lpPath is invalid
//return 2: can not create lpPath
int CPathDialog::MakeSurePathExists(LPCTSTR lpPath)
{
CString strPathLocal = "";
if( lpPath )
strPathLocal = lpPath;
int nLen = strPathLocal.GetLength();
if( nLen > 0 && (strPathLocal[nLen-1] == '\\' || strPathLocal[nLen-1] == '/') )
strPathLocal = strPathLocal.Left( nLen-1 );
CString strMsg, strMsgFmt;
int iRet;
try
{
//validate path
iRet=Touch(strPathLocal, TRUE);
if(iRet!=0)
{
throw iRet;
}
if(_taccess(strPathLocal, 0)==0)
{
return (int)0;
}
strMsgFmt = AfxModuleLoadString( IDS_XFPATHDLG_FOLDERNOTEXIST );
strMsg.Format(strMsgFmt, lpPath);
if(AfxMessageBox(strMsg, MB_YESNO|MB_ICONQUESTION) != IDYES)
{
return (int)-1;
}
//create path
iRet=Touch(strPathLocal, FALSE);
if(iRet!=0)
{
throw iRet;
}
return 0;
}
catch(int nErrCode)
{
switch(nErrCode)
{
case 1:
strMsgFmt = AfxModuleLoadString( IDS_XFPATHDLG_ERRINVALIDPATH );
break;
case 2:
default:
strMsgFmt = AfxModuleLoadString( IDS_XFPATHDLG_ERRCREATEPATH );
break;
}
strMsg.Format(strMsgFmt, lpPath);
AfxMessageBox(strMsg, MB_OK|MB_ICONEXCLAMATION);
}
return iRet;
}
//return 0: no error
//return 1: lpPath is invalid
//return 2: lpPath can not be created(bValidate==FALSE)
int CPathDialog::Touch(LPCTSTR lpPath, BOOL bValidate)
{
if(lpPath==NULL)
{
return 1;
}
TCHAR szPath[MAX_PATH];
_tcscpy(szPath, lpPath);
int nLen = _tcslen(szPath);
//path must be "x:\..."
if( ( nLen<3 ) ||
( ( szPath[0]<_T('A') || _T('Z')<szPath[0] ) &&
( szPath[0]<_T('a') || _T('z')<szPath[0] ) ||
( szPath[1]!=_T(':') )||
( szPath[2]!=_T('\\') )
)
)
{
return 1;
}
int i;
if(nLen==3)
{
if(!bValidate)
{
if(_access(szPath, 0)!=0)
{
return 2;
}
}
return 0;
}
i = 3;
BOOL bLastOne=TRUE;
LPTSTR lpCurrentName;
while(szPath[i]!=0)
{
lpCurrentName = &szPath[i];
while( (szPath[i]!=0) && (szPath[i]!=_T('\\')) )
{
i++;
}
bLastOne =(szPath[i]==0);
szPath[i] = 0;
if( !IsFileNameValid(lpCurrentName) )
{
return 1;
}
if(!bValidate)
{
CreateDirectory(szPath, NULL);
if(_taccess(szPath, 0)!=0)
{
return 2;
}
}
if(bLastOne)
{
break; //it's done
}
else
{
szPath[i] = _T('\\');
}
i++;
}
return (bLastOne?0:1);
}
//return 0: ok
//return 1: error
int CPathDialog::ConcatPath(LPTSTR lpRoot, LPCTSTR lpMorePath)
{
if(lpRoot==NULL)
{
return 1;
}
int nLen = _tcslen(lpRoot);
if(nLen<3)
{
return 1;
}
if(lpMorePath==NULL)
{
return 0;
}
if(nLen==3)
{
_tcscat(lpRoot, lpMorePath);
return 0;
}
_tcscat(lpRoot, _T("\\"));
_tcscat(lpRoot, lpMorePath);
return 0;
}
/////////////////////////////////////////////////////////////////////////////
// CStringDialog dialog
CStringDialog::CStringDialog(CWnd* pParent /*=NULL*/, UINT nIDTitle, UINT nIDDescript,
LPCTSTR lpszInitValue )
: CXFResDialog(CStringDialog::IDD, pParent)
{
//{{AFX_DATA_INIT(CStringDialog)
m_strWant = _T("");
m_strDescript = _T("");
//}}AFX_DATA_INIT
m_nIDTitle = nIDTitle;
m_nIDDescript = nIDDescript;
if( lpszInitValue )
m_strWant = lpszInitValue;
}
CString CStringDialog::GetStringWant( )
{
return m_strWant;
}
void CStringDialog::DoDataExchange(CDataExchange* pDX)
{
CXFResDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CStringDialog)
DDX_Control(pDX, IDCANCEL, m_btnCancel);
DDX_Control(pDX, IDOK, m_btnOK);
DDX_Control(pDX, IDC_XFEDITWANT, m_editWant);
DDX_Text(pDX, IDC_XFEDITWANT, m_strWant);
DDX_Text(pDX, IDC_XFDESCRIPT, m_strDescript);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CStringDialog, CXFResDialog)
//{{AFX_MSG_MAP(CStringDialog)
ON_EN_CHANGE(IDC_XFEDITWANT, OnChangeEditwant)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CStringDialog message handlers
BOOL CStringDialog::OnInitDialog()
{
CXFResDialog::OnInitDialog();
// TODO: Add extra initialization here
CString strTitle, strDescript;
strTitle = AfxModuleLoadString( m_nIDTitle );
strDescript = AfxModuleLoadString( m_nIDDescript );
if( strTitle.GetLength() > 0 )
SetWindowText( strTitle );
if( strDescript.GetLength() > 0 )
m_strDescript = strDescript;
UpdateData( FALSE );
m_btnOK.EnableWindow( m_strWant.GetLength() > 0 );
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CStringDialog::OnOK()
{
// TODO: Add extra validation here
UpdateData( );
m_strWant.TrimLeft();
m_strWant.TrimRight();
if( m_strWant.GetLength() <= 0 )
CXFResDialog::OnCancel();
else
CXFResDialog::OnOK();
}
void CStringDialog::OnChangeEditwant()
{
// TODO: If this is a RICHEDIT control, the control will not
// send this notification unless you override the CXFResDialog::OnInitDialog()
// function and call CRichEditCtrl().SetEventMask()
// with the ENM_CHANGE flag ORed into the mask.
// TODO: Add your control notification handler code here
CString rString;
m_editWant.GetWindowText( rString );
rString.TrimLeft();
rString.TrimRight();
m_btnOK.EnableWindow( rString.GetLength() > 0 );
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -