Доброго времени суток!
В своем проекте, я использую DirectDraw2. При этом поверхность создается в оконном режиме, а утечка памяти возникает при измении размера окна
Инициализация:
//Создаем объект DirectDraw
DirectDrawCreate(NULL, &DDtemp, NULL);
//Запрашиваем интерфейс DirectDraw2
ddrval = DDtemp->QueryInterface(IID_IDirectDraw2,(LPVOID *)&DD);
if(ddrval!= DD_OK)MessageBox(winHandle,"Cannot create DirectDraw2","Error",MB_OK);
//Устанавливаем уровень взаимодействия
DD->SetCooperativeLevel(winHandle,DDSCL_NORMAL);
//Создаем первичную поверхность
ZeroMemory(&SurfCaps,sizeof(SurfCaps));
SurfCaps.dwSize=sizeof(SurfCaps);
SurfCaps.dwFlags = DDSD_CAPS;
SurfCaps.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
if(createSurface2(DD, &SurfCaps, &PrimarySurf, NULL) != DD_OK)
Application->MessageBox("Not enought memory to create primary surface","Error",MB_OK);
//Создаем вторичную поверхности
ZeroMemory(&SurfCaps,sizeof(SurfCaps));
SurfCaps.dwSize = sizeof(SurfCaps);
SurfCaps.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH ;
SurfCaps.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
SurfCaps.dwHeight = FdrawArea.bottom - FdrawArea.top;
SurfCaps.dwWidth = FdrawArea.right - FdrawArea.left;
if(createSurface2(DD, &SurfCaps, &SecondarySurf, NULL) != DD_OK)
{
SurfCaps.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
if(createSurface2(DD, &SurfCaps, &SecondarySurf, NULL) != DD_OK)
Application->MessageBox("Not enought memory to create secondary surface","Error",MB_OK);
};
//Создаем clipper
if(DD->CreateClipper(0, &Clipper, NULL)!= DD_OK)
Application->MessageBox("Cannot create Clipper","Error",MB_OK);
//Создаем clipper буфера экрана
if(DD->CreateClipper(0, &BackClipper, NULL)!= DD_OK)
Application->MessageBox("Cannot create Back-clipper","Error",MB_OK);
Clipper->SetHWnd(0,winHandle);
PrimarySurf->SetClipper(Clipper);
//Настраиваем back-clipper
RGNDATA *ClipList;
ClipList = (RGNDATA*) malloc(1024);
BackSurfRgn = CreateRectRgn(0, 0, FdrawArea.Width(), FdrawArea.Height());
GetRegionData(BackSurfRgn, 1024, ClipList);
BackClipper->SetClipList(ClipList,0);
SecondarySurf->SetClipper(BackClipper);
free(ClipList);
DeleteObject(BackSurfRgn);
Обработчик изменения размера окна:
if(SecondarySurf) {
SecondarySurf->Release();
SecondarySurf = NULL;
}
//Настроем клиппер и область прорисовки
ClipList = (RGNDATA*) malloc(1024);
Point = ClientToScreen(Point);
BackSurfRgn = CreateRectRgn(Point.x, Point.y, ClientRect.Width() + Point.x, ClientRect.Height() + Point.y);
GetRegionData(BackSurfRgn, 1024, ClipList);
Clipper->SetClipList(ClipList,0);
FdrawArea = TRect(0,0, ClientWidth, ClientHeight);
free (ClipList);
DeleteObject(BackSurfRgn);
//Создаем вторичную поверхности
ZeroMemory(&SurfCaps,sizeof(SurfCaps));
SurfCaps.dwSize = sizeof(SurfCaps);
SurfCaps.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH ;
SurfCaps.ddsCaps.dwCaps = DDSCAPS_LOCALVIDMEM | DDSCAPS_VIDEOMEMORY | DDSCAPS_OFFSCREENPLAIN;
SurfCaps.dwHeight = FdrawArea.bottom - FdrawArea.top + 1;
SurfCaps.dwWidth = FdrawArea.right - FdrawArea.left + 1;
if(createSurface2(DD, &SurfCaps, &SecondarySurf, NULL) != DD_OK) {
SurfCaps.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
if(createSurface2(DD, &SurfCaps, &SecondarySurf, NULL) != DD_OK)
Application->MessageBox("Not enought memory to create secondary surface","Error",MB_OK);
}
Действия при очередной отрисовке:
RGNDATA *ClipList;
HRGN BackSurfRgn;
TPoint Point(0,0);
ClipList = (RGNDATA*) malloc(1024);
Point = ClientToScreen(Point);
BackSurfRgn = CreateRectRgn(Point.x, Point.y, Width + Point.x, Height + Point.y);
GetRegionData(BackSurfRgn, 1024, ClipList);
Clipper->SetClipList(ClipList,0);
free (ClipList);
DeleteObject(BackSurfRgn);
Утечка памяти очень видна при изменении размера окна в Windows 2000.
Подскажите в чем проблема?
Заранее спасибо за помощь!