TRUCO 1: ¿Cómo aumentar el rendimiento del control ListView? (Aplicable a las versiones 4.0/32 bits y 5.0).
El ListView es un control perteneciente a los "Custom Controls" de Windows 95 que puede ser usado en aplicaciones de 32-bit. Aunque es un control muy útil, las inserciones de nuevos elementos es lenta y pueden apreciarse problemas de rendimiento.
Un solución a este problema es deshabilitar los repintados del ListView mientras se introducen nuevos elementos. Esto puede ser realizado enviando el mensaje WM_SETREDRAW al control. una vez que hayan sido añadidos todos los elementos, se puede enviar otro mensaje WM_SETREDRAW para permitir los repintados.
A continuación se muestra un ejemplo de código: Private Declare Function SendMessage Lib "user32" Alias _
"SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, _
ByVal wParam As Long, lParam As Long) As Long
Sub AñadirItems()
Dim itm As ListItem
Dim i As Long
'Deshabilitar los repintados del listview
Call SendMessage(ListView1.hwnd, WM_SETREDRAW, 0, 0)
ListView1.ListItems.Clear
For i = 1 To 100
Set itm = ListView1.ListItems.Add(, , "Elemento" & _
CStr(i))
itm.SubItems(1) = "sub1." & CStr(i)
itm.SubItems(2) = "sub2." & CStr(i)
Next
'Habilitar los repintados
Call SendMessage(ListView1.hwnd, WM_SETREDRAW, 1, 0)
End Sub
TRUCO 2: Visualización de videos AVI con MCI (Aplicable a las versiones 3.0 y 4.0/16 bits).
Desde las aplicaciones de Visual Basic se pueden visualizar vídeos AVI haciendo uso del MCI (Multimedia Control Interface). Sólo es necesario enviar un par de órdenes MCI como en el siguiente ejemplo para VB 16 bits: Private Declare Function mciSendString Lib "mmsystem" _
(ByVal strCommand As String, ByVal strReturn As String, _
ByVal iReturnLength As Integer, ByVal hCallback As Integer)
Sub ReproducirAVI()
Dim Resultado as Long
Resultado = mciSendString("Open MiAvi.avi type AVIVideo _
Alias Video", "",0,0)
Resultado = mciSendString("Play Video FullScreen","",0,0)
Resultado = mciSendString("Close Video","",0,0)
End Sub
TRUCO 3: ¿Cómo saber si un ejecutable es de Windows o MS-DOS? (Aplicable a las versiones 3.0, 4.0 y 5.0).
Para saber si un ejecutable es de MS-DOS o Windows, se debe examinar el byte número 25 del fichero EXE. Si contiene el valor 40h es un ejecutable de Windows: Function WinExe (ByVal Exe As String) As Integer
Dim fh As Integer
Dim t As String * 1
fh = FreeFile
Open Exe For Binary As #fh
Get fh, 25, t
Close #fh
WinExe = (Asc(t) = &H40&)
End Function
TRUCO 4: ¿Cómo reproducir un CD de Audio? (Aplicable a las versiones 3.0 y 4.0/16 bits).
Desde Visual Basic se puede reproducir un CD de audio mediante el uso de MCI, como se muestra en el siguiente ejemplo para VB 16 bits:
'Introduzca en un formulario un MMControl (Multimedia Control)
Declare Function mciSendString& Lib "MMSYSTEM" (ByVal _
lpstrCommand$, ByVal lpstrReturnStr As Any, ByVal _
wReturnLen%, ByVal hCallBack%)
Sub cmdPlay_Click ()
Dim Resultado As Long
Dim PistaActual As Integer
'Apertura del dispositivo
Resultado = mciSendString("open cdaudio alias cd wait", _
0&, 0, 0)
'Establecer formato de tiempo en pistas
Resultado = mciSendString("set cd time format tmsf", 0&, _
0, 0)
'Comenzar desde el principio
Resultado = mciSendString("play cd", 0&, 0, 0)
'O reproducir por ejemplo la pista 4
PistaActual = 4
resultado = mciSendString("play cd from" & Str(PistaActual)_
, 0&, 0, 0)
End Sub
Sub cmdStop_Click ()
Dim lRet As Long
'Parar reproducción
lRet = mciSendString("stop cd wait", 0&, 0, 0)
DoEvents 'Procesar evento
'Cerrar dispositivo
lRet = mciSendString("close cd", 0&, 0, 0)
End Sub
TRUCO 5: ¿Cómo obtener una lista de los procesos en memoria en Windows95? (Aplicable a las versiones 4.0/32 bits y 5.0).
En un aplicación de Visual Basic de 32 bits se puede obtener la lista de los procesos que se están ejecutando en un momento determinado en Windows 95. Para ello, es necesario utilizar una serie de funciones del KERNEL32 llamadas ProcessFirst y ProcessNext.
Para ver un ejemplo cree un nuevo projecto y en un formulario añada un listbox (List1) y un command button (Command1). Introduzca el siguiente código en un modulo .BAS: Option Explicit
Public Const TH32CS_SNAPPROCESS As Long = 2&
Public Const MAX_PATH As Integer = 260
Public Type PROCESSENTRY32
dwSize As Long
cntUsage As Long
th32ProcessID As Long
th32DefaultHeapID As Long
th32ModuleID As Long
cntThreads As Long
th32ParentProcessID As Long
pcPriClassBase As Long
dwFlags As Long
szExeFile As String * MAX_PATH
End Type
Public Declare Function CreateToolhelpSnapshot Lib "Kernel32" _
Alias "CreateToolhelp32Snapshot" (ByVal lFlags As Long, _
ByVal lProcessID As Long) As Long
Public Declare Function ProcessFirst Lib "Kernel32" Alias _
"Process32First" (ByVal hSnapShot As Long, uProcess As _
PROCESSENTRY32) As Long
Public Declare Function ProcessNext Lib "Kernel32" Alias _
"Process32Next" (ByVal hSnapShot As Long, uProcess As _
PROCESSENTRY32) As Long
Public Declare Sub CloseHandle Lib "Kernel32" _
(ByVal hPass As Long)
Añada el siguiente código en el formulario: Private Sub Command1_Click()
Dim hSnapShot As Long
Dim uProceso As PROCESSENTRY32
Dim r As Long
hSnapShot = CreateToolhelpSnapshot(TH32CS_SNAPPROCESS, 0&)
If hSnapShot = 0 Then Exit Sub
uProceso.dwSize = Len(uProceso)
r = ProcessFirst(hSnapShot, uProceso)
Do While r
List1.AddItem uProceso.szExeFile
r = ProcessNext(hSnapShot, uProceso)
Loop
Call CloseHandle(hSnapShot)
End Sub
|