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