Pues eso, no es nada del otro mundo, pero en un programilla que estoy haciendo me dio el punto de hacer que la entrada del usuario fuese al estilo de una terminal de esas de fósforo verde y aquí está el resultado.
Entre otras cosas interesantes, puedes encontrar aquí una revisión de hacer scroll en controles, ya que se usa un picture que hace de contenedor virtual del picture que se usa para "ennegrecer" la pantalla y donde se imprime lo que el usuario ha ido tecleando.
La entrada del usuario se hace en un TextBox normal y corriente, intenté hacerlo directamente en el Picture, pero era un trabajo extra que me recordaba a los tiempos de MS-DOS y la verdad es que no es necesario tomarse tanto trabajo cuando el textbox funciona medio bien.
Aunque en el ejemplo que adjunto no lo hago, todo lo que se muestre en "la pantalla del terminal" se puede almacenar en un listBox con idea de poder guardar el contenido en el disco, el código necesario para poder hacer eso está en el procedimiento ImprimirDOS, es un simple List1.Additem, pero puede ser interesante usarlo, así se podrá usar lo que se haya tecleado.El programilla ese en el que he usado esto es una versión del programa Eliza para Visual Basic. No sé si sabes de que va esto de Eliza, pero es una especie de psiquiatra "electrónico", con el que se puede conversar y esas cosas... cuando lo tenga más "acabado" lo pondré por aquí...
Este es el código de esta utilidad y una imagen de cómo quedaría:
La pantalla en funcionamientoEl código.
Sólo se necesita un Form y este es el código necesario para hacerlo funcionar:
'------------------------------------------------------------------ 'Prueba de una terminal de texto ( 8/Jun/98) ' '©Guillermo 'guille' Som, 1998 '------------------------------------------------------------------ Option Explicit Dim difSW As Long Dim difSH As Long 'posiciones dentro del picDos Private picX As Long Private picY As Long Private picTW As Long Private picTH As Long Private Sub cmdCls_Click() With picDOS .Cls .Top = 0 .Left = 0 End With 'Borrar el contenido del ListBox 'Si se quisiera guardar el contenido, aquí sería un buen sitio 'para hacerlo, antes de borrarlo, por supuesto. 'List1.Clear picX = 0 picY = -picTH VScroll1.Value = 0 HScroll1.Value = 0 ImprimirDOS "" Text1.SetFocus End Sub Private Sub cmdSalir_Click() Unload Me End End Sub Private Sub Form_Load() 'Inicialización picX = 0 picY = 0 'El contenedor visual debe estar contenido en el virtual Set picDOS.Container = picScroll1 'El text1 contenido en el contenedor visual Set Text1.Container = picDOS 'Diferencia entre el ScaleWidth con el Width difSW = ScaleWidth - Width 'Diferencia entre el ScaleHeight con el Height difSH = ScaleHeight - Height With HScroll1 .Left = 0 .SmallChange = 120 .LargeChange = 360 End With With VScroll1 .Top = 0 .SmallChange = 120 .LargeChange = 360 End With With Text1 .Left = 0 .Text = "> " .SelStart = 2 .TabIndex = 0 End With With picDOS picTH = .TextHeight("H") picTW = .TextWidth("W") .CurrentX = 0 .CurrentY = 0 .Height = picTH * 20 .Width = picTW * 200 picScroll1.Height = .Height End With ImprimirDOS "Esto es un ejemplo de una simulación de terminal de caracteres", True End Sub Private Sub Form_Resize() On Local Error Resume Next If WindowState <> vbMinimized Then 'posicionar los commands With cmdSalir .Top = ScaleHeight - 540 .Left = ScaleWidth - 1335 End With cmdCls.Top = ScaleHeight - 540 If ScaleWidth - VScroll1.Width > 0 And ScaleHeight - HScroll1.Height > 0 Then picScroll1.Move 0, 0, ScaleWidth - VScroll1.Width, _ ScaleHeight - HScroll1.Height - (cmdSalir.Height + 240) If picDOS.Height < picScroll1.Height Then picDOS.Height = picScroll1.Height End If If picDOS.Width < picScroll1.Width Then picDOS.Width = picScroll1.Width End If picDOS.Move 0, 0 End If HScroll1.Top = picScroll1.Height HScroll1.Width = picScroll1.Width ' VScroll1.Left = picScroll1.Width VScroll1.Height = picScroll1.Height ' HScroll1.Max = picDOS.Width - picScroll1.Width VScroll1.Max = picDOS.Height - picScroll1.Height ' VScroll1.Enabled = (picScroll1.Height < picDOS.Height) HScroll1.Enabled = (picScroll1.Width < picDOS.Width) 'Ajustar el ancho del Text1 Text1.Width = picScroll1.ScaleWidth End If Err = 0 End Sub Private Sub picDOS_Click() 'El TextBox siempre debe tener el foco Text1.SetFocus End Sub Private Sub HScroll1_Change() picDOS.Left = -HScroll1.Value End Sub Private Sub HScroll1_GotFocus() Text1.SetFocus End Sub Private Sub VScroll1_Change() picDOS.Top = -VScroll1.Value End Sub Private Sub VScroll1_GotFocus() Text1.SetFocus End Sub Private Sub Form_Unload(Cancel As Integer) Set Form1 = Nothing End Sub Private Sub ImprimirDOS(ByVal sText As String, Optional ByVal NuevaLinea As Boolean = True) 'Imprimir el texto de entrada en el picDos 'Si se NuevaLinea tiene un valor True (valor por defecto) 'lo siguiente que se imprima se hará en una nueva línea ' With picDOS .CurrentX = picX .CurrentY = picY picDOS.Print sText; If NuevaLinea Then .CurrentX = 0 .CurrentY = .CurrentY + picTH 'Si se quiere guardar el contenido de todo lo escrito, 'hacerlo al cambiar de línea. 'Se puede usar un ListBox oculto para contener el texto 'List1.AddItem sText Text1 = "> " Text1.SelStart = 2 End If picX = .CurrentX picY = .CurrentY Text1.Top = .CurrentY If Text1.Top + Text1.Height > .Height Then .Height = .Height + Text1.Height .Top = .Top - Text1.Height picScroll1.Height = .Height - cmdSalir.Height - difSH Form_Resize VScroll1.Value = VScroll1.Max End If End With End Sub Private Sub Text1_KeyPress(KeyAscii As Integer) If KeyAscii = 13 Then KeyAscii = 0 ImprimirDOS Text1 End If End SubSi quieres bajarte los listados, pulsa este link. (TerminalDOS.zip 3.46 KB)