MiLoo MPVSplit Gadget In Dll [My SplitterGadget]
Posted: Sun Feb 06, 2011 4:22 am
in dll [MPView.dll]
use dll
Code: Select all
;==================================
;[文件名称]: MPV_Splitter5.pb
;[文件版本]: 0,0,0,2
;[函数前辍]: MPV_
;[DLL 名称]: MPView.dll
;[补充说明]: 迷路解析器V0.10版控件源代码之界面测试
;[程序名称]: MiLooParser迷路解析器[内测版]
;[开发语言]: PureBasic4.20
;[测试平台]: WinXP(SP3)
;[开 发 者]: 迷路仟[QQ:714095563]
;[修订时间]: 2011.02.05
;==================================
;- XIncludeFile "MPV_Splitter5.pb"
;- 最后一次大整理时间:2011.02.05
;-
;- 定义部分 -------------
#MPV_Split_BackColor = $8C928B
; [分割条]信息结构
Structure MPVSplitInfo
gID.l ; 控件ID
Handle.l ; 控件句柄
mStart.l ; 鼠标相对开始位置,用于移动分割条
mEnd.l ; 鼠标相对结束位置,用于移动分割条
Cursor.l ; 当鼠标到达分割条上方时的光标类型
DownColor.l ; 分割条被按下时的颜色
UpColor.l ; 分割条正常状态下的颜色
IsDown.l ; 分割条是否被按下
Scale.f ; 分割条所处的位置比例值
EndStructure
; [资源管理器]信息结构 - 左边控件
Structure MPVTreeInfo
gID.l
Handle.l
cID.l[3]
EndStructure
; [文件列表框]信息结构 - 右下角控件
Structure MPVListInfo
gID.l
Handle.l
cID.l[3]
EndStructure
; [预览区]信息结构 - 右上角控件
Structure MPVViewInfo
gID.l
Handle.l
cID.l[3]
EndStructure
; 整个控件组合的相关信息结构
Structure MPVGadgetInfo
hWnd.l ; 窗体句柄
wHook.l ; HOOK句柄
gHook.l ; HOOK句柄
wState.l ; 窗体状态[0=正常;1=最小化;2=最大化]
CurW.l ; 当前控件组的有效宽度
CurH.l ; 当前控件组的有效高度
IsReSize.l ; 窗体是否被改变过大小
SplitWidth.l ; 分割条的厚度
RdbArea.Rect ; 控件组与窗体的相对间隔
LockArea.Rect ; 分条割活动域与窗体的相对间隔
SplitWE.MPVSplitInfo ; 水平方向分割条控件
SplitNS.MPVSplitInfo ; 垂直方向分割条控件
VirTree.MPVTreeInfo ; [资源管理器] - 左边控件
VirList.MPVListInfo ; [文件列表框] - 右下角控件
VirView.MPVViewInfo ; [预览区] - 右上角控件
EndStructure
;-
;- 引用部分 ------------
Declare MPV_wHooK_WndProc(hWnd, uMsg, wParam, lParam)
Declare MPV_gHooK_WndProc(hWnd, uMsg, wParam, lParam)
Declare MPV_gHooK_MouseUp()
Declare MPV_wHooK_NcHitTest(IsReSize=#False)
;-
;- DLL必要部分 ------------
; 加载[MPView.dll]时的初始化
ProcedureDLL AttachProcess(Instance)
Global _MPVArea.MPVGadgetInfo
EndProcedure
; 释放[MPView.dll]初始化的变量
ProcedureDLL DetachProcess(Instance)
_MPVArea\wHooK = 0
_MPVArea\gHooK = 0
FreeGadget(_MPVArea\SplitWE\gID)
FreeGadget(_MPVArea\SplitNS\gID)
FreeGadget(_MPVArea\VirTree\gID)
FreeGadget(_MPVArea\VirList\gID)
FreeGadget(_MPVArea\VirView\gID)
DestroyWindow_(_MPVArea\hWnd)
EndProcedure
;-
;- 函数部分 -------------
; 设置控件组状态
Procedure MPV_SetAreaGadgetState()
With _MPVArea
SetGadgetColor(\VirTree\gID ,#PB_Gadget_BackColor,$E0FDDA)
SetGadgetColor(\VirList\gID, #PB_Gadget_BackColor,$DBDFF7)
SetGadgetColor(\VirView\gID, #PB_Gadget_BackColor,$D9F9F9)
EndWith
EndProcedure
; 调整控件组的大小
Procedure MPV_ResizeAreaGadget(StateWE=-1,StateNS=-1)
With _MPVArea
; 为默认的分割条设置数值
If StateWE=-1 : StateWE=\SplitWE\Scale*\CurW : Else : \SplitWE\Scale=StateWE/\CurW : EndIf
If StateNS=-1: StateNS=\SplitNS\Scale*\CurH : Else : \SplitNS\Scale=StateNS/\CurH : EndIf
; 界定一个最小的分配值,用于窗体宽度或高度足够小的时候显示控件组
If StateWE < \LockArea\Left : StateWE = \LockArea\Left : EndIf
If StateNS < \LockArea\Top : StateNS = \LockArea\Top : EndIf
; 界面宽度不足时
If StateWE > \CurW - \RdbArea\Right
Width = \CurW-\RdbArea\Right-\RdbArea\Left
Height = \CurH-\RdbArea\Top-\RdbArea\Bottom
ResizeGadget(\SplitWE\gID, 0,0,0,0)
ResizeGadget(\VirTree\gID,\RdbArea\Left,\RdbArea\Top,Width , Height)
ResizeGadget(\SplitNS\gID, 0,0,0,0)
ResizeGadget(\VirView\gID, 0,0,0,0)
ResizeGadget(\VirList\gID, 0,0,0,0)
; 界面高度不足时
ElseIf StateNS > \CurH - \RdbArea\Bottom
Height = \CurH-\RdbArea\Top-\RdbArea\Bottom
ResizeGadget(\SplitWE\gID, StateWE, \RdbArea\Top, \SplitWidth, Height)
ResizeGadget(\VirTree\gID,\RdbArea\Left,\RdbArea\Top, StateWE-\RdbArea\Left, Height)
X = StateWE+\SplitWidth
Width = \CurW-X- \RdbArea\Right
Height = \CurH-\RdbArea\Top-\RdbArea\Bottom
ResizeGadget(\SplitNS\gID, 0,0,0,0)
ResizeGadget(\VirView\gID, X, \RdbArea\Top, Width, Height)
ResizeGadget(\VirList\gID, 0,0,0,0)
; 正常情况时
Else
Height = \CurH-\RdbArea\Top-\RdbArea\Bottom
ResizeGadget(\SplitWE\gID, StateWE, \RdbArea\Top, \SplitWidth, Height)
ResizeGadget(\VirTree\gID,\RdbArea\Left,\RdbArea\Top, StateWE-\RdbArea\Left, Height)
X = StateWE+\SplitWidth
Y = StateNS+\SplitWidth
Width = \CurW-X- \RdbArea\Right
Height = \CurH-Y- \RdbArea\Bottom
ResizeGadget(\SplitNS\gID, X, StateNS, Width, \SplitWidth)
ResizeGadget(\VirView\gID, X, \RdbArea\Top, Width, StateNS-\RdbArea\Top)
ResizeGadget(\VirList\gID, X, Y, Width, Height)
EndIf
EndWith
EndProcedure
; 构建控件组
Procedure MPV_CreateAreaGadget(RdbLeft,RdbTop,RdbRight,RdbBottom,LockLeft,LockTop,LockRight,LockBottom)
With _MPVArea
\SplitWE\gID = ContainerGadget(#PB_Any,0,0,0,0) : CloseGadgetList()
\SplitNS\gID = ContainerGadget(#PB_Any,0,0,0,0) : CloseGadgetList()
\VirTree\gID = EditorGadget (#PB_Any,0,0,0,0)
\VirList\gID = EditorGadget (#PB_Any,0,0,0,0)
\VirView\gID = EditorGadget (#PB_Any,0,0,0,0)
\SplitWE\Handle = GadgetID(\SplitWE\gID)
\SplitNS\Handle = GadgetID(\SplitNS\gID)
\VirTree\Handle = GadgetID(\VirTree\gID)
\VirList\Handle = GadgetID(\VirList\gID)
\VirView\Handle = GadgetID(\VirView\gID)
\RdbArea\Left = RdbLeft
\RdbArea\Top = RdbTop
\RdbArea\Right = RdbRight
\RdbArea\Bottom = RdbBottom
\LockArea\Left = LockLeft + RdbLeft
\LockArea\Top = LockTop + RdbTop
\LockArea\Right = LockRight + RdbRight
\LockArea\Bottom= LockBottom + RdbBottom
; 设置调整控件组
MPV_SetAreaGadgetState()
MPV_wHooK_NcHitTest(#True)
; 对控件组进行HOOK
GetWindowLong_(\hWnd, #GWL_WNDPROC)
\wHooK = SetWindowLong_(\hWnd, #GWL_WNDPROC, @MPV_wHooK_WndProc())
\gHooK = SetWindowLong_(\SplitWE\Handle, #GWL_WNDPROC, @MPV_gHooK_WndProc())
\gHooK = SetWindowLong_(\SplitNS\Handle, #GWL_WNDPROC, @MPV_gHooK_WndProc())
EndWith
EndProcedure
;-
;- 挂钩部分 -------------
; 当窗体被调整大小时的响应
Procedure MPV_wHooK_SizeWindow(wParam)
; 当窗体状态发生变化时,刷新界面-调整窗体的大小
_MPVArea\IsReSize = #True
If _MPVArea\wState <> wParam : _MPVArea\wState = wParam : MPV_wHooK_NcHitTest(#True) : EndIf
EndProcedure
; 调整窗体的大小
Procedure MPV_wHooK_NcHitTest( IsReSize = #False)
With _MPVArea
If IsReSize = #True Or _MPVArea\IsReSize
GetClientRect_(\hWnd, WinArea.RECT)
\CurW = WinArea\Right - WinArea\Left
\CurH = WinArea\Bottom - WinArea\Top
MPV_ResizeAreaGadget()
InvalidateRect_(\hWnd,0,#True)
_MPVArea\IsReSize = #False
EndIf
EndWith
EndProcedure
Procedure MPV_wHooK_MouseDown()
; 当拖动分割条超越控件组区域时,自动设置分割条.
If _MPVArea\SplitWE\IsDown Or _MPVArea\SplitNS\IsDown : MPV_gHooK_MouseUp() : EndIf
EndProcedure
;-
;- -------------
; 当分割条控件被按下时
Procedure MPV_gHooK_MouseDown(hWnd)
With _MPVArea
Select hWnd
Case \SplitWE\Handle
SetCursor_(\SplitWE\Cursor)
GetCursorPos_(Mouse.POINT)
SetGadgetColor(\SplitWE\gID,#PB_Gadget_BackColor,\SplitWE\DownColor)
\SplitWE\IsDown = #True
\SplitWE\mStart = Mouse\X
\SplitWE\mEnd = GadgetX(\SplitWE\gID)
Case \SplitNS\Handle
SetCursor_(\SplitNS\Cursor)
GetCursorPos_(Mouse.POINT)
SetGadgetColor(\SplitNS\gID,#PB_Gadget_BackColor,\SplitNS\DownColor)
\SplitNS\IsDown = #True
\SplitNS\mStart = Mouse\Y
\SplitNS\mEnd = GadgetY(\SplitNS\gID)
EndSelect
If \SplitWE\IsDown Or \SplitNS\IsDown
SetWindowLong_(\VirTree\Handle, #GWL_WNDPROC, @MPV_gHooK_WndProc())
SetWindowLong_(\VirList\Handle, #GWL_WNDPROC, @MPV_gHooK_WndProc())
SetWindowLong_(\VirView\Handle, #GWL_WNDPROC, @MPV_gHooK_WndProc())
EndIf
EndWith
EndProcedure
; 当分割条控件被移动时
Procedure MPV_gHooK_MouseMove(hWnd)
With _MPVArea
Select hWnd
Case \SplitWE\Handle : SetCursor_(\SplitWE\Cursor)
Case \SplitNS\Handle : SetCursor_(\SplitNS\Cursor)
EndSelect
If \SplitWE\IsDown Or \SplitNS\IsDown : GetCursorPos_(Mouse.Point) : EndIf
If \SplitWE\IsDown
SetCursor_(\SplitWE\Cursor)
\SplitWE\mEnd + Mouse\X-\SplitWE\mStart
\SplitWE\mStart = Mouse\X
If \SplitWE\mEnd < \LockArea\Left
\SplitWE\mEnd = \LockArea\Left
ElseIf \SplitWE\mEnd > \CurW - \LockArea\Right
\SplitWE\mEnd = \CurW - \LockArea\Right
EndIf
ResizeGadget(\SplitWE\gID,\SplitWE\mEnd,#PB_Ignore ,#PB_Ignore ,#PB_Ignore )
EndIf
If \SplitNS\IsDown
SetCursor_(\SplitNS\Cursor)
\SplitNS\mEnd + Mouse\Y -\SplitNS\mStart
\SplitNS\mStart = Mouse\Y
If \SplitNS\mEnd < \LockArea\Top
\SplitNS\mEnd = \LockArea\Top
ElseIf \SplitNS\mEnd > \CurH - \LockArea\Bottom
\SplitNS\mEnd = \CurH - \LockArea\Bottom
EndIf
ResizeGadget(\SplitNS\gID,#PB_Ignore,\SplitNS\mEnd,#PB_Ignore ,#PB_Ignore )
EndIf
EndWith
EndProcedure
; 当分割条控件被释放时
Procedure MPV_gHooK_MouseUp()
With _MPVArea
If \SplitWE\IsDown : MPV_ResizeAreaGadget(\SplitWE\mEnd,-1) : EndIf
If \SplitNS\IsDown : MPV_ResizeAreaGadget(-1,\SplitNS\mEnd) : EndIf
SetWindowLong_ (\VirTree\Handle, #GWL_WNDPROC, 0)
SetWindowLong_ (\VirList\Handle, #GWL_WNDPROC, 0)
SetWindowLong_ (\VirView\Handle, #GWL_WNDPROC, 0)
InvalidateRect_(\VirTree\Handle,0,#True)
InvalidateRect_(\VirList\Handle,0,#True)
InvalidateRect_(\VirView\Handle,0,#True)
SetGadgetColor(\SplitWE\gID,#PB_Gadget_BackColor,\SplitWE\UpColor)
SetGadgetColor(\SplitNS\gID,#PB_Gadget_BackColor,\SplitNS\UpColor)
\SplitWE\IsDown = #False
\SplitNS\IsDown = #False
EndWith
EndProcedure
;-
;- 挂钩函数 -------------
; HOOK[窗体组]的内置功能
Procedure MPV_wHooK_WndProc(hWnd, uMsg, wParam, lParam)
Select uMsg
Case #WM_NOTIFY
Case #WM_CLOSE
Case #WM_SIZE : MPV_wHooK_SizeWindow(wParam)
Case #WM_NCHITTEST : MPV_wHooK_NcHitTest()
Case #WM_MOUSEMOVE : MPV_wHooK_MouseDown()
EndSelect
ProcedureReturn CallWindowProc_( _MPVArea\wHook, hWnd, uMsg, wParam, lParam)
EndProcedure
; HOOK[控件组]的内置功能
Procedure MPV_gHooK_WndProc(hWnd, uMsg, wParam, lParam)
Select uMsg
Case #WM_LBUTTONDOWN : MPV_gHooK_MouseDown(hWnd)
Case #WM_MOUSEMOVE : MPV_gHooK_MouseMove(hWnd)
Case #WM_LBUTTONUP : MPV_gHooK_MouseUp()
EndSelect
ProcedureReturn CallWindowProc_( _MPVArea\gHook, hWnd, uMsg, wParam, lParam)
EndProcedure
;-
;- DLL函数 -------------
; [MPView.dll]初始化的
ProcedureDLL MPV_Initialization(hWnd)
With _MPVArea
\SplitWE\Cursor = LoadCursor_(0, #IDC_SIZEWE)
\SplitNS\Cursor = LoadCursor_(0, #IDC_SIZENS)
\SplitWE\UpColor = GetSysColor_(#COLOR_BTNFACE)
\SplitNS\UpColor = GetSysColor_(#COLOR_BTNFACE)
\SplitWE\DownColor = $8C928B
\SplitNS\DownColor = $8C928B
\SplitWE\Scale = 0.5
\SplitNS\Scale = 0.5
\SplitWidth = 6
\hWnd = hWnd
EndWith
ProcedureReturn hWnd
EndProcedure
; [MPView.dll]构建控件
ProcedureDLL MPV_Splitter(RdbLeft,RdbTop,RdbRight,RdbBottom,LockLeft,LockTop,LockRight,LockBottom)
UseGadgetList(_MPVArea\hWnd)
MPV_CreateAreaGadget(RdbLeft,RdbTop,RdbRight,RdbBottom,LockLeft,LockTop,LockRight,LockBottom)
CloseGadgetList()
EndProcedure
Code: Select all
Global _MPVI_LibID,*_Init,*_Splitter
; 初始化[MPView.dll]中的函数
Procedure MPVI_UseMPViewLibrary()
_MPVI_LibID = OpenLibrary(#PB_Any, "MPView.dll")
If _MPVI_LibID
*_Init = GetFunction(_MPVI_LibID, "MPV_Initialization")
*_Splitter = GetFunction(_MPVI_LibID, "MPV_Splitter")
EndIf
EndProcedure
Procedure MPVI_Initialization(hWnd)
If *_Init
Result = CallFunctionFast(*_Init, hWnd)
EndIf
ProcedureReturn Result
EndProcedure
Procedure MPVI_Splitter(RdbLeft,RdbTop,RdbRight,RdbBottom,LockLeft,LockTop,LockRight,LockBottom)
If *_Splitter
Result = CallFunctionFast(*_Splitter, RdbLeft,RdbTop,RdbRight,RdbBottom,LockLeft,LockTop,LockRight,LockBottom)
EndIf
ProcedureReturn Result
EndProcedure
Procedure WindowProc(hWnd,Msg,wParam,lParam)
Select Msg
Case #WM_ACTIVATE
If hWnd = WindowID(0)
If (wParam & $FFFF) = #WA_INACTIVE
Else
EndIf
EndIf
EndSelect
ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure
hWnd=OpenWindow(0, 0, 0, 1000, 600, "迷路分割控件测试程序",$CF0001 )
SetWindowCallback(@WindowProc())
CreateGadgetList(hWnd)
MPVI_UseMPViewLibrary()
MPVI_Initialization(hWnd)
MPVI_Splitter(10, 10, 10,10,200,200,200,100)
Repeat
WindowEvent = WaitWindowEvent()
Select WindowEvent
Case #PB_Event_CloseWindow
CloseLibrary(_MPVI_LibID)
End
Case #PB_Event_SizeWindow
EndSelect
ForEver