图标移动地问题

chen_jun_fen 2002-03-05 01:32:36
我想要一个图标在地图上移动,不断地刷新地图,
我地思路是这样地:

首先重画地图,然后在显示图标,
这样的话,好像刷新地比较频繁 ,

各位有好地方法吗
...全文
30 47 打赏 收藏 转发到动态 举报
写回复
用AI写文章
47 条回复
切换为时间正序
请发表友善的回复…
发表回复
vericky 2002-03-06
  • 打赏
  • 举报
回复
加入
0313700000 2002-03-05
  • 打赏
  • 举报
回复
xx
WingfireWu 2002-03-05
  • 打赏
  • 举报
回复
void CreateMemBmp( char *filename , CBitmap *pBmpMem)
{
Static CRect rectWindowPrev(0, 0, 0, 0);
CRect rectWindow ; //get the rect show bitmap
::GetWindowRect(::GetDlgItem(::AfxGetMainWnd()->m_hWnd,IDC_SHOWMAP),&rect);

if(pBmpMem == NULL || rectWindow != rectWindowPrev)
{

CDC dc = m_ShowMap.GetDC(); // device context for painting
memdc.CreateCompatibleBitmap(&dc, rectWindow.Width(), rectWindow.Height());

CDC dcMem1;
CDC dcMem2;
dcMem1.CreateCompatibleDC(&dc);
dcMem1.CreateCompatibleDC(&dc);


HBITMAP *hbmp;
hbmp = (HBITMAP*)::LoadImage(::AfxGetInstanceHandle(), filename,IMAGE_BITMAP,0,0,LR_LOADFROMFILE) ; //????
CBitmap *pbmpPrev1 = dcMem1.SelectObject(CBitmap::FormHandle(hbmp));
CBitmap *pbmpPrev2 = dcMem2.SelectObject(& memdc);

::StretchBlt(dcMem1.m_hDC,0,0,rect.Width(),rect.Height(),dcMem2.m_hDC,0,0,BM.bmWidth,BM.bmHeight,SRCCOPY);

dcMem1.SelectObject(pbmpPrev1);
dcMem2.SelectObject(pbmpPrev2);

rectWindowPrev = rectWindow;
}
}
chen_jun_fen 2002-03-05
  • 打赏
  • 举报
回复
void CreateMemdc( char *filename , CDC &memdc )
{
}
假如要写这么个生成内存dc的话,该怎么写、

void CreateMemdc( char *filename , CBitmap &memdc )
{
Static CRect rectWindowPrev(0, 0, 0, 0);

CRect rectWindow ; //get the rect show bitmap
::GetWindowRect( ::GetDlgItem( ::AfxGetMainWnd()-> m_hWnd , IDC_SHOWMAP ) , & rect ) ;

if(memdc == NULL || rectWindow != rectWindowPrev)
{

HDC dc = m_ShowMap.GetDC()-> m_hDC ; // device context for painting
memdc.CreateCompatibleBitmap(& dc, rectWindow.Width(), rectWindow.Height());

HDC dcMem1;
HDC dcMem2;
dcMem1.CreateCompatibleDC(& dc);
dcMem1.CreateCompatibleDC(& dc);


HBITMAP *hbmp ;
hbmp = (HBITMAP*)::LoadImage( ::AfxGetInstanceHandle() , filename , IMAGE_BITMAP , 0 , 0 , LR_LOADFROMFILE ) ; //????
CBitmap *pbmpPrev1 = dcMem1.SelectObject(CBitmap::FormHandle(hbmp));
CBitmap *pbmpPrev2 = dcMem2.SelectObject(&memdc);

::StretchBlt(dcMem1.m_hDC, 0, 0, rect.Width(), rect.Height(), dcMem2.m_hDC , 0 , 0 , BM.bmWidth , BM.bmHeight , SRCCOPY ) ;

dcMem1.SelectObject(pbmpPrev1);
dcMem2.SelectObject(pbmpPrev2);

::DeleteObject( hbmp );
}

}
这样写对不对
111222 2002-03-05
  • 打赏
  • 举报
回复
1,

BOOL xxxxxxxxxx::OnEraseBkgnd(CDC* pDC)
{
return (TRUE);
}

2,

try MemDC

3,

try DirectDraw
WingfireWu 2002-03-05
  • 打赏
  • 举报
回复
dcMem1和dcMem2双缓冲!
目的是生成可以真接bitblt的pBmpMem!
chen_jun_fen 2002-03-05
  • 打赏
  • 举报
回复
这个生成的memdc 是 dcMem1吗
WingfireWu 2002-03-05
  • 打赏
  • 举报
回复
不能在对话框的OnPaint中用刷新!!!
要派生自己的CStatic控件,在CStatic控件的OnPaint中刷新才行!!

下面是个生成MemBmp的例子,没有调过:
void CElecMapDlg::ShowBMP(char *filename)
{
Static CBitmap* pBmpMem = NULL;
Static CRect rectWindowPrev(0, 0, 0, 0);

CRect rectWindow ; //get the rect show bitmap
::GetWindowRect( ::GetDlgItem( ::AfxGetMainWnd()-> m_hWnd , IDC_SHOWMAP ) , & rect ) ;

if(pBmpMem == NULL || rectWindow != rectWindowPrev)
{
delete pBmpMem;
pBmpMem = new CBitmap();

HDC dc = m_ShowMap.GetDC()-> m_hDC ; // device context for painting
pBmpMem->CreateCompatibleBitmap(&dc, rectWindow.Width(), rectWindow.Height());

HDC dcMem1;
HDC dcMem2;
dcMem1.CreateCompatibleDC(&dc);
dcMem1.CreateCompatibleDC(&dc);


HBITMAP *hbmp ;
hbmp = (HBITMAP*)::LoadImage( ::AfxGetInstanceHandle() , filename , IMAGE_BITMAP , 0 , 0 , LR_LOADFROMFILE ) ; //????
CBitmap *pbmpPrev1 = dcMem1.SelectObject(CBitmap::FormHandle(hbmp));
CBitmap *pbmpPrev2 = dcMem2.SelectObject(pBmpMem);

::StretchBlt(dcMem1.m_hDC, 0, 0, rect.Width(), rect.Height(), dcMem2.m_hDC , 0 , 0 , BM.bmWidth , BM.bmHeight , SRCCOPY ) ;

dcMem1.SelectObject(pbmpPrev1);
dcMem2.SelectObject(pbmpPrev2);

::DeleteObject( hbmp );
}

// 把pBmpMem bitblt到dc上
}
chen_jun_fen 2002-03-05
  • 打赏
  • 举报
回复
这个控件试放在某个dialog上的
chen_jun_fen 2002-03-05
  • 打赏
  • 举报
回复
m_ShowMap是与CStatic的Picture控件相关联的变量
WingfireWu 2002-03-05
  • 打赏
  • 举报
回复
m_ShowMap 是什么, 子控件??
chen_jun_fen 2002-03-05
  • 打赏
  • 举报
回复
做了,不过好像还可以忍受,不是很严重,

写几行代码,让我看看行不 ?
WingfireWu 2002-03-05
  • 打赏
  • 举报
回复
窗口每次绘图的时候都会调OnPaint, 包括拖图标的时候,这样每拖一步都读一次文件,慢死了!
这个实验你做了没有?开一个跟你的图标一样大的小窗口,从你的地图窗口拖过去?结果??
我的意思就是每次只有当你的背影最化的时候,就读文件,生成一张内丰存中的BMP!OnPaint中只用bitblt和简单的绘图操作而已!
chen_jun_fen 2002-03-05
  • 打赏
  • 举报
回复
其中一个函数试这样的
void CElecMapDlg::ShowBMP(char *filename)
{
// RedrawWindow() ;
/////////////////////////////////////////
HDC dc = m_ShowMap.GetDC()->m_hDC ; // device context for painting
// create a memory dc compatible with the paint dc

HDC memdc ;
memdc = ::CreateCompatibleDC( dc );

HBITMAP *hbmp ;
BITMAP BM;

hbmp = (HBITMAP*)::LoadImage( ::AfxGetInstanceHandle() , filename , IMAGE_BITMAP , 0 , 0 , LR_LOADFROMFILE ) ; //装入位图

::SelectObject( memdc , hbmp ) ;

::GetObject( hbmp , sizeof( BITMAP ) , &BM ) ;

CRect rect ; //get the rect show bitmap
::GetWindowRect( ::GetDlgItem( ::AfxGetMainWnd()->m_hWnd , IDC_SHOWMAP ) , &rect ) ;

::StretchBlt( dc , 0 , 0 , rect.Width() , rect.Height() , memdc , 0 , 0 , BM.bmWidth , BM.bmHeight , SRCCOPY ) ;

::ReleaseDC( NULL , memdc ) ;
::ReleaseDC( NULL , dc ) ;
::DeleteDC( dc ) ;
::DeleteDC( memdc ) ;
::DeleteObject( hbmp ) ;
}
chen_jun_fen 2002-03-05
  • 打赏
  • 举报
回复
什么叫文件初始化的时候读 ,详细点 !!
WingfireWu 2002-03-05
  • 打赏
  • 举报
回复
天哪,你在OnPaint中读文件?
文件在初始化的时候读!



chen_jun_fen 2002-03-05
  • 打赏
  • 举报
回复
to panda_w(好想睡啊!) :

具体怎样做,可以说说吗
chen_jun_fen 2002-03-05
  • 打赏
  • 举报
回复
void CElecMapDlg::OnPaint()
{
RefreshMap( item ) ;
} ;
void RefreshMap( int item )
{
char filename[255] ;
strcpy( filename , map.GetFileName( item ) ) ;
int file = IsJPGFile( filename ) ;
if ( file == 1 )
ShowJPG( filename ) ;
else if ( file == 2 )
ShowBMP( filename ) ;
else
ShowWMF( filename ) ;
ShowMonitor( item ) ;
ShowArea( item ) ;
}

这写只是我写的函数而已 ,其中ShowWmf , ShowBMP , ShowJPG
还有很多代码
panda_w 2002-03-05
  • 打赏
  • 举报
回复
解决抖动一般这样
在内存中CreateDC,
画完后拷贝到屏幕上
lansenet 2002-03-05
  • 打赏
  • 举报
回复
我说了呀,刷新当然很频繁了,而且在每移动一次都要刷新,
WingfireWu的缓冲问题,也是一个很重要的问题~~~~
加载更多回复(27)

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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