磁性窗体 VBWord文档下载推荐.docx

上传人:b****5 文档编号:20792628 上传时间:2023-01-25 格式:DOCX 页数:25 大小:21.35KB
下载 相关 举报
磁性窗体 VBWord文档下载推荐.docx_第1页
第1页 / 共25页
磁性窗体 VBWord文档下载推荐.docx_第2页
第2页 / 共25页
磁性窗体 VBWord文档下载推荐.docx_第3页
第3页 / 共25页
磁性窗体 VBWord文档下载推荐.docx_第4页
第4页 / 共25页
磁性窗体 VBWord文档下载推荐.docx_第5页
第5页 / 共25页
点击查看更多>>
下载资源
资源描述

磁性窗体 VBWord文档下载推荐.docx

《磁性窗体 VBWord文档下载推荐.docx》由会员分享,可在线阅读,更多相关《磁性窗体 VBWord文档下载推荐.docx(25页珍藏版)》请在冰豆网上搜索。

磁性窗体 VBWord文档下载推荐.docx

PrivateConstPATCH_05AsLong=93

PrivateConstPATCH_08AsLong=132

PrivateConstPATCH_09AsLong=137

PrivateTypetSubData

hwndAsLong

nAddrSubAsLong

nAddrOrigAsLong

nMsgCntAAsLong

nMsgCntBAsLong

aMsgTblA()AsLong

aMsgTblB()AsLong

EndType

Privatesc_aSubData()AstSubData

Privatesc_aBuf(1ToCODE_LEN)AsByte

Privatesc_pCWPAsLong

Privatesc_pEbModeAsLong

Privatesc_pSWLAsLong

PrivateDeclareSubRtlMoveMemoryLib"

kernel32"

(DestinationAsAny,SourceAsAny,ByValLengthAsLong)

PrivateDeclareFunctionGetModuleHandleALib"

(ByVallpModuleNameAsString)AsLong

PrivateDeclareFunctionGetProcAddressLib"

(ByValhModuleAsLong,ByVallpProcNameAsString)AsLong

PrivateDeclareFunctionGlobalAllocLib"

(ByValwFlagsAsLong,ByValdwBytesAsLong)AsLong

PrivateDeclareFunctionGlobalFreeLib"

(ByValhmemAsLong)AsLong

PrivateDeclareFunctionSetWindowLongALib"

user32"

(ByValhwndAsLong,ByValnIndexAsLong,ByValdwNewLongAsLong)AsLong

PrivateDeclareFunctionVirtualProtectLib"

(lpAddressAsAny,ByValdwSizeAsLong,ByValflNewProtectAsLong,lpflOldProtectAsLong)AsLong

PrivateTypePOINTAPI

x1AsLong

Y1AsLong

PrivateTypeRECT2

x2AsLong

Y2AsLong

PrivateConstSPI_GETWORKAREAAsLong=48

PrivateConstWM_SIZINGAsLong=&

H214

PrivateConstWM_MOVINGAsLong=&

H216

PrivateConstWM_ENTERSIZEMOVEAsLong=&

H231

PrivateConstWM_EXITSIZEMOVEAsLong=&

H232

PrivateConstWM_SYSCOMMANDAsLong=&

H112

PrivateConstWM_COMMANDAsLong=&

H111

PrivateConstWMSZ_LEFTAsLong=1

PrivateConstWMSZ_RIGHTAsLong=2

PrivateConstWMSZ_TOPAsLong=3

PrivateConstWMSZ_TOPLEFTAsLong=4

PrivateConstWMSZ_TOPRIGHTAsLong=5

PrivateConstWMSZ_BOTTOMAsLong=6

PrivateConstWMSZ_BOTTOMLEFTAsLong=7

PrivateConstWMSZ_BOTTOMRIGHTAsLong=8

PrivateConstSC_MINIMIZEAsLong=&

HF020&

PrivateConstSC_RESTOREAsLong=&

HF120&

PrivateConstSWP_NOSIZEAsLong=&

H1

PrivateConstSWP_NOZORDERAsLong=&

H4

PrivateConstSWP_NOACTIVATEAsLong=&

H10

PrivateDeclareFunctionSystemParametersInfoLib"

Alias"

SystemParametersInfoA"

(ByValuActionAsLong,ByValuParamAsLong,lpvParamAsAny,ByValfuWinIniAsLong)AsLong

PrivateDeclareFunctionIsWindowLib"

(ByValhwndAsLong)AsLong

PrivateDeclareFunctionIsZoomedLib"

PrivateDeclareFunctionBeginDeferWindowPosLib"

(ByValnNumWindowsAsLong)AsLong

PrivateDeclareFunctionDeferWindowPosLib"

(ByValhWinPosInfoAsLong,ByValhwndAsLong,ByValhWndInsertAfterAsLong,ByValXAsLong,ByValYAsLong,ByValcxAsLong,ByValcyAsLong,ByValwFlagsAsLong)AsLong

PrivateDeclareFunctionEndDeferWindowPosLib"

(ByValhWinPosInfoAsLong)AsLong

PrivateDeclareFunctionGetCursorPosLib"

(lpPointAsPOINTAPI)AsLong

PrivateDeclareFunctionGetWindowRectLib"

(ByValhwndAsLong,lpRectAsRECT2)AsLong

PrivateDeclareFunctionOffsetRectLib"

(lpRectAsRECT2,ByValXAsLong,ByValYAsLong)AsLong

PrivateDeclareFunctionUnionRectLib"

(lpDestRectAsRECT2,lpSrc1RectAsRECT2,lpSrc2RectAsRECT2)AsLong

PrivateDeclareSubCopyMemoryLib"

RtlMoveMemory"

(pDestAsAny,pSrcAsAny,ByValByteLenAsLong)

PrivateTypeWND_INFO

hWndParentAsLong

GlueAsBoolean

PrivateConstLB_RECTAsLong=16

Privatem_uWndInfo()AsWND_INFO

Privatem_lWndCountAsLong

Privatem_rcWnd()AsRECT2

Privatem_ptAnchorAsPOINTAPI

Privatem_ptOffsetAsPOINTAPI

Privatem_ptCurrAsPOINTAPI

Privatem_ptLastAsPOINTAPI

Privatem_lSnapWidthAsLong

PrivateSubClass_Initialize()

m_lSnapWidth=10'

默认吸引的宽度

ReDimm_uWndInfo(0)AsWND_INFO'

初始化包含窗口句柄的数组

m_lWndCount=0

EndSub

PrivateSubClass_Terminate()

'

停止Subclass

If(m_lWndCount)Then

CallSubclass_StopAll

EndIf

PublicSubzSubclass_Proc(ByValbBeforeAsBoolean,ByRefbHandledAsBoolean,ByReflReturnAsLong,ByReflng_hWndAsLong,ByRefuMsgAsLong,ByRefwParamAsLong,ByReflParamAsLong)

DimrcWndAsRECT2

DimlcAsLong

SelectCaseuMsg

CaseWM_ENTERSIZEMOVE'

开始移动或改变大小

CallSystemParametersInfo(SPI_GETWORKAREA,0,m_rcWnd(0),0)'

获得桌面区域

Forlc=1Tom_lWndCount'

获得窗体句柄

If(IsZoomed(m_uWndInfo(lc).hwnd))Then'

如果窗体最大化

CallCopyMemory(m_rcWnd(lc),m_rcWnd(0),LB_RECT)'

获取工作区矩形

Else

CallGetWindowRect(m_uWndInfo(lc).hwnd,m_rcWnd(lc))'

获取窗体矩形

If(m_uWndInfo(lc).hwnd=lng_hWnd)Then'

如果是当前的窗体

获取偏移量

CallGetCursorPos(m_ptAnchor)

CallGetCursorPos(m_ptLast)

m_ptOffset.x1=m_rcWnd(lc).x1-m_ptLast.x1

m_ptOffset.Y1=m_rcWnd(lc).Y1-m_ptLast.Y1

Nextlc

改变大小

CaseWM_SIZING

CallCopyMemory(rcWnd,ByVallParam,LB_RECT)

CallpvSizeRect(lng_hWnd,rcWnd,wParam)

CallCopyMemory(ByVallParam,rcWnd,LB_RECT)

bHandled=True

lReturn=1

移动

CaseWM_MOVING

CallpvMoveRect(lng_hWnd,rcWnd)

改变或移动大小结束

CaseWM_EXITSIZEMOVE

CallpvCheckGlueing

特殊情况菜单调用

CaseWM_SYSCOMMAND

If(wParam=SC_MINIMIZEOrwParam=SC_RESTORE)Then

特殊情况控件调用

CaseWM_COMMAND

EndSelect

PublicFunctionAddWindow(ByValhwndAsLong,OptionalByValhWndParentAsLong=0)AsBoolean

Forlc=1Tom_lWndCount

If(hwnd=m_uWndInfo(lc).hwnd)ThenExitFunction

If(IsWindow(hwnd)And(IsWindow(hWndParent)OrhWndParent=0))Then'

如果窗体有效

m_lWndCount=m_lWndCount+1'

增加数量

ReDimPreservem_uWndInfo(0Tom_lWndCount)'

调整数组大小

ReDimPreservem_rcWnd(0Tom_lWndCount)

Withm_uWndInfo(m_lWndCount)'

添加信息

.hwnd=hwnd

.hWndParent=hWndParent

EndWith

CallpvCheckGlueing'

粘合

执行Subclass

CallSubclass_Start(hwnd)

CallSubclass_AddMsg(hwnd,WM_ENTERSIZEMOVE)

CallSubclass_AddMsg(hwnd,WM_SIZING,[MSG_BEFORE])

CallSubclass_AddMsg(hwnd,WM_MOVING,[MSG_BEFORE])

CallSubclass_AddMsg(hwnd,WM_EXITSIZEMOVE)

CallSubclass_AddMsg(hwnd,WM_SYSCOMMAND)

CallSubclass_AddMsg(hwnd,WM_COMMAND)

执行成功

AddWindow=True

EndFunction

PublicFunctionRemoveWindow(ByValhwndAsLong)AsBoolean

Dimlc1AsLong

Dimlc2AsLong

Forlc1=1Tom_lWndCount

If(hwnd=m_uWndInfo(lc1).hwnd)Then

移动到下面

Forlc2=lc1Tom_lWndCount-1

m_uWndInfo(lc2)=m_uWndInfo(lc2+1)

Nextlc2

m_lWndCount=m_lWndCount-1'

数量减一

ReDimPreservem_uWndInfo(m_lWndCount)

ReDimPreservem_rcWnd(m_lWndCount)

移动父

Forlc2=1Tom_lWndCount

If(m_uWndInfo(lc2).hWndParent=hwnd)Then

m_uWndInfo(lc2).hWndParent=0

CallSubclass_Stop(hwnd)'

停止Subclass

检查粘合

RemoveWindow=True

ExitFor

Nextlc1

PublicSubCheckGlueing()

检查窗体所有可能的粘合

PublicPropertyGetSnapWidth()AsLong

SnapWidth=m_lSnapWidth

EndProperty

PublicPropertyLetSnapWidth(ByValNew_SnapWidthAsLong)

m_lSnapWidth=New_SnapWidth

PrivateSubpvSizeRect(ByValhwndAsLong,rcWndAsRECT2,ByVallfEdgeAsLong)

DimrcTmpAsRECT2

CallCopyMemory(rcTmp,rcWnd,LB_RECT)

检查所有的窗体

Forlc=0Tom_lWndCount

Withm_rcWnd(lc)

If(m_uWndInfo(lc).hwnd<

>

hwnd)Then'

如果不是当前窗体

X轴方向的粘合

If(rcWnd.Y1<

.Y2+m_lSnapWidthAndrcWnd.Y2>

.Y1-m_lSnapWidth)Then

SelectCaselfEdge

CaseWMSZ_LEFT,WMSZ_TOPLEFT,WMSZ_BOTTOMLEFT

SelectCaseTrue

CaseAbs(rcTmp.x1-.x1)<

m_lSnapWidth:

rcWnd.x1=.x1

CaseAbs(rcTmp.x1-.x2)<

rcWnd.x1=.x2

CaseWMSZ_RIGHT,WMSZ_TOPRIGHT,WMSZ_BOTTOMRIGHT

CaseAbs(rcTmp.x2-.x1)<

rcWnd.x2=.x1

CaseAbs(rcTmp.x2-.x2)<

rcWnd.x2=.x2

Y轴方向的粘合

If(rcWnd.x1<

.x2+m_lSnapWidthAndrcWnd.x2>

.x1-m_lSnapWidth)Then

CaseWMSZ_TOP,WMSZ_TOPLEFT,WMSZ_TOPRIGHT

CaseAbs(rcTmp.Y1-.Y1)<

rcWnd.Y1=.Y1

CaseAbs(rcTmp.Y1-.Y2)<

rcWnd.Y1=.Y2

CaseWMSZ_BOTTOM,WMSZ_BOTTOMLEFT,WMSZ_BOTTOMRIGHT

CaseAbs(rcTmp.Y2-.Y1)<

rcWnd.Y2=.Y1

CaseAbs(rcTmp.Y2-.Y2)<

rcWnd.Y2=.Y2

PrivateSubpvMoveRect(ByValhwndAsLong,rcWndAsRECT2)

DimlWIdAsLong

DimlOffxAsLong

DimlOffyAsLong

DimhDWPAsLong

CallGetCursorPos(m_ptCurr)'

获取当前鼠标位置

检查当前窗体的可粘合性

移动当前窗体

CallOffsetRect(rcWnd,(m_ptCurr.x1-rcWnd.x1)+m_ptOffset.x1,0)

CallOffsetRect(rcWnd,0,(m_ptCurr.Y1-rcWnd.Y1)+m_ptOffset.Y1)

Forlc1=0Tom_lWndCount'

If(m_uWndInfo(lc1).hwnd<

如果不是当前的窗体

If(m_uWndInfo(lc1).Glue=FalseOrm_uWndInfo(lc1).hWn

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 职业规划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1