Привет всем!!!
Помогите решить 2 задачи:
1) поставить курсор мыши в верхний левый угол формы MDIChild
2) как наиболле эффективно задать ограничения на минимальный размер формы MDIChild
заранее спасибо!!!!
Re: Ограничения на минимальный размер формы MDIChild
Здравствуйте adoms, Вы писали:
A>2) как наиболле эффективно задать ограничения на минимальный размер формы MDIChild
Можно так:
Private Sub Form_Load()
'Save handle to the form.
gHW = Me.hwnd
'Begin subclassing.
Hook
End Sub
Private Sub Form_Unload(Cancel As Integer)
'Stop subclassing.
Unhook
End Sub
А в .bas файле нужно написать:
Private Const GWL_WNDPROC = -4
Private Const WM_GETMINMAXINFO = &H24
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
Global lpPrevWndProc As Long
Global gHW As Long
Private Declare Function DefWindowProc Lib"user32"Alias _
"DefWindowProcA" (ByVal hwnd As Long, ByVal wMsg As Long, _
ByVal wParam As Long, ByVal lParam As Long) As Long
Private 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
Private Declare Function SetWindowLong Lib"user32"Alias _
"SetWindowLongA" (ByVal hwnd As Long, _
ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Sub CopyMemoryToMinMaxInfo Lib"KERNEL32"Alias _
"RtlMoveMemory" (hpvDest As MINMAXINFO, ByVal hpvSource As Long, _
ByVal cbCopy As Long)
Private Declare Sub CopyMemoryFromMinMaxInfo Lib"KERNEL32"Alias _
"RtlMoveMemory" (ByVal hpvDest As Long, hpvSource As MINMAXINFO, _
ByVal cbCopy As Long)
Public Sub Hook()
'Start subclassing.
lpPrevWndProc = SetWindowLong(gHW, GWL_WNDPROC, _
AddressOf WindowProc)
End Sub
Public Sub Unhook()
Dim temp As Long'Cease subclassing.
temp = SetWindowLong(gHW, GWL_WNDPROC, lpPrevWndProc)
End Sub
Function WindowProc(ByVal hw As Long, ByVal uMsg As Long, _
ByVal wParam As Long, ByVal lParam As Long) As Long
Dim MinMax As MINMAXINFO
'Check for request for min/max window sizes.If uMsg = WM_GETMINMAXINFO Then
WindowProc = CallWindowProc(lpPrevWndProc, hw, uMsg, _
wParam, lParam)
'Retrieve default MinMax settings
CopyMemoryToMinMaxInfo MinMax, lParam, Len(MinMax)
'Specify new minimum size for window.
MinMax.ptMinTrackSize.x = 480
MinMax.ptMinTrackSize.y = 240
'Copy local structure back.
CopyMemoryFromMinMaxInfo lParam, MinMax, Len(MinMax)
WindowProc = 0
Else
WindowProc = CallWindowProc(lpPrevWndProc, hw, uMsg, _
wParam, lParam)
End If
End Function
Re[2]: Это можно сделать для каждой формы MDIChild
Здравствуйте algol, Вы писали:
A>А в .bas файле нужно написать:
A>Global lpPrevWndProc As Long
A>Global gHW As Long
A>Public Sub Hook()
A> 'Start subclassing.
A> lpPrevWndProc = SetWindowLong(gHW, GWL_WNDPROC, AddressOf WindowProc)
A>End Sub
A>Public Sub Unhook()
A> Dim temp As Long
A> 'Cease subclassing.
A> temp = SetWindowLong(gHW, GWL_WNDPROC, lpPrevWndProc)
A>End Sub
Я бы не сказал, что это удачное решение — размещение в модуле и наличие одного хука на все окна, но идею-то можно развить при необходимости. Нужно было бы только написАть, что можно размещать и в модуле формы. Тогда можно учитывать единицы измерения формы (но переводить в пикселы!) и иметь для разных форм разные ращзмеры.
A>Private Declare SubCopyMemoryToMinMaxInfoLib"KERNEL32"Alias _
A> "RtlMoveMemory" (hpvDest As MINMAXINFO, ByVal hpvSource As Long, ByVal cbCopy As Long)
A>Private Declare SubCopyMemoryFromMinMaxInfoLib"KERNEL32"Alias _
A> "RtlMoveMemory" (ByVal hpvDest As Long, hpvSource As MINMAXINFO, ByVal cbCopy As Long)
Здравствуйте Vi2, Вы писали:
Vi2>Я бы не сказал, что это удачное решение — размещение в модуле и наличие одного хука на все окна, но идею-то можно развить при необходимости. Нужно было бы только написАть, что можно размещать и в модуле формы.
Просто я выдернул из проекта, как оно было. Конечно нужно было написать, что это просто идея, и лучше найти более удачное решение для ее реализации.
Vi2>И где вы только берёте эти функции!
Не помню, откуда я это сдернул. Возможно, с planet-source-code — большой помойки исходников.
Здравствуйте Vi2, Вы писали:
Vi2>Нужно было бы только написАть, что можно размещать и в модуле формы. Тогда можно учитывать единицы измерения формы (но переводить в пикселы!) и иметь для разных форм разные размеры.
MSDN: AddressOf procedurename
The required procedurename specifies the procedure whose address is to be passed.
It must represent a procedure in a standard module in the project in which the call is made.
Да желание далеко от действительности. Но обойти можно, если иметь в ТАКОМ модуле несколько вариантов.