采用了双缓冲,为什么还闪烁?

king5201006 2011-07-19 09:24:02
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);
为什么 我画图时,窗口还闪烁啊?
...全文
252 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
king5201006 2011-07-19
  • 打赏
  • 举报
回复
BOOL CMyview3::OnEraseBkgnd(CDC* pDC)
{
// TODO: Add your message handler code here and/or call default
return true;

return CView::OnEraseBkgnd(pDC);
}
用了,但是视图会卡死啊??怎么回事呢
king5201006 2011-07-19
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 wang471981125 的回复:]
引用楼主 king5201006 的回复:
void CMyview4::OnDraw(CDC* pDC)
{
CDocument* pDoc = GetDocument();
// TODO: add draw code here
CRect rc;
GetClientRect(rc);
rc.DeflateRect(25,50);//通过朝CRect的中心移动边以缩小CRect通……
[/Quote]
有问题吗?没有在OnEraseBkgnd重载,需要 return ture ?
龙行天下之Sky 2011-07-19
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 fandh 的回复:]

view里面OnEraseBkgnd是否重载了?并在里面直接返回了?
[/Quote]
DDDDDDD
Wang471981125 2011-07-19
  • 打赏
  • 举报
回复
[Quote=引用楼主 king5201006 的回复:]
void CMyview4::OnDraw(CDC* pDC)
{
CDocument* pDoc = GetDocument();
// TODO: add draw code here
CRect rc;
GetClientRect(rc);
rc.DeflateRect(25,50);//通过朝CRect的中心移动边以缩小CRect通过朝CRect的中心移动边以缩小

gri……
[/Quote]
。。。。
fandh 2011-07-19
  • 打赏
  • 举报
回复
view里面OnEraseBkgnd是否重载了?并在里面直接返回了?
baobaodediaozhui 2011-07-19
  • 打赏
  • 举报
回复
up!学习中....

19,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧