Нарисовать подсвеченный прямоугольник вокруг контрола под мышкой
{
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 thenbeginif hOldWnd <> 0 then
FrameWindow(hOldWnd);
if hNewWnd <> 0 then
FrameWindow(hNewWnd);
hOldWnd := hNewWnd;
end;
end;
Программа на языке Delphi, которая рисует выделенный прямоугольник вокруг контроля под курсором мыши с помощью функций Windows API.
Следующий код работает следующим образом:
Процедура FrameWindow принимает в качестве параметра handle окна и выделяет это окно, рисуя вокруг него прямоугольник.
Она получает прямоугольник целевого окна и контекст устройства с помощью функций GetWindowRect и GetWindowDC.
Она устанавливает оператор отображения (ROP) в R2_NOT, что означает, что все пиксели будут инвертированы при рисовании.
Она выбирает перо с толщиной 4 пикселя и цветом 0 (черным).
Она выбирает кисть как пустую кисть (без заливки).
Она рассчитывает размеры прямоугольника, вычитая координаты верхнего левого угла из координат нижнего правого угла.
Она рисует прямоугольник с помощью функции Rectangle.
Наконец, она очищает контекст устройства, выбрав старую кисть и перо, и удаляет перо.
Процедура Timer1Timer - это обработчик события таймера, который запускается каждый раз, когда таймер тикает. Она работает следующим образом:
Она получает handle контроля под курсором мыши с помощью функции WindowFromPoint.
Если новый handle отличается от старого, то это означает, что мышка переместилась в новое окно.
Она вызывает процедуру FrameWindow для обоих окон, чтобы рисовать вокруг них прямоугольники.
Она обновляет переменную hOldWnd с новым handle.
Этот код может быть полезен в инструментах захвата экрана или инструментах слежения за компьютером, которые нуждаются в выделении объектов на экране.
Некоторые предложения по улучшению:
Вместо использования обработчика события таймера вы можете использовать обработчик события движения мыши (например, OnMouseMove) для получения нового handle и рисования прямоугольника.
Вы можете добавить больше функциональности в процедуру FrameWindow, например, изменять цвет или толщину пера в зависимости от пользовательских настроек.
Вы можете улучшить производительность, рисуя прямоугольники только когда это необходимо, а не каждый раз, когда таймер тикает.
Вы также можете рассмотреть использование встроенных функций выделения Delphi (например, HighlightControl) вместо реализации собственной.
Примечание: код написан на языке Delphi, и некоторые функции Windows API могут иметь другие имена или параметры в зависимости от используемого программного языка.
Нарисовать подсвеченный прямоугольник вокруг контрола под мышкой, используя для этого функцию GetWindowRect и SetROP2.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.