Newsgroup: it.comp.lang.visual-basic
Titolo: Aiuto, come centro una CommonDialog!!!!!!!

Non so se ho un vuoto di memoria, ma in questo momento non trovo il modo di
centrare la common dialog tipo OpenFile all'interno del mio form MDI.
Ho cercato la proprietà StartUpPosition ma non c'è e siccome non conosco le
dimensioni non posso centrarla neanche a runtime.
Grazie a tutti
Andrea

 wrote


dimensioni non posso centrarla neanche a runtime.
Ciao,
molto tempo fa mi ero salvato il seguente msg che spero ti possa essere utile.
Il codice non lo ho mai provato. Fammi cmq sapere se funziona bene.
---
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.
teddy...@hotmail.com
ICQ 7044062
Como - Italy