我说的闪一下的意思是,刷新的痕迹都可以看到,显示速度不够流畅。图片显示本身没有什么问题。我的代码:void CXMHeditorDlg::OnPaint()
{
// ...
Graphics graphics(GetDC()->m_hDC);
Image image(m_CurrtIMG, false);
graphics.DrawImage(&image, 270, 45, image.GetWidth(), image.GetHeight());
// ...
}// 按钮事件的处理
void CXMHeditorDlg::OnLbnSelchangeListImg()
{
//...
// 设定要显示的图像
m_CurrtIMG = ……… RECT Rect = {270, 45, 787, 457};
InvalidateRect(&Rect, TRUE);
//...
}
请问有什么办法能使显示的图片速度快一点??
是不是应该事先就把Image对象给构造出来??我刚刚试了,弄半天不会弄。。

解决方案 »

  1.   

    采用双缓冲:创建一个内存DC,先在内存DC上绘图,再画到窗口DC上。Graphics graphics(GetDC()->m_hDC); //这里采用内存DC
      

  2.   

    我告诉你怎么写:打开IE,进入Google或百度,输入“VC,内存绘图”,再点“搜索”。OK,搞定。
      

  3.   

    我用的位图,用的是GDI。
    不会,,,,,,,,,,,,,,,,,,,,,,,
      

  4.   

    用的不是位图,是GDI
    不会。。
      

  5.   

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

    // TODO: Add your message handler code here
    OnPaintCall(/*&dc*/);

    // Do not call CDialog::OnPaint() for painting messages
    }void CKeyBox::OnPaintCall(/*CDC *pDC*/)
    {
    // 屏幕绘图
    CRect rectScr; // 屏幕绘图范围
    CWnd* pWnd = GetDlgItem(IDC_LCD); // 获得对话框上的picture的窗口句柄
    pWnd->GetClientRect(&rectScr);
    rectScr.OffsetRect(10, 15); // eVC下会偏移,需纠正

    CDC *pDC; // 屏幕绘图设备
    pDC = GetDC(); // eVC下无效: pDC = pWnd->GetDC();
    // pDC->Rectangle(&rectScr);

    // 内存绘图
    CRect rectMem; // 内存绘图范围
    // GetClientRect(&rectMem);
    // rectMem.CopyRect(&rectScr);
    rectMem.left   = 0;
    rectMem.top    = 0;
    rectMem.right  = HZ_LATTICE_X * 8; // 8行
    rectMem.bottom = HZ_LATTICE_Y * 4; // 4个汉字

    CDC m_dcMem; // 内存绘图设备
    CBitmap  m_bmpMem;
    CBitmap* pOldBmp = NULL;

    // 创建内存绘图设备
    m_dcMem.CreateCompatibleDC(pDC);
    m_bmpMem.CreateCompatibleBitmap(pDC, rectMem.right, rectMem.bottom);
    pOldBmp = m_dcMem.SelectObject(&m_bmpMem); // 将位图调入该内存中

    DrawLcdPic(&m_dcMem, &rectMem); // 画LCD图形 -- 内存绘图

    // 把内存绘图拷贝到屏幕
    // pDC->BitBlt(rectMem.left, rectMem.top, rectMem.Width(), rectMem.Height(), &m_dcMem, 0, 0, SRCCOPY);
    pDC->StretchBlt(rectScr.left, rectScr.top, rectScr.Width(), rectScr.Height(),
    &m_dcMem, 0, 0, rectMem.Width(), rectMem.Height(), SRCCOPY);

    m_dcMem.SelectObject(pOldBmp);
    m_dcMem.DeleteDC();
    m_bmpMem.DeleteObject();
    ReleaseDC(pDC); // 无此行易造成内存泄漏
    }// 画LCD图形
    void CKeyBox::DrawLcdPic(CDC *pDC, CRect* lpMemRect)
    {
    CRect rect = *lpMemRect; // 绘图范围

    // 建立字体
    // CClientDC dc(AfxGetMainWnd());
    LOGFONT lf;
    memset(&lf, 0, sizeof(LOGFONT));
    lf.lfCharSet = GB2312_CHARSET;      // 字符集
    _tcscpy(lf.lfFaceName, _T("宋体")); // 字体名称
    lf.lfHeight    = -1 * (12 * pDC->GetDeviceCaps(LOGPIXELSY) / 72); // 9或12 = (字号)字体大小, 72 = 每英寸磅数
    // lf.lfWeight    = (bBold ? FW_BOLD : FW_NORMAL); // 字体是否粗体 // FW_BOLD=700, FW_NORMAL=400
    // lf.lfWeight    = 400;   // 字体磅数
    lf.lfItalic    = FALSE; // 字体是否斜体
    lf.lfUnderline = FALSE; // 字体是否有下划线
    lf.lfStrikeOut = FALSE; // 字体是否有删除线
    CFont font;
    VERIFY(font.CreateFontIndirect(&lf)); // 建立字体

    int nBkModeOld = pDC->SetBkMode(TRANSPARENT); // 设置透明模式
    COLORREF textcolor = pDC->SetTextColor(RGB(0,0,255)); // 文本色

    // 内存绘图背景
    CBrush  Brush(CRF_PICBKCOLOR); // 背景刷
    CBrush* pOldBrush = NULL;
    pOldBrush = (CBrush*)pDC->SelectObject(&Brush);
    // pDC->Rectangle(&rect); // 可填充矩形 -- 也相当于做背景
    // pDC->FillSolidRect(&rect, CRF_PICBKCOLOR); // 填充矩形 -- 也相当于做背景
    pDC->PatBlt(rect.left, rect.top, rect.Width(), rect.Height(), PATCOPY ); // 将内存绘图背景刷上色

    // 建立画笔
    CPen  RedPen, GreenPen, WhitePen, YellowPen;
    CPen* pOldPen = NULL;
    RedPen.CreatePen(PS_SOLID, 1, RGB(255,0,0)); // 红色
    GreenPen.CreatePen(PS_SOLID, 1, RGB(0,255,0)); // 绿色
    WhitePen.CreatePen(PS_SOLID, 1, RGB(255,255,255)); // 白色
    YellowPen.CreatePen(PS_SOLID, 1, RGB(255,255,0)); // 黄色

    CFont* pfont = pDC->SelectObject(&font); // 选择字体

    ////////////////////////////////////////////////////////////////////////////////
    // 绘图、文字
    // 绘图
    pOldPen = pDC->SelectObject(&RedPen); // 选择红色笔

    DrawMyRect(pDC, CPoint(30, 30), 50, 50, RGB(0, 255, 0), TRUE); // 画矩形

    pDC->SelectObject(&RedPen); // 选择红色笔
    pDC->MoveTo(rect.left, rect.top);
    pDC->LineTo(rect.right, rect.bottom);

    // 文字
    CRect rectText;
    rectText.CopyRect(&rect);
    // 未建立字体,eVC下会偏移,需如下纠正。
    // rectText.OffsetRect(0, -1);
    // 有建立字体,eVC下会偏移,需如下纠正。
    rectText.OffsetRect(0, 1);

    CString strText = _T("");
    strText.Format(_T("%s"), _T("深圳市欣力通科技有限公司")); // 文字
    pDC->DrawText(strText, &rectText, DT_SINGLELINE); // DT_SINGLELINE|DT_VCENTER|DT_CENTER // eVC下不可用: rect.TextOut(10, 10, strText);
    //
    rectText.top    += HZ_LATTICE_Y;
    rectText.bottom += HZ_LATTICE_Y;
    strText.Format(_T("%s"), _T("圳市欣力通科技有限公司"));
    pDC->DrawText(strText, &rectText, DT_SINGLELINE); // 可用: ExtTextOut()
    //
    rectText.top    += HZ_LATTICE_Y;
    rectText.bottom += HZ_LATTICE_Y;
    strText.Format(_T("%s"), _T("市欣力通科技有限公司"));
    pDC->DrawText(strText, &rectText, DT_SINGLELINE);
    //
    rectText.top    += HZ_LATTICE_Y;
    rectText.bottom += HZ_LATTICE_Y;
    strText.Format(_T("%s"), _T("欣力通科技有限公司"));
    pDC->DrawText(strText, &rectText, DT_SINGLELINE);
    // 绘图、文字
    ////////////////////////////////////////////////////////////////////////////////

    pDC->SelectObject(pOldPen); // 画笔
    RedPen.DeleteObject();
    GreenPen.DeleteObject();
    pDC->SelectObject(pOldBrush); // 背景刷
    pDC->SetTextColor(textcolor); // 恢复文本色
    pDC->SetBkMode(nBkModeOld); // 恢复背景模式

    pDC->SelectObject(pfont); // 恢复字体
    font.DeleteObject(); // 删除字体
    }
      

  6.   

    我用的是Graphics graphics(GetDC()->m_hDC);
    和Image image(m_CurrtIMG, false);不是其他的。
      

  7.   

    Graphics是GDI+,双缓冲的原理是一样的。
    InvalidateRect(&Rect, TRUE);似乎是有点影响速度吧?
    位图文件预先读入内存,然后直接显示即可。去掉上面的刷新看看。
      

  8.   


    如果是PNG图片怎么办?我要处理好几种格式的图片的,要不然我也不用费那么大劲去使用GDI