加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

delphi – 绘制标题部分拖动图像

发布时间:2020-12-15 09:11:49 所属栏目:大数据 来源:网络整理
导读:我正在使用Delphi 2006. 我有一个自定义标题控件,我从头开始编写.它几乎完成了,除了当用户拖动标题部分以改变其位置时我不知道如何绘制标题部分的半透明拖动图像. Delphi中的THeaderControl做得很好但是它是windows头控件的子类,我的不是,它是从头开始编写的
我正在使用Delphi 2006.

我有一个自定义标题控件,我从头开始编写.它几乎完成了,除了当用户拖动标题部分以改变其位置时我不知道如何绘制标题部分的半透明拖动图像.

Delphi中的THeaderControl做得很好但是它是windows头控件的子类,我的不是,它是从头开始编写的.所以我想知道是否有一个Windows功能为您绘制这个或者您必须自己绘制它.

谢谢

解决方法

实现GetDragImages.例如.如下:

type
  THeader = class(TCustomControl)
  private
    FColWidth: Integer;
    FDragImages: TDragImageList;
    FDragIndex: Integer;
    FDragPos: TPoint;
  protected
    procedure DragOver(Source: TObject; X,Y: Integer; State: TDragState;
      var Accept: Boolean); override;
    procedure DoEndDrag(Target: TObject; X,Y: Integer); override;
    function GetDragImages: TDragImageList; override;
    procedure MouseDown(Button: TMouseButton; Shift: TShiftState;
      X,Y: Integer); override;
    procedure MouseMove(Shift: TShiftState; X,Y: Integer); override;
    procedure Paint; override;
  public
    constructor Create(AOwner: TComponent); override;
  end;

{ THeader }

constructor THeader.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  ControlStyle := ControlStyle + [csDisplayDragImage];
  DragCursor := crNone;
  FColWidth := 100;
end;

procedure THeader.DoEndDrag(Target: TObject; X,Y: Integer);
begin
  FreeAndNil(FDragImages);
  // Eat inherited if you do not publish the default drag events
end;

procedure THeader.DragOver(Source: TObject; X,Y: Integer;
  State: TDragState; var Accept: Boolean);
begin
  // Eat inherited if you do not publish the default drag events
  Accept := Source = Self;
end;

function THeader.GetDragImages: TDragImageList;
var
  Bmp: TBitmap;
begin
  if FDragImages = nil then
  begin
    FDragImages := TDragImageList.Create(nil);
    Bmp := TBitmap.Create;
    try
      Bmp.Width := FColWidth;
      Bmp.Height := Height;
      BitBlt(Bmp.Canvas.Handle,FColWidth,Height,Canvas.Handle,FDragIndex * FColWidth,SRCCOPY);
      FDragImages.Width := FColWidth;
      FDragImages.Height := Height;
      FDragImages.SetDragImage(FDragImages.Add(Bmp,nil),FDragPos.X,FDragPos.Y);
    finally
      Bmp.Free;
    end;
  end;
  Result := FDragImages;
end;

procedure THeader.MouseDown(Button: TMouseButton; Shift: TShiftState; X,Y: Integer);
begin
  inherited MouseDown(Button,Shift,X,Y);
  FDragIndex := X div FColWidth;
  FDragPos.X := X mod FColWidth;
  FDragPos.Y := Y;
end;

procedure THeader.MouseMove(Shift: TShiftState; X,Y: Integer);
begin
  inherited MouseMove(Shift,Y);
  if ssLeft in Shift then
    BeginDrag(False,Mouse.DragThreshold);
end;

procedure THeader.Paint;
var
  i: Integer;
  R: TRect;
begin
  for i := 0 to 3 do
  begin
    SetRect(R,i * FColWidth,(i + 1) * FColWidth,Height);
    Canvas.Brush.Color := clSilver;
    Canvas.Font.Color := clWhite;
    DrawFrameControl(Canvas.Handle,R,DFC_BUTTON,DFCS_BUTTONPUSH or
      DFCS_PUSHED or DFCS_ADJUSTRECT);
    Canvas.TextRect(R,R.Left + 2,R.Top + 2,'Column ' + IntToStr(i + 1));
  end;
end;

{ TForm1 }

procedure TForm1.FormCreate(Sender: TObject);
begin
  with THeader.Create(Self) do
  begin
    SetBounds(0,100,500,30);
    Parent := Self;
  end;
end;

如果您不想要拖动图像的垂直移动(就像在默认的THeaderControl中一样),那么每次鼠标移动时都必须重建拖动图像.见Drag image change while drag….

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读