Visual Basic Foro
Programación => Visual Basic 6 => Mensaje iniciado por: xmbeat en Abril 05, 2010, 09:49:30 pm
-
veran, tengo un programa que requiero que se pueda redimensionar pero que llegue hasta cierto tamaño.
lo primero que se me ocurrio es usar una Rutina (Subclassing ) para hacerlo, ya que si lo hacia desde el evento Resize del Form, se mira como Parpadeo, mi intencion con la rutina seria detectar el evento WM_SIZING (no recuerdo si es este mensaje, escribi esto en un cyber y no me traje el code), para intercerptarlo y si cumple los requrimientos, entoces se llame a la funcion original, si no entonces no se llama.
el caso es que hize una estructura de 2 elementos Integer (total 4 bytes, serian width y height), y usando copymemory las pasaba. todo perfecto (corroboré que si estaba recibiendo los valores mi estructura). pero aun si no le paso el mensaje se sigue redimensionando. Ayuda!!! (mañana pondre el code para que se entienda mejor)
-
Cobein hizo algo asi... Buscalo en su web... o en recursosvisualbasic.
-
Cobein hizo algo asi... Buscalo en su web... o en recursosvisualbasic.
No es necesario dar tantas vueltas, es muy sencillo. Tenes que interceptar el mensaje WM_GETMINMAXINFO y editar la estructura q te llega por lParam.
Private Type POINTAPI
x As Long
y As Long
End Type
Private Type MINMAXINFO
ptReserved As POINTAPI
ptMaxSize As POINTAPI
ptMaxPosition As POINTAPI
ptMinTrackSize As POINTAPI
ptMaxTrackSize As POINTAPI
End Type
Private Const WM_GETMINMAXINFO As Long = &H24
[...]
Private Sub WndProc(ByVal bBefore As Boolean, _
ByRef bHandled As Boolean, _
ByRef lReturn As Long, _
ByVal lng_hWnd As Long, _
ByVal uMsg As Long, _
ByVal wParam As Long, _
ByVal lParam As Long, _
ByRef lParamUser As Long)
If uMsg = WM_GETMINMAXINFO Then
Dim lngX As Long
Dim lngY As Long
lngX = 1020
lngY = 700
RtlMoveMemory ByVal (lParam + 24), ByVal VarPtr(lngX), 4 'X
RtlMoveMemory ByVal (lParam + 28), ByVal VarPtr(lngY), 4 'Y
bHandled = True
End If
En ese codigo se omite pasar el puntero a la estructura, y vice versa, ahi es mas sencillo, directamente le escribo en la estructura origen.
Saludos
-
Cobein hizo algo asi... Buscalo en su web... o en recursosvisualbasic.
Entonces arreglo... ::)
El coco, ya lo hiso...! :D
-
gracias, pero aun no consigo hacerlo jalar (no se donde y como modificar el code), este es el code que tengo en un modulo. si me hacer el favor podrias corregirlo.
Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen As Long)
Public PrevLong As Long
Private Type WH
Width As Integer
Height As Integer
End Type
Public Function WindowProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Dim wCoord As WH
WindowProc = CallWindowProc(PrevLong, hwnd, uMsg, wParam, lParam)
If uMsg = &H5 Then
Call CopyMemory(wCoord, lParam, Len(wCoord))
Debug.Print wCoord.Width & " " & wCoord.Height
If wCoord.Height < 400 Then wCoord.Height = 400
If wCoord.Width < 600 Then wCoord.Width = 600
Call CopyMemory(lParam, wCoord, Len(wCoord))
Form1.Form_ResizeMax
End If
End Function
-
bueno encontre esto:
http://www.recursosvisualbasic.com.ar/htm/listado-api/139-hook-size-window.htm
-
...
Ni siquiera intentaste probar el codigo que te deje?, para eso la proxima ni respondo!
-
...
Ni siquiera intentaste probar el codigo que te deje?, para eso la proxima ni respondo!
trate de usarlo pero no sabia como meterlo al proyecto
-
...
Ni siquiera intentaste probar el codigo que te deje?, para eso la proxima ni respondo!
Jajaja... Che coco, tranquilo... Como el, hay muchos... Solo hay que orientarlo...! ::)