Вопрос, который возник у пользователя, связан с неожиданным поведением системных кнопок в среде разработки Delphi. При вызове функции WindowFromPoint в событии MouseMove компонента TWinControl происходит выделение системных кнопок, что является нежелательным поведением, особенно если разработчик реализует собственную логику перетаскивания вкладок, как в случае с TChromeTabs.
Описание проблемы
При использовании функции WindowFromPoint в обработчике события MouseMove компонента Button1, который является потомком TWinControl, наблюдается некорректное выделение системных кнопок окна. Это выделение происходит независимо от движения мыши и зависит от положения курсора относительно системных кнопок. Проявляется данная проблема в средах разработки Delphi XE2 и Delphi 7 на операционной системе Windows 7 Professional 64-bit.
Исследования показали, что проблема не связана с VCL, так как аналогичное поведение наблюдается и в простом C++ приложении. Ошибка заключается в том, что вызов WindowFromPoint должен происходить из отдельного потока, а не из потока, к которому принадлежит окно. Это означает, что для обхода данной проблемы необходимо создать новый поток, который будет выполнять данную функцию.
type
TGetWndThread = class(TThread)
private
FPoint: TPoint;
protected
procedure Execute; override;
constructor Create(AOwner: TComponent; Point: TPoint);
end;
constructor TGetWndThread.Create(AOwner: TComponent; Point: TPoint);
begin
FPoint := Point;
inherited Create;
end;
procedure TGetWndThread.Execute;
begin
ReturnValue := WindowFromPoint(FPoint);
end;
...
var
Wnd: HWND;
Thr: TGetWndThread;
begin
Thr := TGetWndThread.Create(nil, Point(Mouse.CursorPos.X, Mouse.CursorPos.Y - 40));
Wnd := Thr.WaitFor;
Thr.Free;
// использование Wnd
end
Альтернативные пути решения
Также было предложено протестировать условия, при которых проявляется данная ошибка (например, операционная система, темы оформления) и сделать код условным, чтобы избежать ненужного нагрузочного вызова где это возможно.
Дополнительные вопросы
Пользователь также интересуется, возможно ли полностью отключить эффект выделения системных кнопок. Это может быть полезно в ситуациях, когда реализуется собственная логика перетаскивания вкладок. Возможно, стоит задать отдельный вопрос по этой проблеме.
В данной статье рассмотрены причины неожиданного выделения системных кнопок в среде разработки Delphi и предложены возможные пути решения этой проблемы. Приведенный пример кода на Object Pascal демонстрирует, как можно обработать эту проблему, используя отдельный поток для выполнения функции WindowFromPoint.
Пользователь столкнулся с проблемой, когда при разработке приложения в Delphi в событии `MouseMove` происходит нежелательное выделение системных кнопок окна, что мешает реализации собственной логики перетаскивания элементов.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS