使用DragImage在Drag& Drop期间绘制TPaintBox

时间:2010-02-09 11:16:42

标签: delphi drag-and-drop delphi-2007 paintbox

2 个答案:

答案 0 :(得分:2)

关键是在重绘绘画框之前隐藏拖动图像,并在此之后再次显示它。如果您在问题中替换此代码:

procedure TForm1.PaintBox1DragOver(Sender, Source: TObject; X,
  Y: Integer; State: TDragState; var Accept: Boolean);
var
  r: TRect;
  MustRepaint: Boolean;
begin
  MustRepaint := False;

  if State = dsDragEnter then
  begin
    FRectIsHot := False;
    MustRepaint := True;
  end
  else
  begin
    r := GetSensitiveRect;
    Accept := PtInRect(r, Point(X, Y));

    if Accept <> FRectIsHot then
    begin
      FRectIsHot := Accept;
      MustRepaint := True;
    end;
  end;

  if MustRepaint then
    PaintBox1.Invalidate;
end;

用这个

procedure TForm1.PaintBox1DragOver(Sender, Source: TObject; X,
  Y: Integer; State: TDragState; var Accept: Boolean);
var
  r: TRect;
begin
  if State = dsDragEnter then
  begin
    FRectIsHot := False;
    PaintBox1.Invalidate;
  end
  else
  begin
    r := GetSensitiveRect;
    Accept := PtInRect(r, Point(X, Y));

    if Accept <> FRectIsHot then
    begin
      FRectIsHot := Accept;
      ImageList_DragShowNolock(False);
      try
        PaintBox1.Refresh;
      finally
        ImageList_DragShowNolock(True);
      end;
    end;
  end;
end;

它应该有用。嗯,它适用于Windows XP 64位上的Delphi 2007。

在你的问题中对演示代码表示赞赏,这是让我们看到问题的绝佳方式。

答案 1 :(得分:1)

在XP上测试,Delphi 2010 - 我得到了工件,因此它与XP相关而在D2010中没有修复

编辑:

经过进一步调查 - 如果您拖动一个图标以便鼠标只进入框(但图标没有),则表示框正确绘制,只有当图标进入工具箱时才会出现工件。

我添加了代码,以便如果状态是dsDragMove,那么它会强制重新绘制并且这有效,但遭受闪烁