MiLoo MPVSplit Gadget In Dll [My SplitterGadget]

Share your advanced PureBasic knowledge/code with the community.
MiLoo
User
User
Posts: 47
Joined: Fri Jan 28, 2011 12:26 pm

MiLoo MPVSplit Gadget In Dll [My SplitterGadget]

Post by MiLoo »

in dll [MPView.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
use dll

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
I came to the ancient oriental country - China
I will PureBasic called B++
User avatar
Rings
Moderator
Moderator
Posts: 1435
Joined: Sat Apr 26, 2003 1:11 am

Re: MiLoo MPVSplit Gadget In Dll [My SplitterGadget]

Post by Rings »

where is that 'MPView.dll' ?
SPAMINATOR NR.1
Nituvious
Addict
Addict
Posts: 1029
Joined: Sat Jul 11, 2009 4:57 am
Location: United States

Re: MiLoo MPVSplit Gadget In Dll [My SplitterGadget]

Post by Nituvious »

Rings wrote:where is that 'MPView.dll' ?
I believe it's the first code snippet.
in dll [MPView.dll]
▓▓▓▓▓▒▒▒▒▒░░░░░
Post Reply