我说的闪一下的意思是,刷新的痕迹都可以看到,显示速度不够流畅。图片显示本身没有什么问题。我的代码: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对象给构造出来??我刚刚试了,弄半天不会弄。。
{
// ...
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对象给构造出来??我刚刚试了,弄半天不会弄。。
不会,,,,,,,,,,,,,,,,,,,,,,,
不会。。
{
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(); // 删除字体
}
和Image image(m_CurrtIMG, false);不是其他的。
InvalidateRect(&Rect, TRUE);似乎是有点影响速度吧?
位图文件预先读入内存,然后直接显示即可。去掉上面的刷新看看。
如果是PNG图片怎么办?我要处理好几种格式的图片的,要不然我也不用费那么大劲去使用GDI