• 其他语言



可移植和可重用 GUI 控件的设计
页面和feed选项
打印
收藏此页
Digg此页 | 添加到您的del.icio.us帐号
目录

快速绘制和事件处理
应解决的最后但并非不重要的问题是,如何快速对事件做出反应(至少是重新绘制事件)。当处理大型数据集时,控件应允许您快速地滚动和缩放内容。此处的主要问题是,事件处理和绘图函数是由用户定义的(通过上面描述的界面),而控件中的每个元素在绘图和事件处理中可以采用自己的实现方式。因此,不能保证快速进行处理。不过,可以减少元素函数调用的数量。

void CContent::DrawContent(idvc::IPainter* p)
{
// 确定应重新绘制的无效长方形
idvcfrw::CInvalidRegion InvalidRegions(draw_rect, valid_rect);

for(int i = 0; i < InvalidRegions.size(); ++i)
    {   
	 // 得到对应于下一个无效区域的长方形
idvc::drect rect = InvalidRegions[i];

// 查找并重新绘制与无效长方形相交的节点
NodeSet nodes = graph->HitNodeTest(rect.left, rect.top, rect.right, rect.bottom);
for_each(nodes.begin(), nodes.end(), DrawNode(p,scale));

	 // 查找并重新绘制与无效长方形相交的边
EdgeSet es = graph->HitEdgeTest(rect.left, rect.top, rect.right, rect.bottom);
for_each(es->Begin(), es->End(), DrawEdge(p,scale));
    };
};      
利用窗口事件中也拥有发生事件的点或长方形这一事实,可采用与绘图类似的方式来组织事件处理(至少对于窗口事件而言)。这样,控件可以确定节点与边,这些节点与边受任何给定事件的影响,而且只针对这些元素调用事件处理函数,因此大大地减少了处理时间。

上一部分1  2  3  4  5  下一部分

第 4 页, 共 7 页