采用了双缓冲,为什么还闪烁?
void CMyview4::OnDraw(CDC* pDC)
{
CDocument* pDoc = GetDocument();
// TODO: add draw code here
CRect rc;
GetClientRect(rc);
rc.DeflateRect(25,50);//通过朝CRect的中心移动边以缩小CRect通过朝CRect的中心移动边以缩小
gridx=100;//网格数x
gridy=30;//网格数y
dx=rc.Width()/gridx;//每个网格的宽度
dy=rc.Height()/gridy;
CDC MemDC; //首先定义一个显示设备对象
CBitmap MemBitmap;//定义一个位图对象
//随后建立与屏幕显示兼容的内存显示设备
MemDC.CreateCompatibleDC(NULL);
//这时还不能绘图,因为没有地方画 ^_^
//下面建立一个与屏幕显示兼容的位图,至于位图的大小嘛,可以用窗口的大小,也可以自己定义(如:有滚动条时就要大于当前窗口的大小,在BitBlt时决定拷贝内存的哪部分到屏幕上)
MemBitmap.CreateCompatibleBitmap(pDC,rc.Width(),rc.Height()+100);
//将位图选入到内存显示设备中
//只有选入了位图的内存显示设备才有地方绘图,画到指定的位图上
CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap);
//先用背景色将位图清除干净,这里我用的是白色作为背景
MemDC.FillSolidRect(0,0,rc.Width(),rc.Height()+100,RGB(255,255,255));
CRect gridRect(rc.left,rc.top,rc.left+(int)dx*gridx,rc.top+(int)dy*gridy);// 取得画图区的大小
//填充背景
//CBrush brush(RGB(0,0,0));
//pDC->FillRect(&gridRect,&brush);
CPen Bluepen,Blackpen,Redpen;
Blackpen.CreatePen(PS_DOT,1,RGB(0,0,0));//黑色
Redpen.CreatePen(PS_SOLID,1,RGB(255,0,0));//红色PS_DOT
Bluepen.CreatePen(PS_SOLID,1,RGB(0,0,255));//蓝色
double x_left=0.0,x_right=0.0,y_top=0.0,y_bottom=0.0;
x_left=0;
x_right=gridx;
y_bottom=0;
y_top=gridy;
/******************画坐标****************************/
CPen*oldPen=MemDC.SelectObject(&Bluepen);
MemDC.MoveTo(gridRect.left,gridRect.bottom);
MemDC.LineTo(gridRect.right,gridRect.bottom);
MemDC.MoveTo(gridRect.left,gridRect.bottom);
MemDC.LineTo(gridRect.left,gridRect.top);
datadx=gridRect.Width()/gridx;//???
datady=gridRect.Height()/gridy;
///*******************标刻度****************///
oldPen=MemDC.SelectObject(&Blackpen);
CString t;
Xper=(x_right-x_left)/gridx;
Yper=(y_top-y_bottom)/gridy;
int px=0;
for(int xx=0;xx<=gridx*10;xx=xx+50)
{
MemDC.MoveTo(gridRect.left+px*(int)datadx,gridRect.bottom);
MemDC.LineTo(gridRect.left+px*(int)datadx,gridRect.bottom-5);
t.Format("%.d",xx);//%.0d用浮点型数来输出变量
MemDC.TextOut(gridRect.left+px*(int)datadx-10,gridRect.bottom+10,t);
px=px+5;
}
int py=0;
for(int yy=0;yy<=gridy*10;yy=yy+30)
{
MemDC.MoveTo(gridRect.left,gridRect.bottom-py*(int)datady);
MemDC.LineTo(gridRect.left+5,gridRect.bottom-py*(int)datady);
t.Format("%.d",yy);//%.0d用浮点型数来输出变量
MemDC.TextOut(gridRect.left-21,gridRect.bottom-py*(int)datady-10,t);
py=py+3;
}
/******************************网格的实现******************************************/
oldPen=MemDC.SelectObject(&Blackpen);
for(int k=5;k<=gridx;k=k+5)
{
MemDC.MoveTo(gridRect.left+k*(int)datadx,gridRect.bottom);
MemDC.LineTo(gridRect.left+k*(int)datadx,gridRect.top);
}
for(int u=3;u<=gridy;u=u+3)
{
MemDC.MoveTo(gridRect.left,gridRect.bottom-u*(int)datady);
MemDC.LineTo(gridRect.right,gridRect.bottom-u*(int)datady);
}
/*************************实时数据的显示*************************/
CMainFrame *pt=(CMainFrame*)AfxGetApp()->m_pMainWnd;//获得指向当前系统的主框架类对象的指针
CString str1=("设定扭矩:");
CString str2=("实际扭矩:");
MemDC.TextOut(gridRect.left,gridRect.bottom+50,str1);
MemDC.TextOut(gridRect.left+250,gridRect.bottom+50,str2);
char niuju[2];
_itoa(pt->Niuju,niuju,10);
MemDC.TextOut(gridRect.left+150,gridRect.bottom+50,niuju);
oldPen=MemDC.SelectObject(&Redpen);//画笔设置
int data[5]={0,10,15,14,30};
int i;
for(i=0;i<(pt->len4);i++)
{
MemDC.MoveTo(gridRect.left+(i*(int)datadx/10),gridRect.bottom-(pt->rec4[i])*(int)datady/10);//起始点:第一次为绘图为原点,之后为上一次的结束点
MemDC.LineTo(gridRect.left+((i+1)*(int)datadx/10),gridRect.bottom-(pt->rec4[i+1])*(int)datady/10);//
char Rec[2];
_itoa(pt->rec4[i+1],Rec,10);
MemDC.TextOut(gridRect.left+400,gridRect.bottom+50,Rec);
}
pDC->BitBlt(0,0,rc.Width(),rc.Height()+100,&MemDC,0,0,SRCCOPY); //绘图完成后的清理
MemBitmap.DeleteObject();
MemDC.DeleteDC();
}
之后我在框架类的成员函数里面
CFuwuqiDoc* pDoc = (CFuwuqiDoc*)GetActiveDocument();
pDoc->UpdateAllViews(NULL);
为什么 我画图时,窗口还闪烁啊?