void CZjqChartView::OnPaint() 
{
CPaintDC dc(this); // device context for painting

CRect rcClient;
GetClientRect(rcClient); CDC memdc;
memdc.CreateCompatibleDC(&dc);
CBitmap tempbmp;
tempbmp.CreateCompatibleBitmap(&dc,rcClient.Width(),rcClient.Height());
CBitmap* poldbmp=memdc.SelectObject(&tempbmp);
//memdc.FillSolidRect(rcClient,RGB(255,255,255));

//在memdc上画图了
CPen pen(PS_SOLID,2,RGB(255,255,255));
CPen* pOldPen = memdc.SelectObject(&pen);
//x轴
pOldPen = memdc.SelectObject(&pen);
         memdc.MoveTo(rcClient.right-30,rcClient.bottom-30);
memdc.LineTo(rcClient.left+30,rcClient.bottom-30);
//画箭头
memdc.MoveTo(rcClient.right-35,rcClient.bottom-25);
memdc.LineTo(rcClient.right-30,rcClient.bottom-30);
         memdc.MoveTo(rcClient.right-35,rcClient.bottom-35);
memdc.LineTo(rcClient.right-30,rcClient.bottom-30); //y轴
pOldPen = memdc.SelectObject(&pen);
memdc.MoveTo(rcClient.left+30,rcClient.bottom-30);
         memdc.LineTo(rcClient.left+30,rcClient.top+30); //画箭头
memdc.MoveTo(rcClient.left+25,rcClient.top+35);
memdc.LineTo(rcClient.left+30,rcClient.top+30);
    memdc.MoveTo(rcClient.left+35,rcClient.top+35);
memdc.LineTo(rcClient.left+30,rcClient.top+30); //复制到dc上去.
dc.BitBlt(0,0,rcClient.Width(),rcClient.Height(),&memdc,0,0,SRCCOPY);
//最后还要释放
ReleaseDC(&dc);
ReleaseDC(&memdc);
}

解决方案 »

  1.   

    这个函数没看出来问题
    你再看看程序的其他地方,是不是有别的绘图代码,比如Ondraw里面
      

  2.   

    to wangjianddy(世界上最好的猫!(抵制日货!)) 
    只在OnPaint绘图,其他地方没有啊
      

  3.   

    真正的消除闪烁有两种办法:
     (1) 使用双缓冲,在内存dc上完成所有的绘制,然后一次BitBlt到目标dc上
    (2)阻止windows刷背景,WM_ERASEBKGND消息返回true
      

  4.   

    crystal521(水晶泪) 
    我怎么解决这个问题呢??
      

  5.   

    实际是你的CMaimFrame在刷新造成的闪烁,在CMainFrame中重载WM_ERASEBKGND的消息处理,直接返回TRUE就可以了。
      

  6.   

    哈哈,跟我当初的一样问题, 把你的代码写在WM_ERASEBKGND 里面就好了!
      

  7.   

    charlie790801(哈,钱快要拿到了,又有饭吃了。) 
    一样闪啊。
      

  8.   

    我把代码都贴出来,各位帮我看看。
    我想写一个画曲线的类。
    看这个类的图像,建立一个对话框程序 声明变量CZjqChartView a;
    然后在OnInitDialog()中加入
    CRect rc;
    GetClientRect(&rc);
    a.CreateChartView(this,rc);
    在OnSize()加入
    if (a.GetSafeHwnd())
    {
    CRect rcClient;
    GetClientRect(&rcClient);
    a.MoveWindow(rcClient);
    } // ZjqChartView.h: interface for the CZjqChartView class.
    //
    //////////////////////////////////////////////////////////////////////#if !defined(AFX_ZJQCHARTVIEW_H__8EE11C9A_75C7_49B1_99DA_F8060C7C74E1__INCLUDED_)
    #define AFX_ZJQCHARTVIEW_H__8EE11C9A_75C7_49B1_99DA_F8060C7C74E1__INCLUDED_#if _MSC_VER > 1000
    #pragma once
    #endif // _MSC_VER > 1000class CZjqChartView : public CWnd  
    {
    private:
       LONG m_InX;
       LONG m_InY;
       BOOL m_Size;
       int  m_Border;
    public:
    CZjqChartView();
    virtual ~CZjqChartView(); // Operations
    public:
    //创建曲线显示窗体
    BOOL CreateChartView(CWnd *pParentWnd, CRect &rect);
    protected:
    //{{AFX_MSG(CZjqChartView)
    afx_msg BOOL OnEraseBkgnd(CDC* pDC);
    afx_msg void OnSize(UINT nType, int cx, int cy);
    afx_msg void OnPaint();
    afx_msg void OnMouseMove(UINT nFlags, CPoint point);
    //}}AFX_MSG
    DECLARE_MESSAGE_MAP()
    };#endif // !defined(AFX_ZJQCHARTVIEW_H__8EE11C9A_75C7_49B1_99DA_F8060C7C74E1__INCLUDED_).cpp
    // ZjqChartView.cpp: implementation of the CZjqChartView class.
    //
    //////////////////////////////////////////////////////////////////////#include "stdafx.h"
    #include "zjqChart.h"
    #include "ZjqChartView.h"#ifdef _DEBUG
    #undef THIS_FILE
    static char THIS_FILE[]=__FILE__;
    #define new DEBUG_NEW
    #endif//////////////////////////////////////////////////////////////////////
    // Construction/Destruction
    //////////////////////////////////////////////////////////////////////CZjqChartView::CZjqChartView()
    {
    m_InX = 0;
    m_InY = 0;
    m_Size = true;
    m_Border = 30;
    }CZjqChartView::~CZjqChartView()
    {}BEGIN_MESSAGE_MAP(CZjqChartView, CWnd)
    //{{AFX_MSG_MAP(CZjqChartView)
    ON_WM_ERASEBKGND()
    ON_WM_SIZE()
    ON_WM_PAINT()
    ON_WM_MOUSEMOVE()
    //}}AFX_MSG_MAP
    END_MESSAGE_MAP()BOOL CZjqChartView::CreateChartView(CWnd *pParentWnd, CRect &rect)
    {
    if(Create(NULL, "ZjqChartView", WS_CHILD | WS_VISIBLE | WS_BORDER, rect, pParentWnd, 1000))
    {
    return 1;
    }
    else
    {
    return 0;
    }
    }BOOL CZjqChartView::OnEraseBkgnd(CDC* pDC)
    {
    return TRUE;
    }void CZjqChartView::OnSize(UINT nType, int cx, int cy)
    {}void CZjqChartView::OnPaint() 
    {
    CPaintDC dc(this); // device context for painting

    CRect rcClient;
    GetClientRect(rcClient); CDC memdc;
    memdc.CreateCompatibleDC(&dc);
    CBitmap tempbmp;
    tempbmp.CreateCompatibleBitmap(&dc,rcClient.Width(),rcClient.Height());
    CBitmap* poldbmp=memdc.SelectObject(&tempbmp);
    //memdc.FillSolidRect(rcClient,RGB(255,255,255));

    //在memdc上画图了
    CPen pen(PS_SOLID,2,RGB(255,255,255));
    CPen* pOldPen = memdc.SelectObject(&pen);
    CPen pen1(PS_DOT,1,RGB(121,163,208));
    CPen pen2(PS_SOLID,1,RGB(121,163,208)); float xSpin,ySpin;
    float a;
    a = 10;
    xSpin = (rcClient.right-60-rcClient.left)/a;
        //画x轴虚线网格
        for(int i=1;i<11;i++)
    {
    pOldPen = memdc.SelectObject(&pen1);
    memdc.MoveTo(rcClient.left+30+i*xSpin,rcClient.bottom-30); 
    memdc.LineTo(rcClient.left+30+i*xSpin,rcClient.top+30);
    }
    //x轴
    pOldPen = memdc.SelectObject(&pen);
        memdc.MoveTo(rcClient.right-30,rcClient.bottom-30);
    memdc.LineTo(rcClient.left+30,rcClient.bottom-30);
    //画箭头
    memdc.MoveTo(rcClient.right-35,rcClient.bottom-25);
    memdc.LineTo(rcClient.right-30,rcClient.bottom-30);
        memdc.MoveTo(rcClient.right-35,rcClient.bottom-35);
    memdc.LineTo(rcClient.right-30,rcClient.bottom-30); ySpin = (rcClient.bottom-60-rcClient.top)/a;
    //画y轴虚线网格
    for(int j=1;j<11;j++)
    {
    pOldPen = memdc.SelectObject(&pen1);
    memdc.MoveTo(rcClient.right-30,rcClient.bottom-30-j*ySpin);
    memdc.LineTo(rcClient.left+30,rcClient.bottom-30-j*ySpin);
    }
    //y轴
    pOldPen = memdc.SelectObject(&pen);
    memdc.MoveTo(rcClient.left+30,rcClient.bottom-30);
        memdc.LineTo(rcClient.left+30,rcClient.top+30); //画箭头
    memdc.MoveTo(rcClient.left+25,rcClient.top+35);
    memdc.LineTo(rcClient.left+30,rcClient.top+30);
        memdc.MoveTo(rcClient.left+35,rcClient.top+35);
    memdc.LineTo(rcClient.left+30,rcClient.top+30);

    //画跟着鼠标移动的线    
        if(m_InX && m_InY)
    {
    //画x轴
    pOldPen = memdc.SelectObject(&pen2);
    memdc.MoveTo(rcClient.left+30,m_InY);
    memdc.LineTo(rcClient.right-30,m_InY);
    memdc.MoveTo(m_InX,rcClient.bottom-30);
    memdc.LineTo(m_InX,rcClient.top+30);
    }

    //复制到dc上去.
    dc.BitBlt(0,0,rcClient.Width(),rcClient.Height(),&memdc,0,0,SRCCOPY);
    //最后还要释放
    ReleaseDC(&dc);
    ReleaseDC(&memdc);
    // Do not call CWnd::OnPaint() for painting messages
    }void CZjqChartView::OnMouseMove(UINT nFlags, CPoint point)
    {
    CRect rcClient;
    GetClientRect(rcClient);
    if(point.x <=rcClient.right -30 && point.x >=30 &&
    point.y >=30 && point.y<=rcClient.bottom -30)
    {
    m_InX = point.x;
    m_InY = point.y;
    }
    else
    {
    m_InX = 0;
    m_InY = 0;
    } Invalidate(TRUE);
    CWnd::OnMouseMove(nFlags, point);
    }
      

  9.   

    最后的Invalidate(TRUE);这句没用,删了它。
      

  10.   

    to coohai(海)
    这句删了就画不出跟着鼠标一起移动的十字了
      

  11.   

    CMainFrame中重载WM_ERASEBKGND,试过没有?
      

  12.   

    我的是对话筐程序,不是文档视图程序。
    在对话框上创建显示这个控件,
    声明变量 CZjqChartView a;
    然后在OnInitDialog()中加入
    CRect rc;
    GetClientRect(&rc);
    a.CreateChartView(this,rc);这个控件就在对话框上显示出来了
      

  13.   

    那就在你的对话框中重载WM_ERASEBKGND。