关于画线消失的问题

christina1206 2007-05-23 09:48:45
在窗体上自由画线后,每次只要一最小化窗口或者别的窗口挡着时在回到窗体上,画的线就都没了,各位帮忙指教一下这是怎么回事?该怎么解决呢?
...全文
513 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
christina1206 2007-05-28
  • 打赏
  • 举报
回复
我刚学没几天,我也思考了还是没想明白可能比较笨吧!所以才不耻下问的!请求大家帮助!
池龙 2007-05-28
  • 打赏
  • 举报
回复
搂主,这么多人理论也给你了,代码也给你了,你不能自己思考看看?难道干脆要直接帮你把代码写完了才行?
christina1206 2007-05-28
  • 打赏
  • 举报
回复
保证要canvas到 onpaint里就不会消失了~!!什么意思?能说详细点吗?谢谢!
christina1206 2007-05-28
  • 打赏
  • 举报
回复
阿菠萝我想了好几天还是不知道怎么把我那个存在TList中!我只需要画直线要画多条不是就一条,就是把你给我那个短的画线的代码的基础上画多条就可以了而且不消失!谢谢!拜托帮帮我!
dakuku 2007-05-28
  • 打赏
  • 举报
回复
保证要canvas到 onpaint里就不会消失了~!!
cnzzlp 2007-05-28
  • 打赏
  • 举报
回复
那个res里面包含了,一些鼠标光标,一些图片资源.
christina1206 2007-05-28
  • 打赏
  • 举报
回复
{$R dres.res}这个是什么意思呢?我按照阿波罗那段长的代码演示说这个错误大家帮分析一下“cannot assign a nil to a TBrush"还有”List index out of bounds(0)"这些都是什么问题呢?谢谢!
cnzzlp 2007-05-25
  • 打赏
  • 举报
回复
要记住N条线的两点坐标才行,用一个对象保存..
你先搞清楚paint具体做什么用的...
christina1206 2007-05-25
  • 打赏
  • 举报
回复
成功是成功了不过只能画一条线啊!能在这基础上可以随意画多条吗怎么解决呢?谢谢
cnzzlp 2007-05-25
  • 打赏
  • 举报
回复
OnPaint事件产生的代码!
christina1206 2007-05-25
  • 打赏
  • 举报
回复
我试了一下为什么说FormPaint没定义呢?怎么解决?Form在event里没找到FormPaint事件啊!
池龙 2007-05-25
  • 打赏
  • 举报
回复
楼上的朋友,用TImage绝对不是最好的方案。不仅容易闪烁,而且如果不对Resize作处理,很容易会出现某些区域无法显示的问题。
何鲁青 2007-05-25
  • 打赏
  • 举报
回复
告诉你我的一个心得:



那就是画线的时候最好是画在TImage控件上,画在image上的线是不会因为重画而消失的。
你可以将一个image覆盖在form上面,也不会影响到程序的整体外观。



OK,给分吧。
池龙 2007-05-25
  • 打赏
  • 举报
回复
呵呵,这是矢量绘图的操作,不是三两句话能解决的问题,我把大概的思路写给你,你可以自己考虑看看,呵呵。

元素的定义和管理:
  每种元素定义一个结构或者是类,用于保存它的基本属性(比如线宽、线型、颜色等)。
  用TList或TObjectList保存所有的元素。

刷新:
  将刷新作一个独立的过程。
  每次刷新都从底层重画到顶层。
  使用双缓冲的技术可以确保不会闪烁。
  在Form(或其他容器)的OnPaint事件中调用刷新的过程。

选取:
  鼠标点击时,根据元素的区域判断选中的元素,之后可以对其操作。

简单的例子,在内存中维护了一个元素的列表,里面有三条直线的记录。创建一个TBitmap,作为双缓冲中用于绘制的画布。
绘制的时候,首先在TBitmap的Canvas上画背景,然后以一个循环画三条直线,最后将整个Canvas的内容复制到用于显示的Canvas上。
鼠标点击的时候,首先取得鼠标的指针位置,然后以一个循环依次判断此点是否在三条直线的区域内,如果是,则设置选中的标记,再刷新画布。
移动,无非就是处理鼠标位置,并刷新而已,没什么特别的东西。
christina1206 2007-05-25
  • 打赏
  • 举报
回复
要使我那个原来的代码基础上有解决的办法吗?
christina1206 2007-05-25
  • 打赏
  • 举报
回复
呵呵不太懂啊!能给个画多条线的具体代码看看吗?谢谢!
cnzzlp 2007-05-24
  • 打赏
  • 举报
回复
你要想记住多条线,,就得保存对象的点做标了.我上面写的大串是用list保存的...
cnzzlp 2007-05-24
  • 打赏
  • 举报
回复
paint事件发生在,Form里的对象被遮住,隐藏后又展示时\触发...,resize,refresh等也包含里.
cnzzlp 2007-05-24
  • 打赏
  • 举报
回复
这个是把画线,画矩形,的点都记录在一个list中...,然后根据对象进行重绘...

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;

type
TForm1 = class(TForm)
procedure FormMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure FormCreate(Sender: TObject);
procedure FormPaint(Sender: TObject);
procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
private
{ Private declarations }
public
{ Public declarations }
ptStart,ptEnd: TPoint;
bDown: Boolean;
end;

var
Form1: TForm1;
// DrawList1: TList;

implementation

{$R *.dfm}

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
ptStart.X := x;
ptStart.Y := y;
bDown := True;
end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if bDown then
begin
ptEnd.X := x;
ptEnd.Y := y;
Refresh;
end;
end;

procedure TForm1.FormPaint(Sender: TObject);
begin
Canvas.MoveTo(ptStart.X,ptStart.Y);
canvas.LineTo(ptEnd.X,ptEnd.Y);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
bDown := False;
end;

procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
bDown := False;
end;

end.
christina1206 2007-05-24
  • 打赏
  • 举报
回复
阿波罗好热心哦!不过怎么这么复杂阿我都看不太懂?呵呵!我就画直线!能简化一下给我一下吗?谢了!这样就能保证直线在窗口化的时候不消失了吗?
加载更多回复(10)

5,386

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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