DirectDraw2 в оконном режиме. Утечка памяти
От: Klimenko Sergey  
Дата: 08.12.04 06:55
Оценка:
Доброго времени суток!

В своем проекте, я использую 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.
Подскажите в чем проблема?

Заранее спасибо за помощь!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.