DarkSigma Conociendo Foroz


Registrado: 23 Sep 2004
Mensajes: 24
|
Publicado: Vie Sep 24, 2004 3:31 am Título del mensaje: Cambiar el texto de los botones en un MSGBox |
|
|
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 ::. |
|