我已经知道加上 OFN_ALLOWMULTISELECT 就可以选择多个文件在返回文件名时 如果选择一个文件 就返回完整路径 如果选择多个返回目录名 要怎么取得已选择的全部文件名?
MFC 的列子已经知道。
SDK 下没有 MFC 的 GetStartPosition请给出相应代码。

解决方案 »

  1.   

    SDK有FindFirstFile、FindNextFile、GetFileSize、GetFileTime、GetFullPathName等File Management Functions。你可以参考一下MSDN
      

  2.   

    LRESULT OpenMultiFiles(HWND hwnd)
    {
    OPENFILENAME ofn;
    static TCHAR szFileName[8192]; // String buffer especially for OFN_ALLOWMULTISELECT
    strcpy(szFileName, "d:\\*.*");
    static TCHAR szFilter[] = _T("文本文件(*.TXT, *txt)\0*.TXT\0*.txt\0\0");
    static TCHAR szTitle[] = _T("OPEN");

    ZeroMemory(&ofn, sizeof(OPENFILENAME));
    ofn.lStructSize = sizeof(OPENFILENAME);
    ofn.hwndOwner = NULL;
    ofn.lpstrFilter = szFilter;
    ofn.nFilterIndex = 1;
    ofn.lpstrFile = szFileName;
    ofn.nMaxFile = sizeof(szFileName);
    ofn.lpstrFileTitle = NULL;
    ofn.lpstrTitle = szTitle;
    ofn.nMaxFileTitle = 0;
    ofn.lpstrInitialDir = NULL;
    ofn.Flags = OFN_OVERWRITEPROMPT | OFN_HIDEREADONLY | OFN_PATHMUSTEXIST 
    | OFN_ALLOWMULTISELECT | OFN_EXPLORER;

    if (GetOpenFileName(&ofn)) {
    LPTSTR psz = ofn.lpstrFile + ofn.nFileOffset;
    psz[-1] = _T('\\');

    // 得到所有文件
    while (*psz != 0) {
    int len = _tcslen(psz);
    _tcscpy(ofn.lpstrFile + ofn.nFileOffset, psz);
    psz += len + 1;

    // 
    char szFile[MAX_PATH];
    strcpy(szFile, ofn.lpstrFile);
    }
    }
    return 0;
    }
      

  3.   

    strcpy 好象有问题 我用 Unicode修改为 也有问题。
    StrCpy
      

  4.   

    参考 MFC 的示例和 MFC 的源码就很容易得到了
      

  5.   

    OPENFILENAME ofn;
    TCHAR str[32000];
    TCHAR szFile[10000];
    TCHAR *p;
    TCHAR Name[MAX_PATH];
    TCHAR szTmp[MAX_PATH];
    int i=1;
    _tcscpy(szFile, _T(""));
    ZeroMemory(&ofn, sizeof(OPENFILENAME));
    ofn.lStructSize = sizeof(OPENFILENAME);
    ofn.hwndOwner = hWnd;
    ofn.lpstrFilter = _T("*.*\0*.*\0");
    ofn.nMaxFile = 10000;
    ofn.lpstrFile       = szFile;
    ofn.Flags = OFN_OVERWRITEPROMPT | OFN_HIDEREADONLY | OFN_PATHMUSTEXIST 
    | OFN_ALLOWMULTISELECT | OFN_EXPLORER;
    if (GetOpenFileName(&ofn)) {
    p=szFile;
    _tcscpy(Name, p); if (*(p+_tcslen(Name)+1)==0) {
    wsprintf(str,_T("%s"),Name);
    } else {
    wsprintf(str,_T("%s\r\n\r\n"), Name); for (;;) {
    p=p+_tcslen(Name)+1;
    if (*p==0)
    break;
    _tcscpy(Name,p);
    wsprintf(szTmp,_T("%d文件 = %s \r\n"),i++,Name);
    _tcscat(str,szTmp);
    }
    }
    MessageBox(hWnd,str,_T("完毕"),MB_OK);
    }可以帮我优化一下吗?
      

  6.   

    void GetOpenFileName_sample()
    {
    TCHAR str[320000] = {0};
    TCHAR szFile[MAX_PATH+1024];
    TCHAR *p = NULL;
    TCHAR Name[MAX_PATH];
    TCHAR szTmp[MAX_PATH];
    int i=1;
    memset(szFile,0, sizeof(szFile));
    OPENFILENAME ofn;
    ZeroMemory(&ofn, sizeof(OPENFILENAME));
    ofn.lStructSize = sizeof(OPENFILENAME);
    ofn.hwndOwner = NULL;
    ofn.lpstrFilter = _T("*.*\0*.*\0");
    ofn.nMaxFile = sizeof(szFile)/sizeof(szFile[0]);
    ofn.lpstrFile = szFile;
    ofn.Flags = OFN_OVERWRITEPROMPT | OFN_HIDEREADONLY | OFN_PATHMUSTEXIST
    | OFN_ALLOWMULTISELECT | OFN_EXPLORER;
    if (GetOpenFileName(&ofn)) 
    {
    p=szFile;
    }

    TCHAR dir_buf[MAX_PATH+1024];
    if(p && p[0])
    {
    _tcscpy(dir_buf,p);
    p = p + _tcslen(dir_buf)+1;
    if(!p[0])
    {
    _tprintf(_T("only 1 file is selected:%s\n"),dir_buf);
    }
    else
    _tcscat(dir_buf,_T("\\"));
    }
    while(p && p[0])
    {
    _tcscpy(Name, p);
    _tcscat(str,dir_buf);
    _tcscat(str,Name);
    _tcscat(str,_T("\n"));
    p = p + _tcslen(Name)+1;
    }
    _tprintf(_T("%s"),str);
    }
      

  7.   

    masterz  回归了??高兴。(听说曾经是vc的最强人)搂住艳福不浅啊