您现在的位置:首页 >> VCL >> VCL >> 内容

实现SPY++的FindWindow Tool的高亮一个应用程序的窗体或内部Object的边缘

时间:2011/9/3 16:24:09 点击:

  核心提示:方法一: 通过SelectObject来实现 procedureInvertTracker(hwndDest:HWND); //画边框 var hdcDest:HWND; hPen:HWND; hOl...
方法一:
通过 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;
不过这两个都无法实现异型窗体的高亮

作者:网络 来源:转载
共有评论 0相关评论
发表我的评论
  • 大名:
  • 内容:
本类推荐
  • 没有
本类固顶
  • 没有
  • 盒子文章(www.2ccc.com) © 2024 版权所有 All Rights Reserved.
  • 沪ICP备05001939号