2009-07-10 4 views
3

В VC++ 6.0, MFC Я хочу, чтобы выбрать несколько файловвыбрать несколько файлов в CFileDialog

CFileDialog opendialog(true); // opens the dialog for open; 
opendialog.m_ofn.lpstrTitle="SELECT FILE"; //selects the file title; 
opendialog.m_ofn.lpstrFilter="text files (*.txt)\0*.txt\0"; //selects the filter; 

if(opendialog.DoModal()==IDOK) //checks wether ok or cancel button is pressed; 
{ 
    srcfilename=opendialog.GetPathName(); //gets the path name; 
    ... 
} 

Пример кода выше позволяет выбран в то время только один файл, но я хочу, чтобы выбрать несколько текстовых файлов , например, удерживая клавишу управления (ctrl + выберите несколько файлов). Как я могу это достичь?

ответ

1

Вы должны передать флаг OFN_ALLOWMULTISELECT в структуре OpenFileName, чтобы обеспечить возможность выбора.

+0

пожалуйста, вы можете мне пример, так что я буду получать более ясно, спасибо – 2009-07-10 06:17:43

8

Итак, в конструкторе для CFileDialog вы можете установить параметр dwFlags, чтобы иметь «OFN_ALLOWMULTISELECT». Это просто, чтобы на самом деле получить несколько имен файлов назад, вам нужно изменить член m_ofn.lpstrFile в CFileDialog, чтобы указать на выделенный буфер. Посмотрите здесь:

http://msdn.microsoft.com/en-us/library/wh5hz49d(VS.80).aspx

Вот пример использования этого, надеюсь, комментариев будет достаточно для:

void CMainFrame::OnFileOpen() 
{ 
    char strFilter[] = { "Rule Profile (*.txt)|*.txt*||" }; 

    CFileDialog FileDlg(TRUE, "txt", NULL, OFN_ALLOWMULTISELECT, strFilter); 
    CString str; 
    int nMaxFiles = 256; 
    int nBufferSz = nMaxFiles*256 + 1; 
    FileDlg.GetOFN().lpstrFile = str.GetBuffer(nBufferSz); 
    if(FileDlg.DoModal() == IDOK) 
    { 
     // The resulting string should contain first the file path: 
     int pos = str.Find(' ', 0); 
     if (pos == -1); 
      //error here 
     CString FilePath = str.Left(pos); 
     // Each file name is seperated by a space (old style dialog), by a NULL character (explorer dialog) 
     while ((pos = str.Find(' ', pos)) != -1) 
     { // Do stuff with strings 
     } 
    } 
    else 
     return; 
} 
+0

еще я путаница, я не получаю ясно, пожалуйста, будет у дать мне образец кода или в любом примере, или, пожалуйста, измените мой код, приведенный выше, спасибо – 2009-07-10 06:09:57

+1

Вам не нужно звонить str.ReleaseBuffer() после DoModal()? – Magnus

+1

@Magnus: Я согласен! Должен также делать 'FileDlg.GetOFN(). NMaxFiles = nMaxFiles' перед' DoModal'. –

0

Вставьте эту строку:

opendialog.m_ofn.Flags |= OFN_ALLOWMULTISELECT; 

Или установить флаг в конструктор CFileDialog, как DeusAduro.

3

Пример:

CString sFilter = _T("XXX Files (*.xxx)|*.xxx|All Files (*.*)|*.*||"); 


CFileDialog my_file_dialog(TRUE, _T("xxx"),NULL, 
          OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT | OFN_FILEMUSTEXIST | OFN_ALLOWMULTISELECT, 
          sFilter, this); 

if (my_file_dialog.DoModal()!=IDOK) 
    return; 

POSITION pos (my_file_dialog.GetStartPosition()); 
while(pos) 
{ 
    CString filename= my_file_dialog.GetNextPathName(pos); 

    //do something with the filename variable 
} 
Смежные вопросы