2 u011353185 u011353185 于 2013.07.11 22:46 提问

下面的代码怎么实现双缓存去闪

// 画图View.cpp : implementation of the CMyView class
//

#include "stdafx.h"
#include "画图.h"

#include "画图Doc.h"
#include "画图View.h"
#include "SettingDlg.h"
#include
#ifdef DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE
_;
#endif

/////////////////////////////////////////////////////////////////////////////
// CMyView

IMPLEMENT_DYNCREATE(CMyView, CView)

BEGIN_MESSAGE_MAP(CMyView, CView)
//{{AFX_MSG_MAP(CMyView)
ON_COMMAND(IDM_LINE, OnLine)
ON_COMMAND(IDM_RECTANGLE, OnRectangle)
ON_COMMAND(IDM_Circle, OnCircle)
ON_COMMAND(IDM_Random_Line, OnRandomLine)
ON_COMMAND(IDM_POLYGON, OnPolygon)
ON_WM_LBUTTONUP()
ON_WM_LBUTTONDOWN()
ON_WM_MOUSEMOVE()
ON_WM_RBUTTONDOWN()
ON_WM_RBUTTONUP()
ON_COMMAND(IDM_SET_LINE_STYLE_WIDTH, OnSetLineStyleWidth)
ON_COMMAND(IDM_SET_COLOR, OnSetColor)
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMyView construction/destruction

CMyView::CMyView()
{
// TODO: add construction code here
m_nDrawType=0;
m_ptOrigin=0;
m_nLineStyle=0;
m_nLineWidth=1;
m_ncolor=RGB(255,0,0);
m_dcMetaFile.Create();
no1=0;
no2=0;
no3=0;
no4=0;
no5=0;
k=0;
}

CMyView::~CMyView()
{
}

BOOL CMyView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs

return CView::PreCreateWindow(cs);

}

/////////////////////////////////////////////////////////////////////////////
// CMyView drawing

void CMyView::OnDraw(CDC* pDC)
{
CMyDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
CClientDC dc(this);
CPen pen(m_nLineStyle,m_nLineWidth,m_color);
CPen* pOldPen = pDC->SelectObject(&pen);
CPoint point1,point2;
int temp=k;
//vector::const_iterator i=v.begin();
if(no1 ||no2 ||no3 ||no4|| no5){
switch(m_nDrawType)
{
case 1:
pDC->MoveTo(pDoc->head);
point1.x=pDoc->head.x+5;
point1.y=pDoc->head.y+5;
point2.x=pDoc->head.x-5;
point2.y=pDoc->head.y-5;
pDC->Ellipse(CRect(point1,point2));
pDC->LineTo(pDoc->tail);
point1.x=pDoc->tail.x+5;
point1.y=pDoc->tail.y+5;
point2.x=pDoc->tail.x-5;
point2.y=pDoc->tail.y-5;
pDC->Ellipse(CRect(point1,point2));
break;
case 2:
point1.x=pDoc->m_Rect.left+5;
point1.y=pDoc->m_Rect.top+5;
point2.x=point1.x-10;
point2.y=point1.y-10;
pDC->Ellipse(CRect(point1,point2));
point1.x=pDoc->m_Rect.right+5;
point2.x=point1.x-10;
pDC->Ellipse(CRect(point1,point2));
point1.x=pDoc->m_Rect.left+5;
point1.y=pDoc->m_Rect.bottom+5;
point2.x=point1.x-10;
point2.y=point1.y-10;
pDC->Ellipse(CRect(point1,point2));
point1.x=pDoc->m_Rect.right+5;
point2.x=point1.x-10;
pDC->Ellipse(CRect(point1,point2));
pDC->Rectangle(pDoc->m_Rect);
break;
case 3:

pDC->Ellipse(pDoc->m_Rect);
break;
case 4:
for(temp=0;temp {
pDC->MoveTo(pDoc->pointduo[temp]);
point1.x=pDoc->pointduo[temp].x+5;
point1.y=pDoc->pointduo[temp].y+5;
point2.x=pDoc->pointduo[temp].x-5;
point2.y=pDoc->pointduo[temp].y-5;
pDC->Ellipse(CRect(point1,point2));
pDC->LineTo(pDoc->pointduo[temp+1]);
point1.x=pDoc->pointduo[temp+1].x+5;
point1.y=pDoc->pointduo[temp+1].y+5;
point2.x=pDoc->pointduo[temp+1].x-5;
point2.y=pDoc->pointduo[temp+1].y-5;
pDC->Ellipse(CRect(point1,point2));
}
pDC->MoveTo(pDoc->pointduo[temp]);
point1.x=pDoc->pointduo[temp].x+5;
point1.y=pDoc->pointduo[temp].y+5;
point2.x=pDoc->pointduo[temp].x-5;
point2.y=pDoc->pointduo[temp].y-5;
pDC->Ellipse(CRect(point1,point2));
pDC->LineTo(pDoc->tail);
point1.x=pDoc->tail.x+5;
point1.y=pDoc->tail.y+5;
point2.x=pDoc->tail.x-5;
point2.y=pDoc->tail.y-5;
pDC->Ellipse(CRect(point1,point2));
break;
case 5:
for(temp=0;temp {
pDC->MoveTo(pDoc->pointp[temp]);
point1.x=pDoc->pointp[temp].x+5;
point1.y=pDoc->pointp[temp].y+5;
point2.x=pDoc->pointp[temp].x-5;
point2.y=pDoc->pointp[temp].y-5;
pDC->Ellipse(CRect(point1,point2));
pDC->LineTo(pDoc->pointp[temp+1]);
point1.x=pDoc->pointp[temp+1].x+5;
point1.y=pDoc->pointp[temp+1].y+5;
point2.x=pDoc->pointp[temp+1].x-5;
point2.y=pDoc->pointp[temp+1].y-5;
pDC->Ellipse(CRect(point1,point2));
}
pDC->MoveTo(pDoc->pointp[temp]);
point1.x=pDoc->pointp[temp].x+5;
point1.y=pDoc->pointp[temp].y+5;
point2.x=pDoc->pointp[temp].x-5;
point2.y=pDoc->pointp[temp].y-5;
pDC->Ellipse(CRect(point1,point2));
pDC->LineTo(pDoc->tail);
point1.x=pDoc->tail.x+5;
point1.y=pDoc->tail.y+5;
point2.x=pDoc->tail.x-5;
point2.y=pDoc->tail.y-5;
pDC->Ellipse(CRect(point1,point2));
pDC->MoveTo(pDoc->tail);
point1.x=pDoc->tail.x+5;
point1.y=pDoc->tail.y+5;
point2.x=pDoc->tail.x-5;
point2.y=pDoc->tail.y-5;
pDC->Ellipse(CRect(point1,point2));
pDC->LineTo(pDoc->pointp[0]);
point1.x=pDoc->pointp[0].x+5;
point1.y=pDoc->pointp[0].y+5;
point2.x=pDoc->pointp[0].x-5;
point2.y=pDoc->pointp[0].y-5;
pDC->Ellipse(CRect(point1,point2));
}
}
}

/////////////////////////////////////////////////////////////////////////////
// CMyView printing

BOOL CMyView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}

void CMyView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}

void CMyView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}

/////////////////////////////////////////////////////////////////////////////
// CMyView diagnostics

#ifdef _DEBUG
void CMyView::AssertValid() const
{
CView::AssertValid();
}

void CMyView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}

CMyDoc* CMyView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMyDoc)));
return (CMyDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CMyView message handlers

//DEL void CMyView::OnUpdateLine(CCmdUI* pCmdUI)
//DEL {
//DEL // TODO: Add your command update UI handler code here
//DEL

//DEL }

void CMyView::OnLine()
{
// TODO: Add your command handler code here
m_nDrawType=1;
}

void CMyView::OnRectangle()
{
// TODO: Add your command handler code here
m_nDrawType=2;
}

void CMyView::OnCircle()
{
// TODO: Add your command handler code here
m_nDrawType=3;
}

void CMyView::OnRandomLine()
{
// TODO: Add your command handler code here
m_nDrawType=4;
}

void CMyView::OnPolygon()
{
// TODO: Add your command handler code here
m_nDrawType=5;
}

void CMyView::OnLButtonUp(UINT nFlags, CPoint point)
{
CView::OnLButtonUp(nFlags, point);
}

void CMyView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CClientDC dc(this);
CPoint point1,point2;
m_ptOrigin=point;
CMyDoc* pDoc = GetDocument();
if(m_nDrawType==4)
{
pDoc->pointduo[k]=point;
k++;
}
if(m_nDrawType==5)
{
pDoc->pointp[k]=point;
k++;
}
if(no1||no2||no3)
{
switch(m_nDrawType)
{
case 1:if(no1==1)no1=0;break;
case 2:if(no2==1)no2=0;break;
case 3:if(no3==1)no3=0;break;
}
}
else if(m_nDrawType!=0)
{
if(m_nDrawType!=3)
{
CPen pen(0,1,m_color);
CPen* pOldPen = dc.SelectObject(&pen);
point1.x=point.x+5;
point1.y=point.y+5;
point2.x=point.x-5;
point2.y=point.y-5;
dc.Ellipse(CRect(point1,point2));
}
switch(m_nDrawType)
{
case 1:no1=1;
break;
case 2:no2=1;
break;
case 3:no3=1;
break;
case 4:no4=1;
break;
case 5:no5=1;
break;
}
}
CView::OnLButtonDown(nFlags, point);
}

void CMyView::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CPoint m_ptEnd=point;
CPoint point1,point2,point3,point4;
CMyDoc* pDoc = GetDocument();
CClientDC dc(this);
switch(m_nDrawType)
{
case 1:
pDoc->head=m_ptOrigin;
pDoc->tail=m_ptEnd;
if(no1) Invalidate();
break;
case 2:case 3:
pDoc->m_Rect.left=m_ptOrigin.x;
pDoc->m_Rect.top=m_ptOrigin.y;
pDoc->m_Rect.right=m_ptEnd.x;
pDoc->m_Rect.bottom=m_ptEnd.y;
if(no2 || no3) Invalidate();
case 4:case 5:
pDoc->tail=m_ptEnd;
if(no5 || no4) Invalidate();
break;
}

CView::OnMouseMove(nFlags, point);

}

void CMyView::OnRButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default

CView::OnRButtonDown(nFlags, point);

}

void CMyView::OnRButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
if(m_nDrawType==4)
{
no4=0;
k=0;
}
if(m_nDrawType==5)
{
no5=0;
k=0;
}
CView::OnRButtonUp(nFlags, point);
}

void CMyView::OnSetLineStyleWidth()
{
// TODO: Add your command handler code here

CSettingDlg dlg;
//dlg.DoModal();
dlg.m_nLineWidth=m_nLineWidth;
dlg.m_nLineStyle=m_nLineStyle;
if(IDOK==dlg.DoModal())
{
    m_nLineWidth=dlg.m_nLineWidth ;
    m_nLineStyle=dlg.m_nLineStyle ;
}

}

void CMyView::OnSetColor()
{
// TODO: Add your command handler code here
CColorDialog dlg;
dlg.m_cc.Flags |=CC_RGBINIT | CC_FULLOPEN;
dlg.m_cc.rgbResult=m_color;
if(IDOK==dlg.DoModal())
{
m_color=dlg.m_cc.rgbResult;
}
}

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
C# 启用双缓存,避免ListView控件加载数据时闪烁
可以用以下方法,已经测试:     public   class   CustomListView   :   ListView     {             public   CustomListView()             {                     SetStyle(ControlStyles.DoubleBuffer   |                                         ControlStyles.OptimizedDoubleBuff
VC利用双缓存解决闪屏
VC++6.0利用双缓存技术,解决闪屏问题,代码有详细注释
MFC绘图基础
MFC绘图详解,双缓存去闪机制,MFC绘图必备知识,绘制直线,圆形,矩形等
双缓存解决闪烁及对话框背景覆盖控件问题
双缓存解决闪烁及对话框背景覆盖控件问题
关于双缓冲在OnPaint中解决闪屏
由于要读取设备的数据,进而绘出数据的趋势图,所以需要不断的刷新屏幕进而进行读数据。但是由于刷屏一直会造成严重的闪屏,所以参照网上的方法,利用双缓冲技术进行函数重载绘制,但是一直仍旧闪屏,最后找到问题的根源,更改之后的效果确实良好,防止了屏幕出现闪屏,但是我的编码过程中也与网上的方法有稍稍不同,为了防止有人走我的弯路,在此将方法进行说明。首先,思想仍然是双缓冲的技术思想,但是由于要求是在控件中进行重
C语言 双缓冲控制台防闪屏技术
对于这个东西相信大家非常陌生,因为现在除了学“C语言”和“数据结构”这些基础课程的大学生,基本没人会用到控制台了。哪怕是用到,也不会关心它闪不闪屏的问题。  但在一种特殊的情况下需要用到,那就是写“贪吃蛇”这个游戏的时候……  贪吃蛇游戏的设计原理,就是不断的重复”擦除->显示”控制台打印的内容,显示的内容由时间和用户的输入做出相应的变化。  控制台的擦除会用到如下语句:system("cls");
MFC 双缓冲 绘图时屏幕闪烁问题
绘图时屏幕闪烁的原因分析 很长一段时间我一直认为绘图过程中出现的屏幕闪烁是图形刷新速度过快而造成的(相信有很多朋友也跟我一样有这样的想法),但是通过编写一些绘图程序,我发现事情并非如此,至少刷新速度快不会是造成屏幕闪烁的根本原因。这个问题可以通过下面的两个试验进行说明。 1、编写一个刷新速度很慢的应用程序,可以设计为通过点击鼠标来进行屏幕刷新。通过该试验可以发现即使屏幕的刷新速度很慢,但是在每
双缓冲原理在awt和swing中实现消除闪烁的方法
对于双缓冲的分析是在坦克大战游戏的设计时开始的,由于当时忙于游戏的整体设计,所以对这一个问题没有进行详细的研究,现在就这个问题来谈谈自己的一些看法。 分析前提出几个问题: 1、为什么当想屏幕上添加图片之后会有明显的闪烁现象? 2、在awt中如何实现双缓冲? 3、如何理解swing内置双缓冲以及比较他与awt中消除闪烁的方法区别在哪里? 首先我们来解答第一个问题: 我们在屏幕上自绘图形或
关于Java swing双缓存实现消除闪烁
这几天一直纠结游戏界面的淡入淡出怎么实现。之前终于了解可以用AlphaComposite修改图片的alpha值,加以延时可以实现淡入淡出,但界面闪得很厉害。   之前做图形编程的时候也知道,这是图片没有绘制完成然后显示到屏幕的原因。什么意思呢?就比方说一个运动的小球,实现的效果是先画小球,然后擦除,然后在新位置重绘小球。显然,擦除是不应该被显示到屏幕上的。小球到重绘的时候再显示到屏幕才是。曾经用
窗口屏幕闪动
想知道QQ里面的屏幕闪动原理吗?本代码告诉你该怎么去实现