我是MFC新手,当我点击“添加”按钮时,屏幕会出现一个矩形,想通过鼠标拾取来拖动他,现在拾取和拖动都实现了,但是每当我鼠标移动的时候都会清屏,导致屏幕一直闪烁,想问问各位大虾怎么设置一个双缓冲使他不闪动,谢谢了,小弟分少,希望见谅。说我提问详细描述过长,所以删点没用到的函数和消息。
代码如下:
.cpp文件
// CloloView 构造/析构
CloloView::CloloView()
: CFormView(CloloView::IDD)
,m_isDown(false)
,m_isReady(false)
,num_1(0)
,num_2(0)
{
// TODO: 在此处添加构造代码
m_rect.left = 0;
m_rect.right = 100;
m_rect.top = 0;
m_rect.bottom = 100;                                        //RECT m_rect  在头文件中定义的
}
// CloloView 诊断
#ifdef _DEBUG
void CloloView::AssertValid() const
{
CFormView::AssertValid();
}
void CloloView::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
m_isReady = true;     //按下后,准备画
}
void CloloView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
POINT pt;
pt.x = point.x;
pt.y = point.y;
if(::PtInRect(&m_rect,pt)) //  判断鼠标是否在矩形区域中
{
m_isDown = true; //  按下鼠标左键
g_prePos.x = point.x;
g_prePos.y = point.y;
g_curPos.x = point.x;
g_curPos.y = point.y;
}
CFormView::OnLButtonDown(nFlags, point);
}
void CloloView::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
if(m_isDown)
{
m_isDown = false;
}
CFormView::OnLButtonUp(nFlags, point);
}
void CloloView::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
if(m_isDown)
{
g_curPos.x = point.x;
g_curPos.y = point.y;
int offsetx = g_curPos.x - g_prePos.x;          //  X的偏移量
int offsety = g_curPos.y - g_prePos.y; //  Y的偏移量
m_rect.left += offsetx;
m_rect.right += offsetx;
m_rect.top += offsety;
m_rect.bottom += offsety;
g_prePos.x = g_curPos.x;
g_prePos.y = g_curPos.y;                        //  实现拖动
}
if(m_isReady)
{
Invalidate();                                   //  清屏
}
CFormView::OnMouseMove(nFlags, point);
}
void CloloView::OnPaint()
{
if(m_isReady)
{
CPaintDC dc(this);
dc.Rectangle(&m_rect);
}
}

解决方案 »

  1.   


    HDC hDc = GetDC( hWnd ) ;//前屏画布 
    HDC hMDc = CreateCompatibleDC( hDc ) ;//内存画布 , 双缓冲用
    HBITMAP hBitmap = CreateCompatibleBitmap( hDc, WINDOW_WIDTH, WINDOW_HEIGHT ) ; //黑色位图
    SelectObject( hMDc, hBitmap ) ; //所有图像都先画在内存画布上 所有图画都画完后拷贝复制到前屏画布
    BitBlt( hDc,//目标画布
    0,//位于左上点x坐标
    0,//位于左上点y坐标
    WINDOW_WIDTH,//宽
    WINDOW_HEIGHT, //高
    hMDc,//源画布
    0,//源画布的左上点坐标x
    0,//源画布的左上点坐标y
    SRCCOPY ) ;删除画笔,释放画布