Newsgroup: it.comp.lang.visual-basic
Titolo: CommonDialog: non è possibile specificare la posizione?????

MSDN riguardo al controllo CommonDialog dice espressamente:
Non è possibile specificare la posizione di visualizzazione di una finestra
di dialogo
Qualche sa come aggirare tale limite?
Grazie
Mosca

 ha scritto

Da:Domenico Statuto [CCRP] (
dsta...@tin.it
)
Soggetto:Re: Posizione iniziale delle CommonDialog
Newsgroups:it.comp.lang.visual-basic
Data:1999/01/20
Salve a tutti.
Ho notato solo ora che un mio messaggio di risposta inviato qualche giorno
fa non è arrivato. Lo riposto qui. E' possibilissimo stabilire la posizione
di partenza di un common dialog. Se si utilizza GetOpenFileName, la
procedura è quella suggerita da Roal (l'ho utilizzata anch'io, pressappoco,
per il ccrpFileDialogs), ed è possibile sia nel messaggio WM_INITDIALOG sia
nel messaggio WM_NOTIFY quando lParam è CDN_INIT.
Nel mio messaggio di qualche giorno fa invece davo anche il sistema per
stabilire la posizione iniziale del common dialog quando si usa il controllo
Microsoft, e lo riposto qui.
Fai un progetto con una form e sulla form un bottone e un common dialog.
chiama quest'ultimo cd.
Poi aggiung in modulo bas e metti il seguente codice mella sezione generale:
Option Explicit
'----- dichiarazione per centrare i common dialog
Type CWPSTRUCT
    lParam As Long
    WParam As Long
    Message As Long
    hwnd As Long
End Type
'Costanti per OnTop
Public Const HWND_TOPMOST = -1
Public Const HWND_NOTOPMOST = -2
Public Const SWP_NOMOVE = &H2
Public Const SWP_NOSIZE = &H1
Public Const SWP_NOACTIVATE = &H10
Public Const SWP_SHOWWINDOW = &H40
Public Const FLAGS = SWP_NOMOVE Or SWP_NOSIZE
Public Const WH_CALLWNDPROC& = 4
Public Const WH_CALLWNDPROCRET& = 12
Public Const WH_CBT& = 5
Public Const WH_DEBUG& = 9
Public Const WH_FOREGROUNDIDLE& = 11
Public Const WH_GETMESSAGE& = 3
Public Const WH_HARDWARE& = 8
Public Const WH_JOURNALPLAYBACK& = 1
Public Const WH_JOURNALRECORD& = 0
Public Const WH_KEYBOARD& = 2
Public Const WH_MAX& = 11
Public Const WH_MIN& = (-1)
Public Const WH_MOUSE& = 7
Public Const WH_MSGFILTER& = (-1)
Public Const WH_SHELL& = 10
Public Const WH_SYSMSGFILTER& = 6
Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA"
(ByVal idhook&, ByVal lpfn&, ByVal hmod&, ByVal dwthreadid&) As Long
Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As
Long
Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd
As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal
hWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, ByVal cx As Long,
ByVal cy As Long, ByVal wFlags As Long) As Long
'
' variabili per PosizionaDLG
Dim PosHook&, PosX&, PosY&
Function PosProc(ByVal nCode&, ByVal WParam&, Inf As CWPSTRUCT) As Long
Dim S As String * 7
    If Inf.Message <> 1 Then Exit Function
    GetClassName Inf.hwnd, S, 7
    If Left(S, 6) = "#32770" Then
        SetWindowPos Inf.hwnd, 0, PosX, PosY, 0, 0, 1
        UnhookWindowsHookEx PosHook
    End If
End Function
Sub PosizionaDLG(X&, Y&)
    PosX = X& ' 200 'Screen.Width / 2
    PosY = Y& '200 'Screen.Height / 2
    PosHook = SetWindowsHookEx(WH_CALLWNDPROC, AddressOf PosProc, 0,
App.ThreadID)
    Form1.cd.ShowOpen
End Sub
Sub OnTop(Controllo As Object, Stato As Boolean)
    If Stato = True Then
        Call SetWindowPos(Controllo.hwnd, HWND_TOPMOST, 0, 0, 0, 0, FLAGS)
    Else
        Call SetWindowPos(Controllo.hwnd, HWND_NOTOPMOST, 0, 0, 0, 0, FLAGS)
    End If
End Sub
Poi, dal click del bottone chiama la funzione:
    PosizionaDLG 100, 50
o i valori che preferisci.
In alternativa, usa un ocx che permette di settare la posizione iniziale,
oppure scrivi tu da capo un codice che implementa la funzione di hook per il
common dialog.
Il codice che ho postato non è mio. Purtroppo non posso nemmeno ringraziare
come dovuto l'autore, perché non me lo ricordo. Se qualcuno riconosce il
proprio codice me lo dica: sarò felice di ringraziarlo pubblicamente.
Saluti,
Domenico