现在我用一张PNG的图片做表盘
用GDI+画了指针
也基本实现了功能 
就是指针在转动时 会有轻微的闪烁
我在网上看了不少VC6下GDI+的双缓冲 好多讲得不详细 基本是基于SDI的
恕小弟愚笨 不会应用在基于对话框的程序中
望各位赐教一二 临帖涕零

解决方案 »

  1.   

    class CDialog : public CWnd 
    {};class CView : public CWnd
    {};都在 DC 上绘图 双缓存不过是创建与屏幕DC兼容的后台DC在后台DC中绘制好后再Blt到屏幕DC
      

  2.   

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

       // TODO: Add your message handler code here
        CDC memDC;              // 缓存DC
        CDC selDC;              // 选入图片的DC
        HBITMAP     hBmp;
        HBITMAP hOldBMP;
        memDC.CreateCompatibleDC(&dc);
        selDC.CreateCompatibleDC(&dc);
        hBmpMem   = CreateCompatibleBitmap(dc.m_hDC, m_nCx, m_nCy);    // 画背景到缓存DC
        memDC.FillSolidRect(0, 0, m_nCx, m_nCy, RGB(0, 0, 0));  
        
        // 画图片到缓存DC
        hBmpMem   = LoadBitmap(NULL, MAKEINTRESOURCE(ID_BMP1));
        hOldBMP   = memDC.SelectObject(hBmpMem);
        memDC.BitBlt(0, 0, m_nCx, m_nCy, &selDC, 0, 0, SRCCOPY);    // 从缓存画到窗口DC
        dc.BitBlt(0, 0, m_nCx, m_nCy, &memDC, 0, 0, SRCCOPY);
        
        // 清除GDI对象

    }
      

  3.   

    如果有闪烁, 处理一下 WM_ERASEBKGND 消息, 直接返回TRUEON_WM_ERASEBKGND()BOOL CXXXXXDlg::OnEraseBkgnd(CDC* pDC) 
    {
        return TRUE;
    }
      

  4.   

    CClientDC dc(this); // 获取对话框 客户区域 CDC
    CDC memDC; // 创建 缓存CDC
    CBitmap memBitMap; // 创建 缓存位图
    memDC.CreateCompatibleDC(pDC); // 使内存CDC适应客户区域的CDC
    memBit.CreateCompatibleBitmap(pDC,rectArea.Width(),rectArea.Height());
    CBitmap* pOldBit = memDC.SelectObject(&memBitMap); // 选入位图
    memDC.SetBkMode(TRANSPARENT); dc.BitBlt(......,memDC.......); // 将缓存中的图像贴到客户区域 // 这是单缓存的 再加个CDC往 memDC上贴就是双缓存了,不过感觉你这个用不到,双缓存做游戏可以
      

  5.   

    CClientDC dc(this); // 获取对话框 客户区域 CDC
    CDC memDC; // 创建 缓存CDC
    CBitmap memBitMap; // 创建 缓存位图
    memDC.CreateCompatibleDC(pDC); // 使内存CDC适应客户区域的CDC
    memBit.CreateCompatibleBitmap(pDC,rectArea.Width(),rectArea.Height());
    CBitmap* pOldBit = memDC.SelectObject(&memBitMap); // 选入位图
    memDC.SetBkMode(TRANSPARENT); dc.BitBlt(......,memDC.......); // 将缓存中的图像贴到客户区域 // 这是单缓存的 再加个CDC往 memDC上贴就是双缓存了,不过感觉你这个用不到,双缓存做游戏可以
      

  6.   

    CClientDC dc(this); // 获取对话框 客户区域 CDC
    CDC memDC; // 创建 缓存CDC
    CBitmap memBitMap; // 创建 缓存位图
    memDC.CreateCompatibleDC(pDC); // 使内存CDC适应客户区域的CDC
    memBit.CreateCompatibleBitmap(pDC,rectArea.Width(),rectArea.Height());
    CBitmap* pOldBit = memDC.SelectObject(&memBitMap); // 选入位图
    memDC.SetBkMode(TRANSPARENT); dc.BitBlt(......,memDC.......); // 将缓存中的图像贴到客户区域 // 这是单缓存的 再加个CDC往 memDC上贴就是双缓存了,不过感觉你这个用不到,双缓存做游戏可以
      

  7.   

    1、在内存中建立一块“虚拟画布”:
    Bitmap bmp = new Bitmap(600, 600);2、获取这块内存画布的Graphics引用:
    Graphics g = Graphics.FromImage(bmp);3、在这块内存画布上绘图:
    g.FillEllipse(brush, i * 10, j * 10, 10, 10);4、将内存画布画到窗口中
    this.CreateGraphics().DrawImage(bmp, 0, 0);
      

  8.   

    以上各位好像都是用GDI实现的
    我现在学用GDI+
    有没有GDI+实现的方法
    毕竟VC6也是通过设置一系列的东西才支持GDI+吧 
    双缓冲方面就不能像.NET里面那样容易实现了
    网上其他人的方法 貌似只有一个版本
    难道VC6 就没有更好的实现GDI+双缓冲的办法了?using namespace Gdiplus;
    Graphics graphics( dc.m_hDC );
    graphics.SetSmoothingMode(SmoothingModeAntiAlias);//平滑处理 抗锯齿
    Image image(L"E:\\图片相关\\表盘1.png");
    graphics.DrawImage(&image, 220,220);
    Pen pen(ARGB(0xFFFF4500),9);
    SolidBrush brush(ARGB(0xFFB0C4DE));
    pen.SetStartCap(LineCapRoundAnchor);
    pen.SetEndCap(LineCapArrowAnchor);
    double radian = 3.14159265358979323846 / 180.0;
    REAL fla;
    fla=(400-180)*m_fgicret+180;//(范围最大值-范围最小值)*数据百分比+范围最小值
    graphics.DrawLine(&pen, 348, 347, 348 + (INT) (100 * cos(fla * radian)), 
    347 + (INT) (100 * sin(fla * radian)));
    graphics.FillEllipse(&brush,343,342,10,10);在这个代码的基础上 用双缓冲可以实现不?
      

  9.   

    这个我在网上看到了
    Bitmap bmp = new Bitmap(600, 600); 就出问题了
    我是在VC6的环境下 (不知道是不是这个缘故)
    没用成这个方法 所以跑到CSDN来问了
      

  10.   

    那个是.net 代码啊,你参考下面这个吧:
    http://www.vckbase.com/document/viewdoc/?id=1811
      

  11.   

    这个我也看了
    网上所说的 VC6下GDI+双缓冲 基本都是这个版本
    而且是在SDI下实现的 
    DLG下如何做呢??
    不要嫌我笨
      

  12.   

    我觉得你应该差不多能做出来,SDI和DLG下大同小异
      

  13.   

    你在做指针旋转的时候不要把视图改变放在在OnPaint中;我一般的处理是这样的:
    OnPaint中绘制所有的东西(Onpaint中的代码里面并不会用到双缓存);在图像改变的时候再使用缓存;比如MouseDown、MouseMove中,根据你的情况应该是在中标指针变化的时候使用(可能是你的OnTime事件当中)。
      

  14.   

    我按照VC知识库里的那篇介绍SID双缓冲的文章,用到DLG中了
    不过效果并不很好 貌似只有一点点进步
    是没用好 还是什么原因啊
    搞不明白
      

  15.   

    我把这个放到OnPaint函数下了
    CPaintDC dc(this); // device context for paintingdc.BitBlt(0,50,861,705,&m_memDC,0,50,SRCCOPY);//双缓冲用CPaintDC 跟CClientDC 有区别不?