图形处理的难题
目前做的一个项目中需要有一个地图系统,地图背景是一张图片,上面会动态产生一些元素,这些元素包含图片和文字,元素可以拖动。
目前我使用的方法是每一个元素都是一个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; }