请教!我的画布变色啦!

zqdue 2009-03-13 09:12:53
请教!用以下代码我可以在image里有一个随鼠标移动的十字架出来,但在image有图的情况下,这十字架的颜色就变了,如何让它不变色呢?

procedure TForm1.ImageMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);

procedure DrawCross(AX, AY: Integer);
begin
with image, Canvas do
begin
Pen.Color := clYellow;
Pen.Style := psSolid;
Pen.Mode := pmXor;
Pen.Width := 1;
MoveTo(ax, 0);
LineTo(ax, 600);
MoveTo(0, ay);
LineTo(800, ay);
end;
end;

begin
if ismove = True then
begin
Image.Parent.DoubleBuffered := True;
if (OldX <> -1) then
begin
DrawCross(OldX, OldY);
OldX := -1;
end;
if x > 0 then
begin
DrawCross(X, Y);
Image.Cursor := crCross;
{ store old position }
OldX := x;
OldY := y;
end;
end;
end;


...全文
99 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
zqdue 2009-03-13
  • 打赏
  • 举报
回复
楼上,我试过不行啊!
你能不能帮我改一下,我的代码啊!谢谢你啦!非常感谢!
bdmh 2009-03-13
  • 打赏
  • 举报
回复
你在清除原来线的时候用pmNotXor,画新线时设为常规模式
zqdue 2009-03-13
  • 打赏
  • 举报
回复
楼上,如果我去掉Pen.Mode := pmXor之后,我的十字架就会出现一大堆不会消失的十字架了!不行啊!
bdmh 2009-03-13
  • 打赏
  • 举报
回复
去掉Pen.Mode := pmXor;
zqdue 2009-03-13
  • 打赏
  • 举报
回复
那如何固定颜色啊?我就是不想颜色随着底色变化!
楼上,应该改那个地方啊?
bdmh 2009-03-13
  • 打赏
  • 举报
回复
你就定义固定颜色就可以了,用默认的画笔模式,难道你们要求颜色随着底色变化吗
zqdue 2009-03-13
  • 打赏
  • 举报
回复
因为我是需要做一个随鼠标移动的十字架,我试过用其它的(pmCopy),这十字架就会出现一大堆不消失的!
bdmh 2009-03-13
  • 打赏
  • 举报
回复
pmXor 输出颜色为canvas背景色和画笔颜色的异或,当画布有图时,画笔颜色和画布颜色进行异或运算,肯定和原始颜色不一样了
bdmh 2009-03-13
  • 打赏
  • 举报
回复
为什么使用Pen.Mode := pmXor;
zqdue 2009-03-13
  • 打赏
  • 举报
回复
但还是解决不了变色的问题!
如果我是用
paintbox1.invalidate;
paintbox1.update;
是可以不变色了,但却把我画的线也给清空了,暂时没有做到两全其美啊!可惜!
zqdue 2009-03-13
  • 打赏
  • 举报
回复
楼上你的建议很好!
我正在用PaintBox和image组合一起用!谢谢
taxi 2009-03-13
  • 打赏
  • 举报
回复
我一般这么做,首先,定义一个基类:
TGeometry = class
public
procedure Draw(ACanvas: TCanvas); virtual; abstract;
...
...
end;

从这个基类派生出一系列的图形:
TLine = class(TGeometry)
private
FBegin: TPoint;
FEnd: TPoint;
public
procedure Draw(ACanvas: TCanvas); override;
end;

TYourImage = class(TGeometry)
TCircle = class(TGeometry)
....
....

然后需要有一个TList保存这些类的实例,在绘图控件的OnPaint事件中画出所以这些图形,在其它事件中建立、删除、改变这些图形的属性。
zqdue 2009-03-13
  • 打赏
  • 举报
回复
楼上,你所说的方法!我还不太了解!能不能说详细一些呢!谢谢!
我需要在image里不断的增加一些图,然后在这个图之间画一些线!
taxi 2009-03-13
  • 打赏
  • 举报
回复
也可以从TCustomControl继承一个类,因为它有窗口句柄,可以调用InvalidateRect。
很久没用GDI了。
taxi 2009-03-13
  • 打赏
  • 举报
回复
不要在Image上画图,在TPaintBox的OnPaint中画Image和其它图形,当状态改变的时候调用Invalidate。
zqdue 2009-03-13
  • 打赏
  • 举报
回复
谢谢,楼主的方法!
期待有更好的方法!
bdmh 2009-03-13
  • 打赏
  • 举报
回复
给你一个方法,可能不能直接用擦除线的方法了,先把图像保存到流中,然后移动时先Bitmap.LoadFromStream(stream),然后在画自己的线,不知你的图像是不是很大,会不会产生闪烁

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi GAME,图形处理/多媒体
社区管理员
  • GAME,图形处理/多媒体社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧