有关 textout() 的问题 ( 不要只看不顶啊 ) (300分)

  • 主题发起人 主题发起人 chshanghai
  • 开始时间 开始时间
联机帮助里有详细说明
 
虽然我不能帮上您,但有些思路我觉得还想说说:
基于您现在的描述,我觉得您从开始设计这个项目的时候,您是没有考虑到全部的实现问
题的,尤其是对象管理方面的层次关系。到现在想要在基本系统上实现比较高级的内容,会
有些困难。我的理解是从对象管理开始,图-->层-->点线元素-->注记、颜色、操作,分层
管理才能简化设计和不断扩充。比如一些点线的绘制,应该是基于层对象的,而层对象是由
总图管理的,这样一级管一级形成管理链,才能提供虚层处理等高级功能。只有在分层管理
的基础上,每个对象本身才可以针对性地提供一些高效率的算法或汇编优化。bmp 多一些不
是问题,问题是多了以后的优化和操作管理。因为已经存在的 bmp 这样的对象,在内存建
立多个产生的内存耗用很小,消耗内存的不是对象本身,而是 bitmapImage 的实际图形数
据。yysun 曾经写有一本<计算机地图制图>的书,写的是地图制图,您如果需要,可以在:
http://ale.xicp.net/upload/Map.rar 下载得到(没有附书代码,一周后删除)。
 
to 小雨哥
多谢指教, 其实这个项目我还没有开始.
因为我以前没有做个图形方面的东董.
我现在主要是试试 有关技术.

本来我的向通过 Timage 来实现图层, 只要设置 transparent 为true , 这样就可以实现
图层的效果, 但我发现 , 在 属性 transparent =true 的canvas 上操作速度特别慢.
而姐在 pIII 以下的机器上 特别明显. 所有这种方法不行.

我现在主要是在图形移动时遇到了 这个解决不了的问题.

主要有以下几种方法(我所知道的):
用多个 image
在 属性 transparent =true 的canvas 上操作速度特别慢.
而姐在 pIII 以下的机器上 特别明显.


用一个 Timage
1. clear()
move()
draw()
这种方法 主要是 会破坏其他图形.
所以我改进
2.
设置 image.canvas.pen.mode=pmxor;
draw()
move()
draw()
但这种方法对文字不行

3.
clear
move
draw
(drawall 在把其他图形全部重画)
这种方法在 图形对象少时有用,但图形多时, 特慢 你想想 mousemove() 事件 就知道了.




以下是我的系统的初步想法,(也是我在试试的程序) 写的简单,多了, 你可能没有兴趣看.

Ticon 是所有类的祖先
.....................
position:Tpoint
parent:TmultiIcon

constructor create(Acanvas:Tcanvas;Aparent:TmultiIcon;Apoint:Tpoint);
procedure draw;overload; // 绘制
procedure draw(Acanvas:Tcanvas);overload;virtual;abstract
procedure clear; //擦除
procedure move(Awidth,Aheight:integer); abstract //移动
function isselect(Apoint:Tpoint):boolean;virtual abstract; //是否选中
procedure select(Aselected:boolean);virtual; //选中


Ticons=class //管理多个Ticon 的对象,
flist:Tlist;
...............

还有其他一些辅助的其他类.


下面的 这些之类 主要是 管理 多个 ico 组成的对象 ..
TmultiIcon =clas (Ticon) //多个 Icon 组成的图形
ficons :Ticons
........................

Telectricon=class(TmultiIcon)
.........................



// 下面有N 多个Telectricon 的子类 只要实现 Draw(Acanvas) 方法 ,和savestream 二个方法.
Tswitch= class(Telectricon)
...........................


请各位帮我想向有什么好办法?
 
不,您的类定义看上去没错,但称呼有问题。
您描述的,是一个典型的精灵系统的框架。

这时候:“Ticon 是所有类的祖先”这句不正确。正确的应该这个是一个“精灵”。它是
一个独立的对象类,而不是其它类的祖先。

“Ticons=class // 管理多个Ticon 的对象”一句,应该理解为收集类,它管理并记录
“精灵”的编号和数量,其中起码应该有 ADD、DEL、CONST 等方法。

“TmultiIcon =clas (Ticon) // 多个 Icon 组成的图形”一句,可以理解为层,即图形层
。于是,上面您在 Ticon 中定义的 "clear"、"isselect" 和 "select" 方法,应该在这个
类中实现。

可以有多个图层,所以还需要一个对图层管理的类(也是一个收集类)。其中也是 ADD、
DEL 等方法。这个类依附在总画面上,由总画面在 Draw 时,调用遍列方法检索图层管理类
有多少图层,逐一调用各个层的 Draw 方法,各个层也通过遍列检索有多少“精灵”在这个
层上,分别调用每个“精灵”的 Draw 方法。
 
使用 TImage 做图层,只是在非常简单的情况下使用(精灵数很少的情况),这个类负责显
示图形,但其中却包含了最少 3 个类,一直到图像显示出来,其中的 HDC 是一层一层传递
肯定非常耗时,从最深的 Bitamp.Canvas.Handle 到 Image.Canvas.Handle 间传递图形,
实际上只要一个 Bitblt 就完成了,而在 TImage 中却需要经过很多层传递。经过测试的数
据是:使用 TImage 显示图形的速度比使用 PaintBox 显示的速度慢 3 倍。当然 2 者不是
等价的类,只是说明显示速度。
 
to 小雨哥

谢谢指教.
听君一席话, 胜读十年书啊 . 呵呵

那你的意思 是, 我不用用 Image 做为 图层, 而用Scrollbox , 活着pain 一类的 是吗.
这个, 我等会试试.

那么对于我上面遇到的问题, 有什么建议. 或者有什么其他方法.
再次谢谢.
 
现在我自己的记性真差,每次回答过的问题,再要回答时,都要从新看一遍才知道说了些什
么。这个问题我也帮不了您什么,一定要达到需要的目的,只有编码编码再编码。因为如果
是我自己要达到这个目的,我可以通过汇编级的二个位图高速相关色 XOR 来实现这个效果
(利用透明不传输不处理方案),别的方案我还不知道。还是听听其他朋友的高见吧。
 
to 小雨哥
呵呵, 谢谢.
我以找到一个C++ 写的Cad 方面的, 呵呵, 不过对C++不太熟悉
正在死啃. 呵呵.
不过, 可能是我自己钻进死牛角尖了.

你现在还在杭州吗?
我在上海, 有时间来上海我请你吃饭. 呵呵.



 
后退
顶部