[MFC C++] CFileDialog i OFNHookProc

0

Do standardowego dialogu CFileDialog dodałem własną procedurę obsługi przez OFNHookProc.

Oto cały kod

UINT CALLBACK OPNHook( HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam )
{
switch(msg)
{
case WM_INITDIALOG:
{
MessageBox(hDlg,"Start - to chodzi",NULL,MB_OK);
break;
}
}
return (0);
}

oraz część procki zasadniczej:

CFileDialog m_Save(FALSE,NULL,"pusty.txt",
OFN_PATHMUSTEXIST | OFN_ENABLEHOOK | OFN_EXPLORER,
"Pliki tekstowe|.txt|"
"Wszystkie|
.*|");

  m_Save.m_ofn.lpfnHook=&OPNHook;

  m_Save.DoModal();

i już w trakcie działania programu przy zamykaniu CFileDialog- wciśnięciu "Zapisz" mam błąd Assercji (ale nie dla "Anuluj").

File: dlgfile.cpp

Dlaczego ?

PS. niczego więcej nie deklarowałem....

0

Dlaczego ?

Może dlatego

 m_Save.m_ofn.lpfnHook=&OPNHook;

Zajrzyj do źródeł CFileDialog. Klasa ta dodaje już swojego callback'a - AfxCommDlgProc (dlgcomm.cpp)

0

Fakt, jest:

m_ofn.lpfnHook = (COMMDLGPROC)_AfxCommDlgProc;

Myślałem, że dodaje swoją prockę. A ja zastąpiłem istniejącą :-/

Czy można podpiąć się do procki _AfxCommDlgProc [???]


Zasadniczo interesuje mnie....

void CFileDialog::OnTypeChange() //nie mogę przesłonić tej funkcji bo jej adres jest już skompilowany!
{ //....a można to przesłonić (czyt: podpiąć się za oryginał).
ASSERT_VALID(this);

MessageBox("to chce sprawdzać");

// Do not call Default() if you override
// no default processing needed
}
....czy ktoś zmienił typ plików.

W FileDialog można wybierać grupy rozszerzeń plików:

"Plik tekstowy|.txt|" //część deklaracji CFileDialog !!
"Plik Word|
.doc|");

A jeśli ktoś poda nazwę pliku "TakaNazwaBezRozszerzenia" to nie wiem czy wybrał .txt czy .doc. Bo nie podał jawnie.

Jeśli brak rozszerzenia w nazwie pliku - to jak dojść o jaki typ pliku chodzi [???]

0

Na MFC się nie znam, bo w tym nigdy nic nie robiłem i nie mam zamiaru tego zmieniać. Ale na twoje pytanie:

Jeśli brak rozszerzenia w nazwie pliku - to jak dojść o jaki typ pliku chodzi

odpowiedzieć umiem ;) Sprawa jest bolesna, bo taki plik musisz otworzyć i na podstawie zawartości określić typ. Pliki inne niż czysty tekst mają na samym początku z reguły kilkubajtową sygnaturę, np dokumenty worda zaczynają się od ciągu tekstowego: {\rtf (dokładniej - taki plik to RTF, ale zauważyłem, że często takie pliki mają rozszerzenie doc pod Windowsem...)
albo od binarnego:
D0 CF 11 E0
na moje oko to będzie właśnie sygnatura, a kolejne 4 bajty:
A1 B1 1A E1
to jakieś oznaczenie wersji chyba. Nie chciało mi się tego dochodzić szczerze mówiąc, poeksperymentuj sam z różnymi wersjami worda.

0

A tu chodzi o zapis danych w WYBRANYM formacie przez użytkownika. Dla odczytu nie ma problemu jak sam piszesz !!

Pytanie: "co użytkownik miał na myśli" wybierając nazwe NazwaPlikuBezRozszerzenia

0

A, z zapisem to jest trochę inna sprawa:

  1. w końcu twój program najlepiej wie, co zapisuje - chyba. Więc wiesz raczej, w jakim formacie to zapisać.
  2. jak masz dokument, to trzeba się pobawić w jasnowidza i wybrać format np na podstawie takich kryteriów: jak dokument ma jakieś formatowanie, to zapisujesz jako doc. Jak nie ma, jako txt.
  3. ewentualnie wywalić jakieś okno z pytaniem o format pliku, coś w stylu: komunikat + ileś tam radiobuttonów z nazwami możliwych formatów.

Innych możliwości nie widzę - cudów nie ma. A jak ktoś ma jeszcze inną propozycję, to z chęcią sam przeczytam, bo w wolnych chwilach piszę dość duże MDI, i z przyjemnością bym je jeszcze udoskonalił, żeby było bardziej "user friendly" ;)

0
Ranides napisał(a)

A, z zapisem to jest trochę inna sprawa:

  1. w końcu twój program najlepiej wie, co zapisuje ... ;-) .....to trzeba się pobawić w jasnowidza i..... ewentualnie wywalić jakieś okno z pytaniem o format pliku... nie o to chodzi
    ...Innych możliwości nie widzę - cudów nie ma. ...eeee są - inne programy to potrafią .... z przyjemnością bym je jeszcze udoskonalił, żeby było bardziej "user friendly" ;)

Ja także :-D

0
pajero napisał(a)

Zasadniczo interesuje mnie....

void CFileDialog::OnTypeChange() //nie mogę przesłonić tej funkcji bo jej adres jest już skompilowany!
[...]

Jak to nie można? Tworzysz nową klasę dziedziczącą po CFileDialog.

W FileDialog można wybierać grupy rozszerzeń plików:

"Plik tekstowy|.txt|" //część deklaracji CFileDialog !!
"Plik Word|
.doc|");

A jeśli ktoś poda nazwę pliku "TakaNazwaBezRozszerzenia" to nie wiem czy wybrał .txt czy .doc. Bo nie podał jawnie.

Jeśli brak rozszerzenia w nazwie pliku - to jak dojść o jaki typ pliku chodzi [???]

O to chodzi??

m_Save.GetOFN().nFilterIndex

zwraca index ostatnio wybranego filtra/rozszerzenia

0

TAKKKKKKKK;

Dziękuję. Choć w moim przypadku jest to m_Save.m_ofn.nFilterIndex;.

Przesłonić oczywiście można, tylko jestem za słaby jeszcze w C++ (za długo bawiłem się w asm na 6502 i mam teraz tyły do reszty świata ;-( ).

1 użytkowników online, w tym zalogowanych: 0, gości: 1