Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Нарисовать подсвеченный прямоугольник вокруг контрола под мышкой

Delphi , Графика и Игры , Компоненты и Графика

Нарисовать подсвеченный прямоугольник вокруг контрола под мышкой


{ 
  This tip might be useful if you want to program 
  a screen capture tool and show a bounding box 
  around a control or for a spy tool like winsight to 
  highlight a object on the screen. 
} 
var 
 hOldWnd :HWND; 

procedure FrameWindow(Wnd: HWnd); 
var 
  Rect: TRect; 
  DC: hDC; 
  OldPen, Pen: hPen; 
  OldBrush, Brush: hBrush; 
  X2, Y2: Integer; 
begin 
  { Get the target window's rect and DC } 
  GetWindowRect(Wnd, Rect); 
  DC := GetWindowDC(Wnd); 
  { Set ROP appropriately for highlighting } 
  SetROP2(DC, R2_NOT); 
  { Select brush and pen } 
  Pen := CreatePen(PS_InsideFrame, 4, 0); 
  OldPen := SelectObject(DC, Pen); 
  Brush := GetStockObject(Null_Brush); 
  OldBrush := SelectObject(DC, Brush); 
  { Set dimensions of highlight } 
  X2 := Rect.Right - Rect.Left; 
  Y2 := Rect.Bottom - Rect.Top; 
  { Draw highlight box } 
  Rectangle(DC, 0, 0, X2, Y2); 
  { Clean up } 
  SelectObject(DC, OldBrush); 
  SelectObject(DC, OldPen); 
  ReleaseDC(Wnd, DC); 
  { Do NOT delete the brush, because it was a stock object } 
  DeleteObject(Pen); 
end; 

procedure TForm1.Timer1Timer(Sender: TObject); 
var 
  hNewWnd: HWnd; 
begin 
  hNewWnd := WindowFromPoint(Mouse.CursorPos); 
  { To avoid flickering, remove the old frame ONLY if moved to new window } 
  if hNewWnd <> hOldWnd then 
  begin 
    if hOldWnd <> 0 then 
      FrameWindow(hOldWnd); 
    if hNewWnd <> 0 then 
      FrameWindow(hNewWnd); 
    hOldWnd := hNewWnd; 
  end; 
end;

Программа на языке Delphi, которая рисует выделенный прямоугольник вокруг контроля под курсором мыши с помощью функций Windows API.

Следующий код работает следующим образом:

  1. Процедура FrameWindow принимает в качестве параметра handle окна и выделяет это окно, рисуя вокруг него прямоугольник.
  2. Она получает прямоугольник целевого окна и контекст устройства с помощью функций GetWindowRect и GetWindowDC.
  3. Она устанавливает оператор отображения (ROP) в R2_NOT, что означает, что все пиксели будут инвертированы при рисовании.
  4. Она выбирает перо с толщиной 4 пикселя и цветом 0 (черным).
  5. Она выбирает кисть как пустую кисть (без заливки).
  6. Она рассчитывает размеры прямоугольника, вычитая координаты верхнего левого угла из координат нижнего правого угла.
  7. Она рисует прямоугольник с помощью функции Rectangle.
  8. Наконец, она очищает контекст устройства, выбрав старую кисть и перо, и удаляет перо.

Процедура Timer1Timer - это обработчик события таймера, который запускается каждый раз, когда таймер тикает. Она работает следующим образом:

  1. Она получает handle контроля под курсором мыши с помощью функции WindowFromPoint.
  2. Если новый handle отличается от старого, то это означает, что мышка переместилась в новое окно.
  3. Она вызывает процедуру FrameWindow для обоих окон, чтобы рисовать вокруг них прямоугольники.
  4. Она обновляет переменную hOldWnd с новым handle.

Этот код может быть полезен в инструментах захвата экрана или инструментах слежения за компьютером, которые нуждаются в выделении объектов на экране.

Некоторые предложения по улучшению:

  1. Вместо использования обработчика события таймера вы можете использовать обработчик события движения мыши (например, OnMouseMove) для получения нового handle и рисования прямоугольника.
  2. Вы можете добавить больше функциональности в процедуру FrameWindow, например, изменять цвет или толщину пера в зависимости от пользовательских настроек.
  3. Вы можете улучшить производительность, рисуя прямоугольники только когда это необходимо, а не каждый раз, когда таймер тикает.
  4. Вы также можете рассмотреть использование встроенных функций выделения Delphi (например, HighlightControl) вместо реализации собственной.

Примечание: код написан на языке Delphi, и некоторые функции Windows API могут иметь другие имена или параметры в зависимости от используемого программного языка.

Нарисовать подсвеченный прямоугольник вокруг контрола под мышкой, используя для этого функцию GetWindowRect и SetROP2.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Компоненты и Графика ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-19 13:29:56
2024-11-21 11:41:19/0.0059738159179688/1