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、如果是自己在视图页面中鼠标当前位置处画一个红色的(大小固定的)矩形
,希望鼠标拖动矩形的时候画面不闪烁,又该怎么做呢?

解决方案 »

  1.   

    把这些:
            //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初始化的时候创建,要不然每次重画的时候都要
    创建一次,不闪烁才怪呢。
      

  2.   

    多谢楼上的老大。我改成下面的样子了:---MyDrawTest2View.h
    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);
    }应该可以了吧,怎么还是闪烁啊?是不是图片数据太大,避免不了闪烁问题?
      

  3.   

    试一试在Invalidate();后加上UpdateWindow()。
      

  4.   

    把OnMouseMove 的Invalidate();去掉,画图操作放在OnMouseMove里面,
    要不然鼠标移动太多太频繁,你的图还梅画完,就要重新在化一遍,把它放在Move里面
    可以延缓鼠标移动消息
    00
      

  5.   

    使用InvalidateRect(),在参数中指定重绘区域,越小效果越好
      

  6.   

    在Invalidate()函数中式用FALSE参数,防止重绘背景,闪烁的问题一般是重绘背景产生的。
      

  7.   

    void CMyDrawTest2View::OnDraw(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);
    }
      

  8.   

    void CMyDrawTest2View::OnDraw(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);
    }
      

  9.   

    Invalidate(FALSE)
             ~~~~~~~~~这样才不会重画背景.
    或者重载
    CWnd::OnEraseBkgnd  
    afx_msg BOOL OnEraseBkgnd( CDC* pDC );
    然后什么也不做.
      

  10.   

    void CMyDrawTest2View::OnDraw(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);
    }