hur.cn - 华软网

 热门搜索

CFileDialog 的问题 !

  作者:未知    来源:网络    更新时间:2010/12/7
弹出一个资料选择对话框,指定一个初始目录,如何限制用户只可在给定的初始目录及其子目录中选择资料,不能选择其余地方的资料?
---华软 网友回答---
等了一夜,结果无人回复,杯具 ...
---华软网友回复---
GetPathName能否通过这个函数获得所打开资料的路径,然后自己判断路径来确认 是否在初始目录
---华软网友回复---
你能够换一种思绪嘛,能够把你读回来的数据跟你的初始目录对照就是,如果不是指定目录下就提醒资料不合适规范,只可在什么目录下找就能够呀。
---华软网友回复---
像楼上说的那样,自己来控制吧,没法限制这个对话框的选择
---华软网友回复---
http://topic.csdn.net/t/20041115/20/3555479.html

自己创建一个对话框 
设置一个变量 
变量另外设置,保存基本路径 

只用一个文本框和一个列表框 
winexec执行dir   目录,将输出重定向到一个临时资料 
行读出资料(判别0x1310),将.和..的不输出,其余的输出到列表框,并增加一个项,直指基本路径
---华软网友回复---
楼主能够试试设定OPENFILENAME中lpstrCustomFilter来过滤条件 
---华软网友回复---
char lpszFilter[] = "doc files(*.doc)|*.doc||";
CString m_constrain = "C:\\Documents and Settings\\Administrator\\桌面";
CString pathName = "";
CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,lpszFilter);
dlg.m_ofn.lpstrInitialDir  = m_constrain;//弹出一个资料选择对话框,指定一个初始目录
if(dlg.DoModal() == IDOK)
{
pathName = dlg.GetPathName();
CString str = pathName.Left(m_constrain.GetLength());
if(str == m_constrain)//如何限制用户只可在给定的初始目录及其子目录中选择资料,不能选择其余地方的资料
{
    MessageBox(pathName);
}
}
---华软网友回复---
大家给的也是一种思绪,然则不合适实际的需求。我现在需要指定一个目录,只可让用户在该目录下选择资料,意思就是用户不能在资料打开对话框中浏览和选择其余目录的内容,如果只根据用户选择的路径来判断的话,没有实现资料隐藏的目的。

另有一个问题就是:如果我指定的初始目录是一个远程目录,比如 \\MyComputer(MyComputer是远程主机的主机名),我选择资料后,用 GetPathName 函数猎取的资料路径大概是这个样子 \\MyComputer\Program Files\MSXML 6.0\EULA\License_MSXML6_ENU.txt。
我现在想猎取该资料在远程主机中的路径名:C:\Program Files\MSXML 6.0\EULA\License_MSXML6_ENU.txt, 该怎么做 ?
---华软网友回复---
Cstring strPath = C:\Program Files\MSXML 6.0\EULA\License_MSXML6_ENU.txt;
int iIndex = strPath.reversefind('\\');
strPath = strPath.left(0, iIndex);

大概这么 搞  没尝试
---华软网友回复---
引用 9 楼 zzz_zou 的回复:
Cstring strPath = C:\Program Files\MSXML 6.0\EULA\License_MSXML6_ENU.txt;
int iIndex = strPath.reversefind('\\');
strPath = strPath.left(0, iIndex);

大概这么 搞 没尝试


大哥,麻烦先看看我的问题好欠好,都被你搞懵了 ....
---华软网友回复---
 我以为你只是

我现在想猎取该资料在远程主机中的路径名:C:\Program Files\MSXML 6.0\EULA\License_MSXML6_ENU.txt, 该怎么做 ?

欠好意思- -
---华软网友回复---
引用 8 楼 kusey 的回复:
大家给的也是一种思绪,然则不合适实际的需求。我现在需要指定一个目录,只可让用户在该目录下选择资料,意思就是用户不能在资料打开对话框中浏览和选择其余目录的内容,如果只根据用户选择的路径来判断的话,没有实现资料隐藏的目的。

另有一个问题就是:如果我指定的初始目录是一个远程目录,比如 \\MyComputer(MyComputer是远程主机的主机名),我选择资料后,用 GetPathName 函数……

那你就自己做个资料浏览对话框
---华软网友回复---
dlg.m_ofn.lpstrInitialDir = pathbuf; //设置打开对话框后资料的默许路径
---华软网友回复---
引用 12 楼 visualeleven 的回复:
引用 8 楼 kusey 的回复:
那就自己做个资料浏览对话框


这个.... 做起来应该对照复杂吧。还要思量猎取远程主机的目录,没有思绪...
---华软网友回复---
同志们另有什么建议,赶忙支招呀 !
---华软网友回复---
把CFileDialog封装成你想要的Dll就能够了
---华软网友回复---
CFileDialog能够设定初始路径,然则限制的话。。。可能要重新封装这个类
---华软网友回复---
引用 17 楼 reggiekiller 的回复:
CFileDialog能够设定初始路径,然则限制的话。。。可能要重新封装这个类


如何封装,给个思绪,如何猎取远程主机的目录信息?
---华软网友回复---
不让用户改目录。
用户有2个方法改目录,一个是“查找范围”右侧的‘combo’。能够这样:
1》。装置Hook:
fd.m_ofn.lpfnHook=HookProc;//
// for CFileDialog hook proc 
UINT CALLBACK HookProc(HWND hDlg,UINT uMsg,WPARAM wPar,LPARAM lPar)
2》。在hook中:
case WM_INITDIALOG 
//directory choose Combo ID=1137=0x0471
hw=GetDlgItem(hWndParent,0x0471);// cmb2
::EnableWindow(hw,FALSE);
这样用户就不能操作这个combo了。
3》。再右侧就是toolbar了,用户在那里也能够改目录的,目前我没找到他的ID

---华软网友回复---
有措施了:
// for CFileDialog 
UINT CALLBACK HookProc(HWND hDlg,UINT uMsg,WPARAM wPar,LPARAM lPar)
{ // hdlg is a child 
HWND hWndParent;
CWinApp *pApp=AfxGetApp();
HICON hIcon;
HWND        hw; // SHELLDll_defView
HWND        hcw;// SysListView32
DWORD       dwStyle;
LPOFNOTIFY  lpon=0;
UINT        Notify=0;
//
if (hDlg == NULL) return 0;
#ifdef _DEBUG
// from "_AfxCommDlgProc()" of the file "dlgcomm.cpp"
_AFX_THREAD_STATE* pThreadState = AfxGetThreadState();
// =_AfxActivationWndProc(hwnd,uint,uint,long)
if (pThreadState->m_pAlternateWndInit != NULL) pThreadState->m_pAlternateWndInit = NULL;
#endif
//
hWndParent=GetParent(hDlg);// needed
if(CBoldProc==0) CBoldProc = (WNDPROC)SetWindowLong(hWndParent, GWL_WNDPROC, (LONG)CBProc);
在这里再subclass一次。
//
WNDPROC CBoldProc=0;//old
LRESULT CALLBACK CBProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)//子类化 

switch(Msg) 
{  
case WM_COMMAND://40961=向上一级,40962=新目录
if((int)wParam==40961 || (int)wParam==40962) return 0;
break;
}
return CallWindowProc(CBoldProc, hWnd, Msg, wParam, lParam);

 

---华软网友回复---
  class="deleted_message"> 该回复于2010-12-10 09:03:18被版主删除
---华软网友回复---
  class="deleted_message"> 该回复于2010-12-10 13:19:06被版主删除
---华软网友回复---
你能够试着自己创建一个Dialog。。。。。      
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。