Mensaje enviado por "Marger" <marteaga@xerox.com.ni> el 17/05/2002
Pues con un commondialog no creo que puedas a menos que uses apis o algo por el estilo, yo lo que uso es un Activex Llamado Microsoft Dialog Automation Control (DLGOBJS.dll), en el Cd de Visual en la carpeta UNSUPPRT\DLGOBJ aparece la registración de dicho activex, es mucho más personal y podes programarlo
Saludes.
Marger
----- Original Message -----
From: Mariano Casero
To: vbe@gruposyahoo.com.ar ; visual_basic@eListas.net ; visualbasic-esp@yahoogroups.com
Sent: Friday, May 17, 2002 12:35 pm
Subject: (VB-ESP) Centrar Commondialog
Buenas lista, necesitaria si alguien me puede pasar codigo para centrar un CommonDialog en un form
Gracias.
Como parece que hay mucha gente de la Lista interesada en situar los cuadros
de diálogo (MsgBox, InpoutBox, CommonDialogs) en posiciones concretas he
creado una pequeña DLL con su archivo de ayuda (que recomiendo que leáis).
¡¡¡ Que la disfrutéis !!!
P.D. Los comentarios (si es que alguien la utiliza) no los mandéis a la
lista si no a nivel personal, para evitar el ruido (a veces ensordecedor)
Aquí mando para uso de la Lista un ejemplo de como colocar o centrar los Diálogos Comunes. Está basado en la idea de Luis Sanz de utilizar un formulario oculto para colocarlos. Lo mandé hace un tiempo a Jose Rubí para que lo publicase en su página, pero posiblemente no ha tenido ocasión por los problemas de tiempo que tenemos todos.
Este ejemplo no utiliza el control COMMONDIALOG de VB, sino código llamando a la dll de Windows. No utiliza formulario oculto, sino que se crea una ventana oculta mediante API. Además tiene la propiedad de hacer el Diálogo de tipo Modal para que no se pierda al cambiar de ventana. Pienso que así se logra una clase más compacta, además de librarnos de la carga del control de VB. El diálogo Color se pone como ejemplo de como utilizar el resto de los Diálogos.
Si se quiere documentación de como implementar el resto se encontrará la referencia en la cabecera del fuente de la Clase.
Aparte de la anterior, existe otro técnica más completa que centra y mueve exactamente todos los cuadros de diálogo, incluidos Find-Replace y los modelos de tipo no Explorer de Open-Save. Se realiza mediante los campos lpfnHook de las estructuras-UDT, que es como se hace en los programas en C++.
Saludos a todos
Santiago Jimeno (Madrid)
SJIMENOH28@smail1.ocenf.org
Mensaje enviado por Luis Raúl Estrada Llorca <llorca@uneta.com.cu>
Prueba con esto
Option Explicit
' rutina que le permite centrar los cuadros de diálogo en el centro del formulario que Vd. tiene Abierto
'
'
' Estas rutinas tiene que ir en el formulario, al arrancar o cuando Vd. quiera
'
hHook = SetWindowsHookEx(WH_CALLWNDPROC, AddressOf AppHook, App.hInstance, App.ThreadID)
CommonDialog1.ShowOpen
If hHook Then UnhookWindowsHookEx hHook
'
' Rutinas para capturar los Cuadros de diálogos y centrarlos
'
Type CWPSTRUCT
lParam As Long
wParam As Long
message As Long
hwnd As Long
End Type
Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal ncode As Long, ByVal wParam As Long, lParam As Any) As Long
Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (hpvDest As Any, hpvSource As Any, ByVal cbCopy As Long)
Declare Function GetWindowRect Lib "user32" (ByVal hwnd As Long, lpRect As RECT) As Long
Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong 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
Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As Long
Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long
Public Const WH_CALLWNDPROC = 4
Public Const WM_INITDIALOG = &H110
Public Const GWL_WNDPROC = (-4)
Public Const SWP_NOSIZE = &H1
Public Const SWP_NOACTIVATE = &H10
Public lWndProc As Long
Public hHook As Long, lHookWndProc As Long
Public Function AppHook(ByVal idHook As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Dim CWP As CWPSTRUCT
CopyMemory CWP, ByVal lParam, Len(CWP)
Select Case CWP.message
Case WM_INITDIALOG
lWndProc = SetWindowLong(CWP.hwnd, GWL_WNDPROC, AddressOf Dlg_WndProc)
AppHook = CallNextHookEx(hHook, idHook, wParam, ByVal lParam)
UnhookWindowsHookEx hHook
hHook = 0
Exit Function
End Select
AppHook = CallNextHookEx(hHook, idHook, wParam, ByVal lParam)
End Function
Public Function Dlg_WndProc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Select Case Msg
Case WM_INITDIALOG
Dim R As RECT, x As Long, y As Long
GetWindowRect hwnd, R
x = (Form1.Left \ Screen.TwipsPerPixelX + (Form1.Width \ Screen.TwipsPerPixelX - (R.Right - R.Left)) \ 2)
y = (Form1.Top \ Screen.TwipsPerPixelY + (Form1.Height \ Screen.TwipsPerPixelY - (R.Bottom - R.Top)) \ 2)
SetWindowPos hwnd, 0, x, y, 0, 0, SWP_NOSIZE Or SWP_NOACTIVATE
SetWindowLong hwnd, GWL_WNDPROC, lWndProc
End Select
Dlg_WndProc = CallWindowProc(lWndProc, hwnd, Msg, wParam, lParam)
End Function