INFORMATICA Y OCIO

Foros de informática
  Inicio    Normas    Buscar   Miembros   Clanes   Regístrese   Perfil   Conéctese para revisar sus mensajes   Conectarse 
[informatica] + [videos graciosos] + [ultimos mensajes] + [top usuarios] + [contacto]
Cambiar el texto de los botones en un MSGBox

 
Publicar Nuevo Tema   Responder al Tema    Índice del Foro Foroz comunity :: Programación
Ver tema anterior :: Ver siguiente tema  
Autor Mensaje
DarkSigma
Conociendo Foroz
Conociendo Foroz


Registrado: 23 Sep 2004
Mensajes: 24

MensajePublicado: Vie Sep 24, 2004 3:31 am    Título del mensaje: Cambiar el texto de los botones en un MSGBox Responder citando
Bueno el Asunto lo dice todo...

Código:

Con el ejemplo que te muestro a continuación, podrás cambiar el texto que se muestra en los botones de un cuadro de diálogo, en este caso de un MsgBox.
En este ejemplo, se cambia el texto YES/SI por "Alta" y el NO por "Modificación", Este código es una "adaptación" de un ejemplo en C

Este es el código en C:

LRESULT CALLBACK CallWndRetProc(
    int nCode, WPARAM wParam, LPARAM lParam)
{
LRESULT lr = CallNextHookEx(hook, nCode, wParam, lParam);
if (nCode < 0) return lr;

CWPRETSTRUCT s = *((CWPRETSTRUCT *)lParam);
if (s.message == WM_INITDIALOG)
{
SetDlgItemText(s.hwnd, IDYES, "Alta");
SetDlgItemText(s.hwnd, IDNO, "Modificación");
}
return lr;
}

...

HHOOK hook = SetWindowsHookEx(
            WH_CALLWNDPROCRET,
            CallWndRetProc,
            NULL,
            GetCurrentThreadId());

if (hook)
{
    MessageBox(hwnd, "Texto del mensaje", "Título", MB_YESNO);
UnhookWindowsHookEx(hook);
}


Para crear el proyecto, añade un formulario, inserta un botón y una etiqueta. Inserta este código en el formulario:


'------------------------------------------------------------------------------
' Subclasificar un MsgBox para cambiar el texto de los botones      (13/Sep/01)
'
' Versión en Visual Basic de un ejemplo en C enviado a las news por:
' "Hernán"  el 13/Sep/2001
'
' ©Guillermo 'guille' Som, 2001
'------------------------------------------------------------------------------
Option Explicit

Private Sub Command1_Click()
    Dim hInst As Long
    Dim Thread As Long
    Dim i As Long

    ' Crear el hook para subclasificar el MsgBox
    hInst = GetWindowLong(Me.hWnd, GWL_HINSTANCE)
    Thread = GetCurrentThreadId()
    hHook = SetWindowsHookEx(WH_CALLWNDPROCRET, AddressOf CallWndRetProc, hInst, Thread)

    ' Mostrar el MsgBox
    i = MsgBox("Pulsa en Alta o Modificación.", vbYesNo)
    ' Alta será vbYes, Modificación será vbNo
    If i = vbYes Then
        Label1 = "Has pulsado en Alta"
    ElseIf i = vbNo Then
        Label1 = "Has pulsado en Modificación"
    End If
End Sub


Añade también un módulo BAS y añade el siguiente código:


'------------------------------------------------------------------------------
' MSubclassMsgBox                                                   (14/Sep/01)
' Módulo para subclasificar un MsgBox y cambiar el texto de los botones
'
' Versión en Visual Basic de un ejemplo en C enviado a las news por:
' "Hernán"  el 13/Sep/2001
'
' ©Guillermo 'guille' Som, 2001
'------------------------------------------------------------------------------
Option Explicit
'
Public hHook As Long
Public Const WH_CALLWNDPROCRET = 12
Public Const GWL_HINSTANCE = (-6)

Private Type tagCWPRETSTRUCT
    lResult As Long
    lParam As Long
    wParam As Long
    message As Long
    hWnd As Long
End Type

Private Const WM_INITDIALOG = &H110

Public Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" _
    (ByVal hWnd As Long, ByVal nIndex As Long) As Long
Public Declare Function GetCurrentThreadId Lib "kernel32" () As Long
Public 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

Private Declare Function UnhookWindowsHookEx Lib "user32" _
    (ByVal hHook As Long) As Long
Private Declare Function CallNextHookEx Lib "user32" _
    (ByVal hHook As Long, ByVal nCode As Long, _
    ByVal wParam As Long, lParam As Any) As Long

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
    (Destination As Any, Source As Any, ByVal Length As Long)

' Dialog Box Command IDs
Private Const IDOK = 1
Private Const IDCANCEL = 2
Private Const IDABORT = 3
Private Const IDRETRY = 4
Private Const IDIGNORE = 5
Private Const IDYES = 6
Private Const IDNO = 7

Private Declare Function SetDlgItemText Lib "user32" Alias "SetDlgItemTextA" _
    (ByVal hDlg As Long, ByVal nIDDlgItem As Long, _
    ByVal lpString As String) As Long

Public Function CallWndRetProc(ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    Dim lr As Long
    Dim s As tagCWPRETSTRUCT
    '
    lr = CallNextHookEx(hHook, nCode, wParam, lParam)
    If (nCode < 0) Then
        CallWndRetProc = lr
        Exit Function
    End If
    '
    ' Convertir lParam en una estructura
    Call CopyMemory(s, ByVal lParam, Len(s))
    '
    If (s.message = WM_INITDIALOG) Then
        ' Modificar el texto de los botones
        Call SetDlgItemText(s.hWnd, IDYES, "Alta")
        Call SetDlgItemText(s.hWnd, IDNO, "Modificación")
        ' Release the CBT hook
        UnhookWindowsHookEx hHook
        lr = 0&
    End If

    CallWndRetProc = lr
End Function

Precauciones:
No interrumpas el programa mientras se muestra el cuadro de diálogo, (aunque en teoría no debería pasar nada si lo hicieras), pero sobre todo "procura" que el Visual Basic no se pare dentro de la función CallWndRetProc, ya que se colgaría dando error de protección o algo por el estilo.
Tampoco añadas ningún Debug.Print ni nada que pudiera hacer que se detenga el VB.
Una vez compilado estas precauciones no son aplicables.

_________________
.:: DarkSigma ::.

[Wenn Sie Hier Hineingehen... Sie Beloren Den Himmel...]

.:: SigmaSystem ::.
Volver arriba
Ver perfil del usuario Enviar mensaje privado
Mostrar mensajes anteriores:   
Publicar Nuevo Tema   Responder al Tema    Índice del Foro Foroz comunity :: Programación Todas las horas están en GMT + 1 Hora
Página 1 de 1
Saltar a:  
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas
 
Articulos relacionados
En Webmasters >> como seleccionar todo el texto de un ...
En General >> Cambiar de tipo un archivo
En Música/General >> Cambiar de tipo un archivo
En Hardware >> ¿se puede cambiar con sofware puerto ...
En General >> cambiar de idioma FLYING F698
 

 
Foroz comunity Tema RSS 




by phpBB  
informatica Videos graciosos webmasters theme by Scott Stubblefield Top foroz