Setare extensie default pentru CFileDialog

Intrebari legate de programarea cu biblioteci precum MFC, ATL, WTL si GDI+.

Setare extensie default pentru CFileDialog

Mesajde mesajflaviu » 12 Oct 2015, 11:40

Am derivate o clasa CFileDialogExt din CFileDialog, pentru a putea seta extensia default pentru un tip de fisier ales (la salvare) ... pentru asta, am suprascris CFileDialogExt::OnTypeChange() dupa cum urmeaza:
Cod: Selectaţi tot
void CFileDialogExt::OnTypeChange()
{
   // TODO: Add your specialized code here and/or call the base class

   CFileDialog::OnTypeChange();

   CString sExt(GetFileExt());

   switch(GetOFN().nFilterIndex)
   {
   case 1:
      sExt.Format(_T("bmp"));
      break;
   case 2:
      sExt.Format(_T("gif"));
      break;
   case 3:
      sExt.Format(_T("jpg"));
      break;
   case 4:
      sExt.Format(_T("png"));
      break;
   case 5:
      sExt.Format(_T("tiff"));
      break;
   }

   SetDefExt((LPCSTR)(LPCTSTR)sExt);
}

Toate bune si frumoase, dar extensia default se seteaza cu o alegere in urma ... adica:
pun un nume fiser: test
aleg extensia gif. - nu se intampla nimic.
aleg extensia jpg - numele fisierului se schimba in test.gif
aleg extensia png - numele fisierului se schimba in test.jpg

Baiu e ca nu am acces la combobox-ul de extensii, in cazul cand CFileDialog are VistaStyle ... atasez si un proiect de test, VS2008. Care ar putea fi solutia acestei probleme ?

P.S. Filtrul arata in felul urmator:
Cod: Selectaţi tot
   LPTSTR szFilter = _T("Bitmap Files (*.bmp)|*.bmp|Gif Files (*.gif)|*.gif|Jpeg Files (*.jpg)|*.jpg|Png Files (*.png)|*.png|Tiff Files (*.tiff)|*.tiff||");
   CFileDialogExt dlg(FALSE, NULL, NULL, OFN_FILEMUSTEXIST, szFilter);
Fişiere ataşate
TestFD.zip
(162.14 KiB) Descărcat de 651 ori
mesajflaviu
Membru++
Membru++
 
Mesaje: 680
Membru din: 10 Sep 2008, 21:40
Judet: Cluj

Re: Setare extensie default pentru CFileDialog

Mesajde Ovidiu Cucu » 13 Iun 2017, 17:14

mesajflaviu scrie:(LPCSTR)(LPCTSTR)sExt

Niciodata sa nu faci astfel de casturi pentru a converti stringuri UNICODE la ANSI si vice versa!
Daca ai neaparata nevoie poti folosi ATL/MFC String Conversion Classes and Macros (recomand clasele) sau mai simplu, poti costrui un CStrtring UNICODE dintr-unul ANSI si invers ca in urmatoarele exemple:
Cod: Selectaţi tot
CStringA strAnsi(strUnicode);

Cod: Selectaţi tot
CStringW strUnicode(strAnsi);

Insa aici (doar daca n-o fi vreun bug prin versiunea ta de MFC, poti sa-l pasezi fara sa faci niciun fel de cast explicit
Cod: Selectaţi tot
SetDefExt(sExt);

sau, daca vrei sa fii mai pedant
Cod: Selectaţi tot
SetDefExt(sExt.GetString());
Avatar utilizator
Ovidiu Cucu
Fondator
Fondator
 
Mesaje: 3776
Membru din: 11 Iul 2007, 16:10
Localitate: Iasi
Judet: Iaşi

Re: Setare extensie default pentru CFileDialog

Mesajde Ovidiu Cucu » 13 Iun 2017, 20:23

Am reusit totusi sa reproduc, necazul tau: pentru Vista-style, daca bati un nume fara extensie iar apoi umbli la combo, extensia din edit o ia razna. Se poate repara asta suprascriind CFileDialog::OnFileNameChange si schimband extensia naspa cu cea dorita.
Cam asa:
Cod: Selectaţi tot
#include <atlpath.h> // add this to stdafx.h

Cod: Selectaţi tot
void CFileDialogExt::OnTypeChange()
{
    ATLASSERT(m_bVistaStyle);

    CFileDialog::OnTypeChange();

    switch (GetOFN().nFilterIndex)
    {
    case 1:
        SetDefExt(_T("bmp"));
        break;
    case 2:
        SetDefExt(_T("gif"));
        break;
    case 3:
        SetDefExt(_T("jpg"));
        break;
    case 4:
        SetDefExt(_T("png"));
        break;
    case 5:
        SetDefExt(_T("tiff"));
        break;
    }
}

Cod: Selectaţi tot
void CFileDialogExt::OnFileNameChange()
{
    ATLASSERT(m_bVistaStyle);

    CFileDialog::OnFileNameChange();

    CString strFileName = GetFileName();   
    if (strFileName.IsEmpty())
        return;

    ATLPath::RemoveExtension(CStrBuf(strFileName, MAX_PATH));
    CString strExt;
    switch (GetOFN().nFilterIndex)
    {
    case 1:
        strExt = _T(".bmp");
        break;
    case 2:
        strExt = _T(".gif");
        break;
    case 3:
        strExt = _T(".jpg");
        break;
    case 4:
        strExt = _T(".png");
        break;
    case 5:
        strExt = _T(".tiff");
        break;
    }
    ATLPath::AddExtension(CStrBuf(strFileName, MAX_PATH), strExt);
    HRESULT hr = (static_cast<IFileDialog*>(m_pIFileDialog))->SetFileName(CStringW(strFileName));
    if (FAILED(hr))
    {
        // TODO: log error
    }
}

Desigur, e loc de refactorizare dar in principiu functioneaza. :)
Avatar utilizator
Ovidiu Cucu
Fondator
Fondator
 
Mesaje: 3776
Membru din: 11 Iul 2007, 16:10
Localitate: Iasi
Judet: Iaşi

Re: Setare extensie default pentru CFileDialog

Mesajde mesajflaviu » 15 Iun 2017, 11:25

Multumesc, o sa incerc aceasta solutie, si revin cu feedback !
mesajflaviu
Membru++
Membru++
 
Mesaje: 680
Membru din: 10 Sep 2008, 21:40
Judet: Cluj


Înapoi la MFC, ATL, WTL si GDI+.

Cine este conectat

Utilizatorii ce navighează pe acest forum: Niciun utilizator înregistrat şi 1 vizitator