1、我希望拖动图片的时候,画面不闪烁。我是这么写的:
void CMyDrawTest2View::OnDraw(CDC* pDC)
{
CMyDrawTest2Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc); showPicture(startOfPic);
}void CMyDrawTest2View::OnMouseMove(UINT nFlags, CPoint point)
{
startOfPic=point;
Invalidate(); CView::OnMouseMove(nFlags, point);
}//显示图片
void CMyDrawTest2View::showPicture(CPoint inpStartOfPic)
{
//1、用当前设备DC创建内存DC
CDC* pDC=GetDC();
CDC MemDC;
MemDC.CreateCompatibleDC(pDC); //2、用内存DC画图
CBitmap m_Bitmap;
m_Bitmap.LoadBitmap(IDB_BITMAP1);
CBitmap *pOldBitmap=MemDC.SelectObject(&m_Bitmap); //3、将内存DC中的图形贴回当前设备DC
BITMAP bm;
m_Bitmap.GetObject(sizeof(BITMAP),&bm);
pDC->BitBlt(inpStartOfPic.x,inpStartOfPic.y,200,200,&MemDC,0,0,SRCCOPY);
MemDC.SelectObject(pOldBitmap);
ReleaseDC(pDC);
}可是好像没什么效果啊;哪里写错了?2、如果是自己在视图页面中鼠标当前位置处画一个红色的(大小固定的)矩形
,希望鼠标拖动矩形的时候画面不闪烁,又该怎么做呢?
void CMyDrawTest2View::OnDraw(CDC* pDC)
{
CMyDrawTest2Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc); showPicture(startOfPic);
}void CMyDrawTest2View::OnMouseMove(UINT nFlags, CPoint point)
{
startOfPic=point;
Invalidate(); CView::OnMouseMove(nFlags, point);
}//显示图片
void CMyDrawTest2View::showPicture(CPoint inpStartOfPic)
{
//1、用当前设备DC创建内存DC
CDC* pDC=GetDC();
CDC MemDC;
MemDC.CreateCompatibleDC(pDC); //2、用内存DC画图
CBitmap m_Bitmap;
m_Bitmap.LoadBitmap(IDB_BITMAP1);
CBitmap *pOldBitmap=MemDC.SelectObject(&m_Bitmap); //3、将内存DC中的图形贴回当前设备DC
BITMAP bm;
m_Bitmap.GetObject(sizeof(BITMAP),&bm);
pDC->BitBlt(inpStartOfPic.x,inpStartOfPic.y,200,200,&MemDC,0,0,SRCCOPY);
MemDC.SelectObject(pOldBitmap);
ReleaseDC(pDC);
}可是好像没什么效果啊;哪里写错了?2、如果是自己在视图页面中鼠标当前位置处画一个红色的(大小固定的)矩形
,希望鼠标拖动矩形的时候画面不闪烁,又该怎么做呢?
解决方案 »
- 求个vc6.0的msdn的下载地址,要能用的
- IDC如何赋给控件?
- 这个clsaa C*dlg类是怎么使用的啊
- this->onok()的疑问
- 桌面上绘图的问题
- 在创建ActiverX控件时,我不能增加方法及属性?
- 请教大虾:在使用CTreeCtrl时能不能让每一个节点(Item)包含一个自定义的附属信息,比如对象指针或字符串,然后在获得用户点击的节点时,
- 请问有关开发Word,Excel,PowerPoint的插件的问题!
- 用VC如何合并Word文件
- How to put an ActiveX control into a DLL?
- socket传数据结构问题
- 各位大哥,如果在CFORMVIEW上使用TOOLTIP。COMPONENT中的TOOLTIP SUPPORT在CFORMVIEW中好象不能用?请各位指点一下!谢谢
//2、用内存DC画图
CBitmap m_Bitmap;
m_Bitmap.LoadBitmap(IDB_BITMAP1);
CBitmap *pOldBitmap=MemDC.SelectObject(&m_Bitmap); //3、将内存DC中的图形贴回当前设备DC
BITMAP bm;
m_Bitmap.GetObject(sizeof(BITMAP),&bm);通通放到CMyDrawTest2View初始化的时候创建,要不然每次重画的时候都要
创建一次,不闪烁才怪呢。
private:
CDC MemDC;//记录内存DC
CBitmap m_Bitmap;//记录要加载的图片
BITMAP bm;//记录要加载的图片
CBitmap *pOldBitmap;//用来释放图片的变量
---MyDrawTest2View.cpp
CMyDrawTest2View::~CMyDrawTest2View()
{
MemDC.SelectObject(pOldBitmap);
}void CMyDrawTest2View::OnInitialUpdate()
{
CView::OnInitialUpdate(); //1、用当前设备DC创建内存DC
CDC* pDC=GetDC();
MemDC.CreateCompatibleDC(pDC); //2、用内存DC画图
m_Bitmap.LoadBitmap(IDB_BITMAP1);
pOldBitmap=MemDC.SelectObject(&m_Bitmap);
m_Bitmap.GetObject(sizeof(BITMAP),&bm);
}void CMyDrawTest2View::OnDraw(CDC* pDC)
{
CMyDrawTest2Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc); pDC->BitBlt(startOfPic.x,startOfPic.y,200,200,&MemDC,0,0,SRCCOPY);
}void CMyDrawTest2View::OnMouseMove(UINT nFlags, CPoint point)
{
startOfPic=point;
Invalidate(); CView::OnMouseMove(nFlags, point);
}应该可以了吧,怎么还是闪烁啊?是不是图片数据太大,避免不了闪烁问题?
要不然鼠标移动太多太频繁,你的图还梅画完,就要重新在化一遍,把它放在Move里面
可以延缓鼠标移动消息
00
{
CMyDrawTest2Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc); static bool bshow =false;
if(!bshow)
{
showPicture(startOfPic);
bshow =true;}}void CMyDrawTest2View::OnMouseMove(UINT nFlags, CPoint point)
{
startOfPic=point;
showPicture(startOfPic);
Invalidate(); CView::OnMouseMove(nFlags, point);
}
{
CMyDrawTest2Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc); static bool bshow =false;
if(!bshow)
{
showPicture(startOfPic);
bshow =true;}}void CMyDrawTest2View::OnMouseMove(UINT nFlags, CPoint point)
{
startOfPic=point;
showPicture(startOfPic);
Invalidate(); CView::OnMouseMove(nFlags, point);
}
~~~~~~~~~这样才不会重画背景.
或者重载
CWnd::OnEraseBkgnd
afx_msg BOOL OnEraseBkgnd( CDC* pDC );
然后什么也不做.
{
CMyDrawTest2Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc); static bool bshow =false;
if(!bshow)
{
showPicture(startOfPic);
bshow =true;}}void CMyDrawTest2View::OnMouseMove(UINT nFlags, CPoint point)
{
startOfPic=point;
showPicture(startOfPic);
Invalidate(); CView::OnMouseMove(nFlags, point);
}