При реализации кастомных изображений при перетаскивании в Delphi пользователи иногда сталкиваются с проблемой, когда изображение не становится полностью непрозрачным, несмотря на то, что белые пиксели становятся прозрачными. В этом руководстве мы рассмотрим, как изменить поведение drag image, чтобы достичь желаемого эффекта непрозрачности.
Описание проблемы
Пользователи успешно реализуют кастомные изображения для перетаскивания, наследуя класс от TDragControlObject и переопределяя функцию GetDragImages, а также добавляя битмап в TDragImageList. При этом белые пиксели делаются прозрачными, но оставшаяся часть изображения остается непрозрачной.
Решение проблемы
Для того чтобы изменить поведение drag image и сделать его полностью непрозрачным, можно использовать функцию ImageList_SetDragCursorImage. Эта функция обычно используется для объединения изображения перетаскивания с изображением курсора, после чего реальный курсор обычно скрывается, чтобы избежать путаницы (показ двух курсов).
Если предоставить то же самое изображение перетаскивания как изображение курсора, с таким же смещением, и не скрыть реальный курсор, получится непрозрачное изображение перетаскивания с курсором. Пустое изображение перетаскивания также может быть использовано, но первый способ может быть проще в реализации.
Пример кода
Ниже приведен пример кода на Object Pascal, который демонстрирует, как реализовать непрозрачное изображение перетаскивания в Delphi XE2:
unit Unit1;
...
type
TMyDragObject = class(TDragObjectEx)
private
FDragImages: TDragImageList;
FImageControl: TWinControl;
protected
function GetDragImages: TDragImageList; override;
public
constructor Create(ImageControl: TWinControl);
destructor Destroy; override;
end;
...
constructor TMyDragObject.Create(ImageControl: TWinControl);
begin
inherited Create;
FImageControl := ImageControl;
end;
destructor TMyDragObject.Destroy;
begin
FDragImages.Free;
inherited;
end;
function TMyDragObject.GetDragImages: TDragImageList;
var
Bmp: TBitmap;
Pt: TPoint;
begin
if not Assigned(FDragImages) then begin
Bmp := TBitmap.Create;
try
Bmp.PixelFormat := pf32bit;
Bmp.Canvas.Brush.Color := clFuchsia;
// ... (код создания битмапа и прочие настройки)
FDragImages.AddMasked(Bmp, clFuchsia);
finally
Bmp.Free;
end;
end;
Result := FDragImages;
end;
...
procedure TForm1.Button2MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
(Sender as TWinControl).BeginDrag(False);
ImageList_SetDragCursorImage(
(FDragObject as TMyDragObject).GetDragImages.Handle, 0, 0, 0);
end;
...
procedure TForm1.Button2StartDrag(Sender: TObject; var DragObject: TDragObject);
begin
DragObject := TMyDragObject.Create(Sender as TWinControl);
DragObject.AlwaysShowDragImages := True;
FDragObject := DragObject;
end;
...
Результат выполнения кода
Приведенный выше код создает непрозрачное изображение перетаскивания, которое будет отображаться при перетаскивании элемента Button2. Изображение будет включать в себя границу в 2 пикселя прозрачности вокруг, чтобы показать, что изображение может быть прозрачным.
Дополнительные настройки
Если вы хотите увидеть, как система обрабатывает изображения, можно изменить вызов ImageList_SetDragCursorImage, чтобы предоставить точку для горячего перетаскивания, например:
ImageList_SetDragCursorImage(
(FDragObject as TMyDragObject).GetDragImages.Handle, 0, 15, 15);
Теперь можно будет одновременно увидеть и непрозрачное, и полупрозрачное изображения.
Заключение
Мы рассмотрели, как изменить стандартное поведение drag image в Delphi, чтобы достичь полной непрозрачности. Используя функцию ImageList_SetDragCursorImage, можно объединить изображение перетаскивания с изображением курсора, что позволит достичь желаемого эффекта. Этот метод можно адаптировать под различные нужды разработки пользовательского интерфейса и улучшения взаимодействия с пользователем.
Пользователи сталкиваются с проблемой непрозрачности изображения при перетаскивании в Delphi, когда, несмотря на то что белые пиксели становятся прозрачными, основное изображение остается неполностью прозрачным.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.