下面的是在OnMouseMove()中的画矩形代码if (m_iCurSelected == RECTANGLE) //画矩形
{
CBrush *pOldBrush;
if (m_fillColor != RGB(255, 255, 255)) //当前有画刷选入
pOldBrush = pDC->SelectObject(&m_fillBrush);
else
pOldBrush = (CBrush*)pDC->SelectStockObject(NULL_BRUSH);
int nOldDrawMode = pDC->SetROP2(R2_NOTXORPEN);
pDC->Rectangle(&m_rect); //擦掉上次绘的矩形
m_PointEnd = point;
SetRect(&m_rect, m_PointBegin.x, m_PointBegin.y, m_PointEnd.x, m_PointEnd.y);
pDC->Rectangle(&m_rect);
pDC->SetROP2(nOldDrawMode);
pDC->SelectObject(pOldBrush);
m_iPreSelected = RECTANGLE;
}
解决方案 »
- 关于VC开发 C/S+Mysql,请给出一个比较系统的开发思路。
- 在OpenGL三维坐标中,怎么画圆呀?圆是平面的,但是处于三维空间中,怎么计算x、y、z坐标?谢谢
- 数码摄像机与工控机连接的问题!(急)
- 简单问题请教:WM_SYSKEYDOWN、WM_NCLBUTTONDOWN都是什么消息?
- 各位大虾指点
- 一个关于TAB控件的问题````急求高人解答````
- 菜鸟询问简单问题
- 下决心学C了,不知是直接学VC++好呢还是从C++学起?
- 怎样用VC调用IE浏览器并定制右键的快捷菜单?
- CComboBoxEx的使用——图标、插入、选择
- 钩子类型WH_CALLWNDPROC 和WH_GETMESSAGE区别?
- 目标跟踪时的抗旋转和抗遮挡
参考这个例子
双缓冲并不影响性能,一样很快的
//创建内存DC
CRect rect;
GetClientRect(&rect); CDC *pDC = GetDC();
CDC memDC;
CBitmap bitmap; memDC.CreateCompatibleDC(pDC);
bitmap.CreateCompatibleBitmap(pDC, rect.Width(), rect.Height());
CBitmap *pOldBitmap = memDC.SelectObject(&bitmap);
CPen *pOldPen = memDC.SelectObject(&m_pen); memDC.BitBlt(0, 0, rect.Width(), rect.Height(), pDC, 0, 0, SRCCOPY); //根据选项,开始画图
if (m_iCurSelected == RECTANGLE) //画矩形
{
CBrush *pOldBrush;
if (m_fillColor != RGB(255, 255, 255)) //当前有画刷选入
pOldBrush = memDC.SelectObject(&m_fillBrush);
else
pOldBrush = (CBrush*)memDC.SelectStockObject(NULL_BRUSH); int nOldDrawMode = memDC.SetROP2(R2_NOTXORPEN);
memDC.Rectangle(&m_rect); //擦掉上次绘的矩形 m_PointEnd = point;
SetRect(&m_rect, m_PointBegin.x, m_PointBegin.y, m_PointEnd.x, m_PointEnd.y);
memDC.Rectangle(&m_rect); memDC.SetROP2(nOldDrawMode);
memDC.SelectObject(pOldBrush); m_iPreSelected = RECTANGLE;
} pDC->BitBlt(0, 0, rect.Width(), rect.Height(), &memDC, 0, 0, SRCCOPY); memDC.SelectObject(pOldPen);
memDC.SelectObject(pOldBitmap);
memDC.DeleteDC();
ReleaseDC(pDC);
当然减少不必要的计算也是解决闪烁问题的重要方法。