怎么把下面的绘图变成 双缓冲绘图,感激一辈子!
如何把下面的绘图变成 双缓冲绘图,感激一辈子!!!
HRESULT pngFlag = SUCCEEDED(CoCreateInstance (guid1,NULL,CLSCTX_INPROC_SERVER,guid2,(void **)&pImgFactory));
if (pngFlag) // 如果成功,则开始绘制png图像到HDC上
{
if(gflag==0)
{
if(SUCCEEDED(pImgFactory->CreateImageFromFile(_T("\\Program Files\\FCity\\bj.png"),&pImage)))
{
RECT rc = {6,0,236,80};
pImage->Draw(hdc, &rc, NULL);
pImage->Release();
}
}
if(SUCCEEDED(pImgFactory->CreateImageFromFile(_T("\\My Documents\\briefcase\\weather.png"),&pImage)))
{
RECT rc = {6,0,81,55};
pImage->Draw(hdc, &rc, NULL);
pImage->Release();
}
}
------解决方案--------------------
pImage->Draw(hdc, &rc, NULL);
实现双缓冲需要新建一个内存DC。可以用CreateCompatibleDC来创建。
把这里的hdc改成你新建的内存DC
待全部绘制完成后,再把你新建的内存DC绘制到hdc里就可以了。
具体代码请MSDN或百度。
------解决方案--------------------
下面 m_bDoubleBuffer == TRUE 就是双缓冲
=============================================================
void CXGraph::OnPaint()
{
CXGDCEx *pDC = new CXGDCEx;
CXGMemDC *pmdc = NULL;
CPaintDC *pdc = new CPaintDC(this);
CRect clRect, clChartRect;
int nSaveDC;
m_oldCursorPoint = CPoint(-1, -1);
if(m_pDrawDC != NULL)
{
pDC = (CXGDCEx*) m_pDrawDC;
}
else if ( m_bDoubleBuffer )
{
pmdc = new CXGMemDC(pdc);
pDC->Attach( pmdc->m_hDC );
nSaveDC = pDC->SaveDC();
pDC->m_bMono = false;
pDC->m_bPrinting = false;
pDC->m_bPrintPreview = false;
}
else
{
pDC->Attach(pdc->m_hDC);
nSaveDC = pDC->SaveDC();
pDC->m_bMono = false;
pDC->m_bPrinting = false;
pDC->m_bPrintPreview = false;
}
m_oldCursorPoint = CPoint(-1, -1);
//1. 背景色
if (pDC->m_bPrinting)
{
clRect = m_clPrintRect;
}
else
{
GetClientRect(clRect);
}
if (pDC->m_bMono)
{
pDC->FillSolidRect(clRect, RGB(255,255,255));
}
else
{
pDC->FillSolidRect(clRect, m_crBackColor);
}
//2. Chart
clChartRect.left = clRect.left + m_nLeftMargin;
clChartRect.top = clRect.top + m_nTopMargin;
clChartRect.right = clRect.right - m_nRightMargin;
clChartRect.bottom = clRect.bottom - m_nBottomMargin;
//图例
if (m_bShowLegend)
{
DrawLegend(pDC, clChartRect);
}
if (pDC->m_bMono)
pDC->FillSolidRect(clChartRect, RGB(255,255,255));
else
pDC->FillSolidRect(clChartRect, m_crGraphColor);
int nLeft = clChartRect.left;
int nRight = clChartRect.right;
int nBottom = clChartRect.bottom;
CXGraphAxis::EAxisPlacement lastPlacement = CXGraphAxis::apAutomatic;
register UINT nYAxis;
register UINT nXAxis;
register UINT nCurve;
//2. 调整布局,为轴的自动调整作准备
for ( nYAxis = 0; nYAxis < m_YAxis.size (); nYAxis++)
{
if (m_YAxis[nYAxis].m_Placement == CXGraphAxis::apAutomatic)
{
if (lastPlacement == CXGraphAxis::apLeft)
{
lastPlacement = CXGraphAxis::apRight;
m_YAxis[nYAxis].m_Placement = CXGraphAxis::apRight;
}
else
{
lastPlacement = CXGraphAxis::apLeft;
m_YAxis[nYAxis].m_Placement = CXGraphAxis::apLeft;
}
}
}
//2.1 左侧 Y-轴
for (nYAxis = 0; nYAxis < m_YAxis.size (); nYAxis++)
{
if (m_YAxis[nYAxis].m_Placement != CXGraphAxis::apLeft)
{
continue;
}
int nTickWidth = m_YAxis[nYAxis].GetMaxLabelWidth (pDC); //--
HRESULT pngFlag = SUCCEEDED(CoCreateInstance (guid1,NULL,CLSCTX_INPROC_SERVER,guid2,(void **)&pImgFactory));
if (pngFlag) // 如果成功,则开始绘制png图像到HDC上
{
if(gflag==0)
{
if(SUCCEEDED(pImgFactory->CreateImageFromFile(_T("\\Program Files\\FCity\\bj.png"),&pImage)))
{
RECT rc = {6,0,236,80};
pImage->Draw(hdc, &rc, NULL);
pImage->Release();
}
}
if(SUCCEEDED(pImgFactory->CreateImageFromFile(_T("\\My Documents\\briefcase\\weather.png"),&pImage)))
{
RECT rc = {6,0,81,55};
pImage->Draw(hdc, &rc, NULL);
pImage->Release();
}
}
------解决方案--------------------
pImage->Draw(hdc, &rc, NULL);
实现双缓冲需要新建一个内存DC。可以用CreateCompatibleDC来创建。
把这里的hdc改成你新建的内存DC
待全部绘制完成后,再把你新建的内存DC绘制到hdc里就可以了。
具体代码请MSDN或百度。
------解决方案--------------------
下面 m_bDoubleBuffer == TRUE 就是双缓冲
=============================================================
void CXGraph::OnPaint()
{
CXGDCEx *pDC = new CXGDCEx;
CXGMemDC *pmdc = NULL;
CPaintDC *pdc = new CPaintDC(this);
CRect clRect, clChartRect;
int nSaveDC;
m_oldCursorPoint = CPoint(-1, -1);
if(m_pDrawDC != NULL)
{
pDC = (CXGDCEx*) m_pDrawDC;
}
else if ( m_bDoubleBuffer )
{
pmdc = new CXGMemDC(pdc);
pDC->Attach( pmdc->m_hDC );
nSaveDC = pDC->SaveDC();
pDC->m_bMono = false;
pDC->m_bPrinting = false;
pDC->m_bPrintPreview = false;
}
else
{
pDC->Attach(pdc->m_hDC);
nSaveDC = pDC->SaveDC();
pDC->m_bMono = false;
pDC->m_bPrinting = false;
pDC->m_bPrintPreview = false;
}
m_oldCursorPoint = CPoint(-1, -1);
//1. 背景色
if (pDC->m_bPrinting)
{
clRect = m_clPrintRect;
}
else
{
GetClientRect(clRect);
}
if (pDC->m_bMono)
{
pDC->FillSolidRect(clRect, RGB(255,255,255));
}
else
{
pDC->FillSolidRect(clRect, m_crBackColor);
}
//2. Chart
clChartRect.left = clRect.left + m_nLeftMargin;
clChartRect.top = clRect.top + m_nTopMargin;
clChartRect.right = clRect.right - m_nRightMargin;
clChartRect.bottom = clRect.bottom - m_nBottomMargin;
//图例
if (m_bShowLegend)
{
DrawLegend(pDC, clChartRect);
}
if (pDC->m_bMono)
pDC->FillSolidRect(clChartRect, RGB(255,255,255));
else
pDC->FillSolidRect(clChartRect, m_crGraphColor);
int nLeft = clChartRect.left;
int nRight = clChartRect.right;
int nBottom = clChartRect.bottom;
CXGraphAxis::EAxisPlacement lastPlacement = CXGraphAxis::apAutomatic;
register UINT nYAxis;
register UINT nXAxis;
register UINT nCurve;
//2. 调整布局,为轴的自动调整作准备
for ( nYAxis = 0; nYAxis < m_YAxis.size (); nYAxis++)
{
if (m_YAxis[nYAxis].m_Placement == CXGraphAxis::apAutomatic)
{
if (lastPlacement == CXGraphAxis::apLeft)
{
lastPlacement = CXGraphAxis::apRight;
m_YAxis[nYAxis].m_Placement = CXGraphAxis::apRight;
}
else
{
lastPlacement = CXGraphAxis::apLeft;
m_YAxis[nYAxis].m_Placement = CXGraphAxis::apLeft;
}
}
}
//2.1 左侧 Y-轴
for (nYAxis = 0; nYAxis < m_YAxis.size (); nYAxis++)
{
if (m_YAxis[nYAxis].m_Placement != CXGraphAxis::apLeft)
{
continue;
}
int nTickWidth = m_YAxis[nYAxis].GetMaxLabelWidth (pDC); //--