CentreCommonDialog




Option Explicit
Private Sub Command1_Click()
PosizionaDLG 100, 50
End Sub

'Nel modulo bas metti invece il seguente codice:

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

Come centrare nel form una CommonDialog di Windows ?
Il problema si risolve in tre modi:

1. ti chiami le funzioni API da te, intercetti il messaggio
WM_NOTIFY e modifichi la posizione dell'hwnd che ti viene
passato dalla funzione di hook. Complicato.

2. Scegli un altro common dialog ocx che te lo permetta.
Ad esempio, se si tratta di common dialog per i file,
prova a vedere se ti piace quello gratuito che trovi al sito
ccrp (http://www.mvps.org/ccrp).

3. Se proprio ti ostini a usare il common dialog di VB, usa
questo codice (che non e' mio, ma non ricordo chi me lo ha dato
e quindi non posso citarlo. Si ritenga comunque ringraziato).
Fai un progetto con una form e un modulo BAS.
Sulla form metti il coomon dialog, un bottone, e metti il
seguente codice:










( centrecommondialog.html )- by Paolo Puglisi - Modifica del 17/12/2023