Setare extensie default pentru CFileDialog

Intrebari legate de programarea cu biblioteci precum MFC, ATL, WTL si GDI+.
Post Reply
mesajflaviu
Membru++
Membru++
Posts: 684
Joined: 10 Sep 2008, 21:40
Judet: Cluj

Setare extensie default pentru CFileDialog

Post by 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:

Code: Select all

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:

Code: Select all

	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);
Attachments
TestFD.zip
(162.14 KiB) Downloaded 709 times



User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3776
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: Setare extensie default pentru CFileDialog

Post by Ovidiu Cucu » 13 Jun 2017, 17:14

mesajflaviu wrote:(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:

Code: Select all

CStringA strAnsi(strUnicode);

Code: Select all

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

Code: Select all

SetDefExt(sExt);
sau, daca vrei sa fii mai pedant

Code: Select all

SetDefExt(sExt.GetString());

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3776
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: Setare extensie default pentru CFileDialog

Post by Ovidiu Cucu » 13 Jun 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:

Code: Select all

#include <atlpath.h> // add this to stdafx.h

Code: Select all

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;
    }
}

Code: Select all

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. :)

mesajflaviu
Membru++
Membru++
Posts: 684
Joined: 10 Sep 2008, 21:40
Judet: Cluj

Re: Setare extensie default pentru CFileDialog

Post by mesajflaviu » 15 Jun 2017, 11:25

Multumesc, o sa incerc aceasta solutie, si revin cu feedback !

Post Reply