Resumen Centrar CommonDialog   (4 mensajes )

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)

Download pdialog.zip  

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

Download posichide.zip  

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



Resumen Resumen

Visual Basic Página de Visual Basic

Página principal Página principal

www.jrubi.com