请问如何重绘一个应用程序的窗体或内部 Object 的边缘,就像 SPY++ 的 FindWindow Tool 实现的样式?? 如上 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 // 画完之后向这个窗口发送 WM_NCPAINT 消息让他自己重画边框// 不过代码远远还没有完成呢 ^_^procedure TForm1.Button1Click(Sender: TObject);var hWnd: DWORD; rc: TRect;begin hWnd := Handle; GetWindowRect(hWnd, rc); OffsetRect(rc, -Left, -Top); Windows.DrawEdge(GetWindowDC(hWnd), rc, EDGE_BUMP, BF_RECT);end; 不太明白什么意思,你用invalideregn(好像是这个api)可以指定重画的区域 我想楼主的意思是实现像 SPY++ 那样闪烁某个指定的窗口的边框的效果。1 取得窗口的 Handle2 取得窗口的边框矩形3 取得窗口的 HDC4 在此 HDC 上涂鸦……5 涂鸦完毕后,SendMessage(窗口, WM_NCPAINT,“你的裤裆被我搞了一个窟窿”, 0)6 ……哈哈实现起来比较烦的吧。 :) 效果就是闪烁某个指定窗口的边框,不过这个边框可不一定是矩形噢!!GetWindowRect 好像不行吧!!:)SPY++ 对不规则窗体照样可以的 SPY++ 没有使用DrawEdge也没有使用任何消息OffsetRectGetWindowRectGetWindowDC是使用了的 http://zealsoftstudio.com/articles/qa9810.htm 方法一:通过 SelectObject 来实现procedure InvertTracker(hwndDest: HWND);//画边框var hdcDest : HWND; hPen : HWND; hOldPen : HWND; hOldBrush : HWND; cr : HWND; rc : TRect;begin GetWindowRect(hwndDest, rc); hdcDest := GetWindowDC(hwndDest); SetROP2(hdcDest,R2_NOT); cr := clBlack; hPen := CreatePen(PS_INSIDEFRAME,2,cr); hOldPen := SelectObject(hdcDest, hPen); hOldBrush := SelectObject(hdcDest, GetStockObject(NULL_BRUSH)); Rectangle(hdcDest, 0, 0, rc.Right - rc.Left, rc.Bottom - rc.Top); SelectObject(hdcDest, hOldBrush); SelectObject(hdcDest, hOldPen); ReleaseDC(hwndDest, hdcDest); DeleteObject(hPen);end; 方法二:将边框区域颜色取反procedure HighlightWindow(hWndWindow: HWND);var hDCWindow: HDC; RECT: TRect; DINV: Integer;begin if (hWndWindow = 0) or (Not IsWindow(hWndWindow)) then Exit else begin hDCWindow := GetWindowDC(hWndWindow); Windows.GetWindowRect(hWndWindow, RECT); OffsetRect(RECT, -RECT.Left,-RECT.Top); DINV := 4; if Not IsRectEmpty(RECT) then begin PatBlt(hDCWindow, RECT.Left, RECT.Top, RECT.Right - RECT.Left, DINV, DSTINVERT); PatBlt(hDCWindow, RECT.left, RECT.bottom - DINV, DINV, -(RECT.bottom - RECT.top - 2 * DINV), DSTINVERT); PatBlt(hDCWindow, RECT.right - DINV, RECT.top + DINV, DINV, RECT.bottom - RECT.top - 2 * DINV, DSTINVERT); PatBlt(hDCWindow, RECT.right, RECT.bottom - DINV, -(RECT.right - RECT.left), DINV, DSTINVERT); end; ReleaseDC(hWndWindow, hDCWindow); end;end;不过这两个都无法实现异型窗体的高亮,:( 当 Windows Media Player 处于隐藏菜单状态的时候(我想其是 Overlay 窗口)SPY++ 也无法完整的闪烁其完整边框不过可以用 SPY++ 描绘用 SetWindowRgn 设置某个窗口的边框 但是它的 Finder Tool 却是可以的,它并没有使用 SetWindowRgn API 我的意思是若某个窗口曾经使用了 SetWindowRgn 函数进行调整那么 SPY++ 可以完整描绘其边框对于 Overlay 窗口,SPY++ 好像“无能为力” 上两例中的后一例不是 VC++ 的仿 SPY++ 程序么?何必做得这么完美 :) 对于我的程序来说,这个功能已够用了,但是还不明白 SPY++ 是怎么做的,在研究几天! 扫描本地端口 Delphi对象模型这个Create,再次开个贴来讨论,非想搞清楚不可 fastreport设计报表时错误:variant array index out of bounds 兼职(软件开发) 用socket控件编写的网络通讯程序,如何区别来自同一代理的两个用户? SQL服务器上的天网要怎样设置才安全呢? 關於創建一個模版窗口的多個實例? 请教高手,如何实现“数据库模糊查询”功能?? 如何隐藏listview的column? 一个看似简单的问题 用Delphi做过托盘程序的高手请进 毕业题(解决者,要啥给啥,分不够再开帖给)
// 不过代码远远还没有完成呢 ^_^
procedure TForm1.Button1Click(Sender: TObject);
var
hWnd: DWORD;
rc: TRect;
begin
hWnd := Handle;
GetWindowRect(hWnd, rc);
OffsetRect(rc, -Left, -Top);
Windows.DrawEdge(GetWindowDC(hWnd), rc, EDGE_BUMP, BF_RECT);
end;
1 取得窗口的 Handle
2 取得窗口的边框矩形
3 取得窗口的 HDC
4 在此 HDC 上涂鸦……
5 涂鸦完毕后,SendMessage(窗口, WM_NCPAINT,“你的裤裆被我搞了一个窟窿”, 0)
6 ……哈哈
实现起来比较烦的吧。
GetWindowRect 好像不行吧!!:)SPY++ 对不规则窗体照样可以的
DrawEdge
也没有使用任何消息OffsetRect
GetWindowRect
GetWindowDC
是使用了的
通过 SelectObject 来实现procedure InvertTracker(hwndDest: HWND);
//画边框
var
hdcDest : HWND;
hPen : HWND;
hOldPen : HWND;
hOldBrush : HWND;
cr : HWND;
rc : TRect;
begin
GetWindowRect(hwndDest, rc);
hdcDest := GetWindowDC(hwndDest);
SetROP2(hdcDest,R2_NOT);
cr := clBlack;
hPen := CreatePen(PS_INSIDEFRAME,2,cr); hOldPen := SelectObject(hdcDest, hPen);
hOldBrush := SelectObject(hdcDest, GetStockObject(NULL_BRUSH));
Rectangle(hdcDest, 0, 0, rc.Right - rc.Left, rc.Bottom - rc.Top);
SelectObject(hdcDest, hOldBrush);
SelectObject(hdcDest, hOldPen); ReleaseDC(hwndDest, hdcDest);
DeleteObject(hPen);
end;
方法二:
将边框区域颜色取反procedure HighlightWindow(hWndWindow: HWND);
var hDCWindow: HDC;
RECT: TRect;
DINV: Integer;
begin
if (hWndWindow = 0) or (Not IsWindow(hWndWindow)) then
Exit
else begin
hDCWindow := GetWindowDC(hWndWindow);
Windows.GetWindowRect(hWndWindow, RECT);
OffsetRect(RECT, -RECT.Left,-RECT.Top); DINV := 4;
if Not IsRectEmpty(RECT) then
begin
PatBlt(hDCWindow, RECT.Left, RECT.Top, RECT.Right - RECT.Left, DINV, DSTINVERT);
PatBlt(hDCWindow, RECT.left, RECT.bottom - DINV, DINV,
-(RECT.bottom - RECT.top - 2 * DINV), DSTINVERT);
PatBlt(hDCWindow, RECT.right - DINV, RECT.top + DINV, DINV,
RECT.bottom - RECT.top - 2 * DINV, DSTINVERT);
PatBlt(hDCWindow, RECT.right, RECT.bottom - DINV, -(RECT.right - RECT.left),
DINV, DSTINVERT);
end;
ReleaseDC(hWndWindow, hDCWindow);
end;
end;
不过这两个都无法实现异型窗体的高亮,:(
SPY++ 也无法完整的闪烁其完整边框
不过可以用 SPY++ 描绘用 SetWindowRgn 设置某个窗口的边框
若某个窗口曾经使用了 SetWindowRgn 函数进行调整
那么 SPY++ 可以完整描绘其边框
对于 Overlay 窗口,SPY++ 好像“无能为力”
何必做得这么完美
对于我的程序来说,这个功能已够用了,
但是还不明白 SPY++ 是怎么做的,
在研究几天!