首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ Builder >

图形处理的难题解决思路

2012-03-04 
图形处理的难题目前做的一个项目中需要有一个地图系统,地图背景是一张图片,上面会动态产生一些元素,这些元

图形处理的难题
目前做的一个项目中需要有一个地图系统,地图背景是一张图片,上面会动态产生一些元素,这些元素包含图片和文字,元素可以拖动。
目前我使用的方法是每一个元素都是一个TImage,文字是在Timage对象上直接TextOutA写上去。
遇到问题是首先拖动元素和元素总数据变化刷新时会闪烁,其次刷新次数比较多时就会消耗掉资源导致程序不能再分配资源。
不知道我这样设计是不是有问题,如果思路上没问题,如何解决拖动、刷新闪烁和资源消耗问题。

[解决办法]
定义函数,如myDraw(),全局内存位图 ,如Bitmap, myDraw函数在Bitmap上画背景,及各元素,在需要的时候把Bitmap里更新到窗口。 要记住各元素的位置和大小。

 搞清楚Bitmap上像素位置和显示窗口上位置的对应关系(双向)。
 
 拖动麻烦点:在鼠标的Down事件里,根据鼠标位置和对应关系找是否选中某个元素,没有找到不管了。 
如果找到,a.在窗口上使用异或方式画元素外包围盒,
b.在鼠标Move事件里,移动包围盒位置(异或划线)
c.在鼠标UP事件了,根据包含盒,获得出元素的新位置,调用myDraw()重新会背景及元素,更新到窗口。
[解决办法]

C/C++ code
需要用缓冲dc。TImage的双缓冲不能很好的解决。//在指定的窗口中,画位图,填充整个用户窗口  //Ture为绘制成功,false为绘制失败  BOOL DrawBitmap(HWND Handle, HBITMAP hBitmap, int iClientHeight, int iClientWidth)  { if ( hBitmap == NULL )   return false;   BITMAP b;   int iBitmapH, iBitmapW;  GetObject( hBitmap, sizeof( BITMAP), &&b);   iBitmapH = b.bmHeight;   iBitmapW = b.bmWidth;   int x, y;   HDC hClientDC, hMemDC;   hClientDC = GetDC(Handle);   if ( hClientDC == NULL )   return false;  hMemDC = CreateCompatibleDC( hClientDC );   if ( hMemDC == NULL )   {        DeleteDC( hClientDC );     return false;   }   SelectObject( hMemDC, hBitmap );   x = 0;   while ( x < iClientWidth )   { y = 0;   while ( y < iClientHeight )   {ClientCanvas->Draw(x, y, Face);  BitBlt( hClientDC, x, y,iBitmapW, iBitmapH, hMemDC, 0, 0,SRCCOPY );   y = y + iBitmapH; }   x = x + iBitmapW; }   DeleteDC( hMemDC );   DeleteDC( hClientDC );   return true; } 

热点排行