| |
|
|
Georg Hovenbitzer | Hallo zusammen,
ich verstehe mal wieder Windows nicht Der Code unten funktioniert, nur wenn ich per .Flag OFN_ENABLEHOOK einschalte wird das Fenster nicht mehr im Explorer Style angezeigt. Also es fehlen links die großen Buttons. Wobei es laut win32.hlp so gehen soll. Testen kann man dies, wenn man im Code unter .Flag& das $20 löscht. Die HookProc wird aufgerufen wenn man eine Datei auswählt die vorhanden ist und OK drückt.
Noch eine Zusatzfrage: Ich habe den Code mal so geändert, dass ein Dialog in der HookProc geöffnet wird. Die Schriftart in der Messagebox und in dem Dialog sind unterschiedlich, wie bekomme ich den Dialog in der gleichen Schrift wie die Messagebox. Mit SetDialogfont 0 habe ich es schon probiert, bringt aber nichts. KompilierenMarkierenSeparierenDef GetSaveFileName(1) !"COMDLG32.DLL","GetSaveFileNameA"
Def Make256String(1) ((@$(1) + @Chr$(0)) + @Space$(256 - @Len(@$(1))))
Struct tagOFN = lStructSize&,
hWndOwner&,
hInstance&,
lpstrFilter&,
lpstrCustomFilter&,
nMaxCustFilter&,
nFilterIndex&,
lpstrFile&,
nMaxFile&,
lpstrFileTitle&,
nMaxFileTitle&,
lpstrInitialDir&,
lpstrTitle&,
Flags&,
nFileOffset%,
nFileExtension%,
lpstrDefExt&,
lCustData&,
lpfnHook&,
lpTemplateName&
Declare ofn#
Dim ofn#,tagOFN
Struct _Rect = Left&,
Top&,
Right&,
Bottom&
Declare Rect#
Dim Rect#,_Rect
Proc SaveDateiHook
Parameters hdlg&,uMsg&,wParam&,lParam&
Declare Parent&
Clear Rect#
If uMsg& = 49265
If @FileExists(@String$(ofn#.lpstrFile&,0)) = 1
Parent& = @External("USER32","GetParent",hdlg&)
@External("USER32","GetWindowRect",Parent&,Rect#)
Declare Fenster&
Declare Weiter&
Declare Neu&
Declare Abbruch&
Fenster& = @Create("Dialog",Parent&,"Datei existiert",10,10,300,150)
Weiter& = @Create("DefButton",Fenster&,"Anhängen",20,60,120,30)
Neu& = @Create("Button",Fenster&,"Überschreiben",150,60,120,30)
@MessageBox("Left = "+@Str$(Rect#.Left&)+"
"+"Top = "+@Str$(Rect#.Top&)+"
"+"Right = "+@Str$(Rect#.Right&)+"
"+"Bottom = "+@Str$(Rect#.Bottom&)+"
"+"File = "+@String$(ofn#.lpstrFile&,0),"Info",1)
Return 1
EndIf
EndIf
Return 0
EndProc
Proc SaveDatei
Parameters hWnd&,Titel$,FileSpec$,InitialDir$,Filter$,DefExt$
Declare CustomFilter$
Declare FileTitle$
Declare rCode&
Declare Auswahl$
Clear ofn#
Titel$ = Make256String(Titel$)
FileSpec$ = Make256String(FileSpec$)
InitialDir$ = Make256String(InitialDir$)
Filter$ = @Translate$(Filter$,"|",@Chr$(0)) + @Chr$(0)
Filter$ = Make256String(Filter$)
DefExt$ = Make256String(DefExt$)
With ofn#
.lStructSize& = @SizeOf(ofn#)
.hWndOwner& = hWnd&
.hInstance& = %hInstance
.lpstrFilter& = @Addr(Filter$)
.lpstrCustomFilter& = @Addr(CustomFilter$)
.nMaxCustFilter& = 0
.nFilterIndex& = 1
.lpstrFile& = @Addr(FileSpec$)
.nMaxFile& = 256
.lpstrFileTitle& = @Addr(FileTitle$)
.nMaxFileTitle& = 256
.lpstrInitialDir& = @Addr(InitialDir$)
.lpstrTitle& = @Addr(Titel$)
.Flags& = ($4 | $20 | $80000 | $800)
OFN_HIDEREADONLY $4
OFN_ENABLEHOOK $20
OFN_PATHMUSTEXIST $800
OFN_EXPLORER $80000
.lpstrDefExt& = @Addr(DefExt$)
.lpfnHook& = @ProcAddr(SaveDateiHook,4)
EndWith
rCode& = GetSaveFileName(ofn#)
If rCode& <> 0
Auswahl$ = @String$(ofn#.lpstrFile&,0)
Else
Auswahl$ = ""
EndIf
Dispose ofn#
Return Auswahl$
EndProc
Window 100,100-800,600
Print SaveDatei(%hWnd,"Datei speichern unter:","DLQueue",$ProgDir,"Download File (*.dat)|*.dat|Textfile (*.txt)|*.txt","*.dat")
WaitInput
Dispose ofn#
Dispose Rect#
End
|
|
|
| Viele Grüsse, Georg Hovenbitzer(Windows XP Pro, XProfan 11.2, Profan2Cpp 1.6a) | 02.06.2006 ▲ |
|
|
|
|
| Ich hatte das Ganze hier [...] etwas anders gelöst, aber ich glaube mich zu erinnern das dass Problem das Selbe war. |
|
|
| |
|
|
|
| Ich kann mir vorstellen das WinXP mittels eines eigenen Hooks diese Bar erzeugt, was dann nicht geschieht wenn man einen owner-Hook definiert. |
|
|
| |
|
|
|
Georg Hovenbitzer | Hallo iF,
dein Demo kenne ich sehr gut Ich klaue doch gerne
Aber bei dir wird der Explorer Sytle auch nicht angezeigt
Mal der Auszug aus der Win32.hlp:
[quote:d1a14d6a62] By default, Windows 95 and Windows NT version 4.0 display a new version of the Save dialog box that provides user-interface features that are similar to the Windows Explorer. You can provide an OFNHookProc hook procedure for an Explorer-style Save dialog box. To enable the hook procedure, set the OFN_EXPLORER and OFN_ENABLEHOOK flags in the Flags member of the OPENFILENAME structure and specify the address of the hook procedure in the lpfnHook member. [/quote:d1a14d6a62] |
|
|
| Viele Grüsse, Georg Hovenbitzer(Windows XP Pro, XProfan 11.2, Profan2Cpp 1.6a) | 02.06.2006 ▲ |
|
|
|
|
| Ist imho doch auch richtig wie das Win da reagiert. Dort steht ja schliesslich nicht das OFN_EXPLORER für die Bar zuständig ist. Für mich ist es schlüssig das Windows da den default LoadSaveDialog anzeigt da halt eine eigene HookProc für diese Extras sorgen soll.
Ich habe keinen Rat wie man beides miteinander vereinen kann. |
|
|
| |
|
|
|
Georg Hovenbitzer | Hallo iF,
was ist denn dann der Explorer Style ?! Da beide Varianten sich nur durch die Bar an der linken Seite unterscheiden. |
|
|
| Viele Grüsse, Georg Hovenbitzer(Windows XP Pro, XProfan 11.2, Profan2Cpp 1.6a) | 02.06.2006 ▲ |
|
|
|
|
Uwe ''Pascal'' Niemeier | Hallo Leute!
Seit Win2000 wurde die OpenFileName-Struktur um 3 optionale Parameter ergänzt (siehe MSDN). Wird die Grösse der Struktur entsprechend erweitert (die drei LongInts am Ende müssen Null sein) sollte es klappen. Hier eine Demo, um einen Dialog per Hook in der Miniatur-Ansicht zu öffnen (zwecks Bild-Auswahl): KompilierenMarkierenSeparieren!
window 10,10-700,500
$H Messages.ph
$H Windows.ph
proc OpenFileHook-------------------------------OpenFileHook----------------------------
parameters dlg&,msg&,wparam&,lparam&
case Status%:return 1-----Ansicht muss nur einmal angepasst werden
casenot msg&=~WM_NOTIFY:return 1
if long(lparam&,8)=-603---Bei Init existieren DefView und LV noch nicht!
Status%=1
DefView&=~FindWindowEx(~GetParent(dlg&),0,"SHELLDLL_DefView","")
sendmessage(DefView&,~WM_COMMAND,$702D,0)--Undokumentierte Message
endif
return 1
endproc---------------------------------------------------------------------------------
proc LoadPicDialog------------------------------LoadPicDialog---------------------------
parameters Pfad$,Titel$,Name$
declare ofn#,Result$,Result&
declare DefView&,Status%------Variablen für Hook
Name$=Name$+"z*.bmp;*.jpe;*.jpeg;*.jpg;*.gifzz"--Filter (bei Bedarf anpassen)
dim ofn#,88+256---------------Struktur (Win2000/NT/XP) + Puffer
clear ofn#
long ofn#,0=88----------------Grösse Struktur für GetOpenFileName (76 für Win9x)
long ofn#,4=%hwnd-------------übergeordnetes Fenster
long ofn#,12=addr(Name$)------Filter/Typ
long ofn#,28=ofn#+88----------Beginn Puffer
long ofn#,32=255--------------Puffergrösse
long ofn#,44=addr(Pfad$)------Anfangspfad
long ofn#,48=addr(Titel$)-----Titel
long ofn#,52=$880024----------Flags
long ofn#,68=procaddr("OpenFileHook",4)
Result&=external("COMDLG32","GetOpenFileNameA",ofn#)
Result$=string$(ofn#,88)
casenot Result&:Result$=""
procaddr("OpenFileHook",-4)
dispose ofn#
return Result$
endproc---------------------------------------------------------------------------------
print LoadPicDialog("","Bitte Bild wählen","Bild")
waitkey
HTH Pascal |
|
|
| |
|
|
|
| Es funktioniert. |
|
|
| |
|
|
|
Georg Hovenbitzer | Der Pascal mal wieder
Es funktioniert klasse
Das Ding links nennt sich places bar und kann in der erweiterten Variante mit 1 in FlagsEx (letzter Parameter) aus- und mit 0 eingeschaltet werden. |
|
|
| Viele Grüsse, Georg Hovenbitzer(Windows XP Pro, XProfan 11.2, Profan2Cpp 1.6a) | 02.06.2006 ▲ |
|
|
|
|
Georg Hovenbitzer | Hallo zusammen,
mir fällt da im Code vom Pascal nochwas auf was ich nicht kannte.
Ist es erlaubt die Variablen für die Hook Proc in der Hauptproc zu deklarieren, so wie in dem Beispiel vom Pascal ? Unter Profan klappt dies sehr gut, nur es läßt sich per Profan2CPP nicht übersetzen. |
|
|
| Viele Grüsse, Georg Hovenbitzer(Windows XP Pro, XProfan 11.2, Profan2Cpp 1.6a) | 07.06.2006 ▲ |
|
|
|
|
Sebastian König | [quote:beab6f0e39]Ist es erlaubt die Variablen für die Hook Proc in der Hauptproc zu deklarieren, so wie in dem Beispiel vom Pascal ? Unter Profan klappt dies sehr gut, nur es läßt sich per Profan2CPP nicht übersetzen.[/quote:beab6f0e39] Ja, in (X)Profan klappt das (leider ). Mit Profan2Cpp sollte es funktionieren, wenn Du in den Übersetzungsoptionen Alle Variablen global deklarieren aktivierst.
MfG
Sebastian |
|
|
| |
|
|