¿Cómo funciona xna updateata en winform?
2. Procesamiento de botones.
1. El principio de agregar control WINFORM en formato XNA es muy simple:
1. Obtener FORM a través del identificador de formulario XNA:
xnafrm = CType (System). .Windows.Forms.Form.FromHandle(Me.Window.FromHandle), System.Windows.Forms.Form)
Sin embargo, muchas funciones no se pueden utilizar después de obtenerlo. Sin embargo, no hay problema en satisfacer nuestras necesidades:
2. Vuelva a especificar el padre del control:
pnl.Parent = xnafrm
pnl es un El padre. El contenedor del control de grupo se puede reasignar como el formulario xnafrm. Por supuesto, después de hacer esto, estará en la misma posición que estaba en su forma original. Tenga en cuenta que el controlador de mensajes sigue siendo el controlador de mensajes del formulario original.
En segundo lugar, manejar los eventos del teclado
Si su código no utiliza la entrada del teclado, puede ignorar completamente este párrafo. Dado que el contenedor principal de nuestro control ha cambiado, el contenedor principal original no nos enviará mensajes, mientras que si el nuevo formulario también fuera un WINFORM recibiríamos mensajes de él, pero desafortunadamente el formulario XNA no nos enviará estos mensajes. . Por supuesto, sería posible llamar a su controlador dentro del controlador de claves de XNA, pero eso parecería causar demasiado cruce de código, causando algunos inconvenientes.
1. Conéctese al procesamiento de mensajes y distinga el foco del control:
Implementa IMessageFilter
Application.AddMessageFilter(Me)
' Filtro de mensajes, solo maneja mensajes de liberación de clave
Función pública PreFilterMessage(ByRef m As System.Windows.Forms.Message) As Boolean Implements System.Windows.Forms.IMessageFilter.PreFilterMessage(ByRef m As System. Windows .Forms.Message) Como BooleanPreFilterMessage
Seleccione Caso m.Msg
Caso WM_KeyUP 'Si es un mensaje de promoción clave. Utilice cerraduras para manejarlo. Filtrando así información redundante. (Empiece a comer mensajes antes de enviarlos, pero no después de enviarlos). (Consulte la descripción del proceso de envío específico para obtener más detalles).
Devolver IsSendMsg
Caso WM_KEYDOWN 'Si es una pulsación de tecla, cómela.
Devolver Verdadero
Selección final
Devuelve Falso
Función final
'Identifica el texto en Todo cuadro de control para agregar manejo de eventos
Private Sub GetChildCtrl (ParentCtrl como control)
Para cada ctrlC como control en ParentCtrl.p> 'Si es un toolstrip, entonces enumere ToolStripTextBox en sus elementos secundarios y agregue controladores de eventos
Si TypeOf ctrlC es ToolStrip, entonces
Para cada elemento como ToolStripItem en CType( ctrlC, ToolStrip).AddHandler CType(item, ToolStripTextBox).KeyUp, AddressOf txtBox_LostFocus p >
'Función de procesamiento de claves unificada
AddHandler CType(item, ToolStripTextBox).KeyUp, AddressOf txtBox_KeyUp
End If
Siguiente
Fin si
'Recursivo
Si ctrlC.HasChildren Entonces GetChildCtrl(ctrlC)
Siguiente
Fin Sub
'Ingrese el elemento con foco. ToolStripTextBox
Private Sub txtBox_GotFocus(remitente como objeto, e como System.EventArgs)
FocusTextBox = CType(remitente, ToolStripTextBox)
End Sub
Private Sub txtBox_LostFocus(remitente como objeto, e como System.EventArgs)
'Cuando el foco está en el cuadro de texto, los caracteres de entrada son 0-9 o retroceso, etc.
If (FocusTextBox IsNot Nothing) AndAlso KeysList.Contains(e) Then
'Si hay un punto decimal en el cuadro de texto, salga
If ( e = Input.Keys.Decimal O si no e = Input.Keys.OemPeriod) Y también (FocusTextBox.Text.Contains("."))Entonces
FocusTextBox.Text.Replace(".") , String. Vacío)
End If
'Antes de enviar el mensaje, establezca la marca de envío para que el filtro de mensajes comience a tragar el mensaje,
'Después de que comience el envío , continúe bloqueando el mensaje. Cuando llega el mensaje, ya está en estado desbloqueado.
'De esta forma, se filtrará la información redundante. Es por eso que aquí se usa postmessage en lugar de sendmessage.
'Debido a que sendmessage es sincrónico, debe ejecutarse antes de que se ejecute la siguiente declaración, mientras que postmessage es asíncrono y la siguiente declaración se ejecutará antes de que llegue el mensaje.
IsSendMsg = True
PostMessage(FocusTextBox.Control.Handle, WM_KeyUP, New IntPtr(e), New IntPtr(MapVirtualKey(e, WM_KeyUP)))
IsSendMsg = False
End If
End Sub
El código anterior también explica por qué no se utiliza sendmessage.