Code AardioLine:2复制
使用方法:复制后保存成dock库文件,放lib里,调用使用 import dock;
Code AardioLine:224复制
1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.39.40.41.42.43.44.45.46.47.48.49.50.51.52.53.54.55.56.57.58.59.60.61.62.63.64.65.66.67.68.69.70.71.72.73.74.75.76.77.78.79.80.81.82.83.84.85.86.87.88.89.90.91.92.93.94.95.96.97.98.99.100.101.102.103.104.105.106.107.108.109.110.111.112.113.114.115.116.117.118.119.120.121.122.123.124.125.126.127.128.129.130.131.132.133.134.135.136.137.138.139.140.141.142.143.144.145.146.147.148.149.150.151.152.153.154.155.156.157.158.159.160.161.162.163.164.165.166.167.168.169.170.171.172.173.174.175.176.177.178.179.180.181.182.183.184.185.186.187.188.189.190.191.192.193.194.195.196.197.198.199.200.201.202.203.204.205.206.207.208.209.210.211.212.213.214.215.216.217.218.219.220.221.222.223.224.class
dock{-
ctor
(winform, acts=10, isTop=false, isDock=true, margin=false){ -
assert
(winform[["hwnd"
]], "参数@1必须是窗体对象"
); - acts = ..
math
.abs(tonumber
(acts) : 1
); -
-
-
this
= winform; -
this
.site, this
.msIn = ""
, 0
; -
-
var
monitors = {}; -
for
hMonitor, monitorInfo in
sys.monitor.eachInfo() { - ..
table
.push(monitors,monitorInfo); -
-
- }
-
var
scrw, scrh = win
.getScreen(); -
-
if
( -
var
monitor1 = monitors[1
]; -
var
monitor2 = monitors[2
]; -
-
-
if
(monitor1.rcMonitor.right == monitor2.rcMonitor.left or
monitor1.rcMonitor.left == monitor2.rcMonitor.right) { -
-
var
width = ..math
.abs(monitor2.rcMonitor.right-monitor1.rcMonitor.left); -
var
height = ..math
.abs(monitor1.rcMonitor.bottom-monitor2.rcMonitor.top); - scrw, scrh = width,height
-
- }
-
-
elseif
(monitor1.rcMonitor.bottom == monitor2.rcMonitor.top or
monitor1.rcMonitor.top == monitor2.rcMonitor.bottom) { -
-
var
width = ..math
.abs(monitor2.rcMonitor.right-monitor1.rcMonitor.left); -
var
height = ..math
.abs(monitor1.rcMonitor.bottom-monitor2.rcMonitor.top); - scrw, scrh = width,height
-
- }
-
-
-
else
{ -
- scrw, scrh =
win
.getScreen(); - }
- }
else
{ -
- scrw, scrh =
win
.getScreen(); - }
-
-
-
var
wndGdi, alSign = _wndGdi(); -
var
wndAlpha = function
(v = false
, w, h){ - alSign = !!v;
-
if
(!alSign){ -
this
.transparent(false
); -
-
- _redrawWindow(
this
.hwnd, , , 0x400 | 0x1 | 0x4) -
return
; - }
-
this
.transparent(true
); -
var
col = margin ? 0xaad2d2d2 : 0x01d2d2d2 - wndGdi(
this
.hwnd, w, h, function
(mdc, w, h){ -
var
gph = gdip.graphics(mdc) -
var
gBru = gdip.solidBrush(col) - gph.fillRectangle(gBru,
0
, 0
, w, h) - gBru.delete()
- gph.delete()
- gdi.updateLayeredWindow(
this
.hwnd, mdc, ::SIZE(w, h), gdi.blendFunction(255)) - })
- }
-
-
var
ap = {}; -
var
aTimer = win
.timer(, 10
); - aTimer.onTimer =
function
(hwnd,msg,id,tick){ -
var
c = true
; -
if
(ap[["site"
]] == "top"
){ - ap.y += ap.v;
- c = ap.msIn ? !(ap.y<
0
) : !(ap.y>4
-ap.h); -
if
(c) ap.y = !ap.msIn ? 4
-ap.h : 0
; - }
-
elseif
(ap[["site"
]] == "left"
){ - ap.x += ap.v;
- c = ap.msIn ? !(ap.x<
0
) : !(ap.x>4
-ap.w); -
if
(c) ap.x = !ap.msIn ? 4
-ap.w : 0
; - }
-
elseif
(ap[["site"
]] == "right"
){ - ap.x -= ap.v;
- c = ap.msIn ? !(ap.x>scrw-ap.w) : !(ap.x<scrw-
4
); -
if
(c) ap.x = ap.msIn ? scrw-ap.w : scrw-4
; - }
-
this
.setPos(ap.x, ap.y); -
if
(c){ -
if
( - wndAlpha(
1
, ap.w, ap.h); -
if
(!isTop) win
.setTopmost(this
.hwnd); - }
-
elseif
(!isTop) win
.setTopmost(this
.hwnd, false
); -
owner
.disable(); - }
-
elseif
(alSign) wndAlpha(, ap.w, ap.h); - }
-
-
var
msPos = ::POINT(); -
var
mTimer = win
.timer(, 10
); - mTimer.onTimer =
function
(hwnd,msg,id,tick){ -
var
x, y, w, h = this
.getPos(); -
if
(w >= scrw) return
; -
- /
-
- /
-
- /
- }
-
-
this
.wndMargin = function
(v = false
){ - margin = !!v
- }
-
- /
-
- /
-
- /
-
-
this
.wndproc = { - [0x7E] =
function
(hwnd,message,wParam,lParam){ - scrw, scrh =
win
.getScreen(); -
owner
.wndDisplay() - }
- }
- ::PostMessage(
this
.hwnd, 0x5A3, 0
, 0
); - };
- }
namespace
dock{-
import
win
.timer; -
import
gdip.graphics; -
import
gdip.solidBrush; -
import
gdi; -
import
sys.monitor; -
import
console; -
- _getMsPos = ::User32.GetCursorPos;
- _redrawWindow = ::User32.RedrawWindow;
- _fromPoint = ::User32.WindowFromPoint;
- _getAsyncKeyState = ::User32.GetAsyncKeyState;
- _getWindowThreadProcessId = ::User32.GetWindowThreadProcessId;
- _msIn =
function
(x, y){ -
var
hwnd = _fromPoint(x, y); -
return
_getWindowThreadProcessId(hwnd, 0
) == ..thread
.getId(); - }
- _wndGdi =
function
(){ -
var
hdc, mdc, hbmp; -
var
create = function
(hwnd, w, h){ - hdc = ::GetWindowDC(hwnd);
- mdc = ::CreateCompatibleDC();
- hbmp = ::CreateCompatibleBitmap(hdc, w, h);
- ::SelectObject(mdc, hbmp);
- }
-
var
delete = function
(hwnd){ - ::ReleaseDC(hwnd, hdc);
- ::DeleteDC(mdc);
- ::DeleteObject(hbmp);
- }
-
return
function
(hwnd, w, h, draw, ...){ - create(hwnd, w, h);
-
if
(type
(draw) == "function"
) draw(mdc, w, h, ...); - delete(hwnd);
- }
- }
- }
已知的问题(能力有限,仍未能优化):
1、窗体贴边影藏之后,无法通过点击状态栏程序图标激活,必须鼠标放到贴边位置,有时候找不到,需要鼠标围着桌面贴边找一圈;
2、窗体不能最小化,最小化后无法还原;
3、父子窗体中,子窗体鼠标滑过会触发主窗体的DOCK贴边显示;