我有大量数据需要以函数曲线的形式描出来,而且还是随着时间而增多,
为了避免闪烁,我现在内存里先描出来,再贴上,但是CBitmap::CreateCompatibleBitmap(CDC* pDC, int nWidth, int nHeight )
函数似乎有大小限制,参数nWidth到了30000多就该函数就会失败,不知道哪位高人有好办法解决,谢谢!!#define  orgx 0#define  bmpsizex 30000
#define  bmpsizey 600
#define  orgy     bmpsizey - 50
void CDisplayView::Draw(CDC *_pDC)
{

CDC memDC; CBitmap *poldbitmap;
CPen *poldpen;
memDC.CreateCompatibleDC(_pDC);
if (m_bmpcurve == NULL)
{
m_bmpcurve = new CBitmap; //m_bmpcurve为CBitmap *;

CPen tmppen(PS_SOLID ,0,RGB(0,255,0)); if(0==m_bmpcurve->CreateCompatibleBitmap(_pDC,bmpsizex,bmpsizey))
TRACE("\nThe bitmap creating failed\n");

poldbitmap=memDC.SelectObject(m_bmpcurve);
memDC.FillSolidRect(0,0,bmpsizex,bmpsizey,RGB(255,255,255));
poldpen = memDC.SelectObject(&tmppen);
memDC.MoveTo(orgx,bmpsizey - 50);
memDC.LineTo(bmpsizex,orgy);
memDC.MoveTo(orgx,orgy);
memDC.LineTo(orgx,0);

for (unsigned long cx = 50;cx < bmpsizex; cx += 50)//横轴50个像素/格
{
memDC.MoveTo(cx,orgy);
if ((cx-50)%500 == 0 )
{

memDC.LineTo(cx,orgy - 20);
}
else
{
// memDC.MoveTo(cx,orgy);
memDC.LineTo(cx,orgy - 10);
}

}
for (unsigned long cy = orgy;cy >0; cy -= 10)     //纵轴10个像素一格
{
memDC.MoveTo(orgx,cy);
if ((orgy-cy) % 100 == 0)
{

memDC.LineTo(orgx+20,cy); }
else
{
memDC.LineTo(orgx+10,cy);
}

.................

解决方案 »

  1.   

    nWidth是一定有限制的,你不能无限增大啊,例如达到30000之后,你就建立新的一段,或者根据用户拖动窗口的拉杆来确定显示哪一段。一般建议使用实时生成,也就是说,用户拖动到一个中间时,你就根据时间段取中间值对应的数据显示出一个图来,这样二端都不需要显示。又快又没有限制的问题,这和CDATAGRID显示数据表是一样的,百万条记录的表CDATAGRID也是只显示你当前浏览窗口对应的那几十条,你一拖动,他就计算对应要重新显示的另外位置,再取这个位置上应该显示的数据记录。这是一样的道理的。如果要打印,可以分段计算后打印,或实时的一页一页的产生并打印。应该都不是问题。