2009-10-18 69 views
1

我在写一个使用C++的Win32应用程序。缓存位图

在此应用中,我处理了WM_PAINT消息:

case WM_PAINT: 
    hdc = BeginPaint(hWnd, &ps); 
    GdiplusStartup(&gdiplusToken, &gdiPlusStartup, 0); 
    DrawM(ps.hdc, hWnd); 
    EndPaint(hWnd, &ps); 
    break; 

而在我有这样的事情DrawM功能:

void DrawMap(HDC hdc, HWND hWnd) 
{ 

if(!isDrawn) 
{ 
      // (some calculations) 
    Graphics g(hdc); 
    Bitmap img(max_x, max_y, &g); 

    int zoom_factor = 50; 
    for(int i = 0; i< segments.size(); i++) 
    { 
        // (some math) 
     for(int j = 0; j < segments.at(i).point_count; j++) 
       // (another dose of math) 
     g.DrawLines(&pen, segmentPoints, segments.at(i).point_count); 
     delete [] segmentPoints; 
    } 
    g.Save(); 
    isDrawn = true; 
} 
else 
{ 
     // here is the problem 
} 

}

在代码上面,我想要做的是渲染图像一次,然后当窗口被调整大小,移动或任何事情发生时,需要重绘不会从头开始渲染位图,在取而代之,它应该使用缓存的。

问题是位图不允许复制(复制构造函数拒绝它)。 另一个问题是,当我试图将图像保存到一个文件或我收到“无效参数”错误流(即返回码2):

CLSID pngClsid; 
    GetEncoderClsid(L"image/png", &pngClsid); 
    img.Save(_T("m.png"), &Gdiplus::ImageFormatPNG, NULL); 

- >的clone()也似乎它不工作,因为当我定义一个指针指向一个位图,克隆位图,并在“其他”语句我用:

Graphics g(hdc); 
    g.DrawImage(bmpClone, 50, 50); 

没有呈现。

有关如何缓存位图的任何想法?

回答

1

Clone()应该工作,但没有看到你的代码(它使用它)很难知道发生了什么。作为替代,另一种(更迂回)的方法是在原始Bitmap上调用GetHBITMAP(),存储GDI位图句柄,然后在将来重绘中构造具有Bitmap(HBITMAP, HPALETTE)构造函数的新的Bitmap

1

而不是声明img作为本地对象,使其成为一个静态或类的成员。然后它将在下一个WM_PAINT中可用,而不需要复制。

+0

我不行。因为,为了构建img我需要知道高度和宽度,这是根据我在Draw方法中所做的计算来计算的。 而我不能创建一个简单的:位图img;然后将其分配给:img = Bitmap(...),因为它没有无参数的构造函数。 如果这能解决问题,我的问题就解决了。 – 2009-10-18 06:27:21

+1

那么为什么不保存一个指向位图的指针呢?这样你就不需要预先分配它。 – 2009-10-19 04:53:50