答案 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,那么它会强制重新绘制并且这有效,但遭受闪烁