在Windows GDI中创建和使用字体/避免内存泄漏

时间:2011-06-06 19:05:03

标签: c windows-ce gdi

我正试图在用C语言编写并在Windows CE 6.0上运行的应用程序中找到内存泄漏的底部。我怀疑这个问题可能与窗口的paint事件的处理有关。在伪代码中它看起来像这样。

LRESULT CALLBACK HandlePaint(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam) 
{
    HDC hdc;
    PAINTSTRUCT ps;
    hdc = BeginPaint (hWnd, &ps);

    HFONT logfont;
    FONTINFO font1, font2;

    memset(&logfont, 0, sizeof(LOGFONT));
    //set font options for font1.
    font1 = CreateFontIndirect(&logfont);

    memset(&logfont, 0, sizeof(LOGFONT));
    //set font options for font2.
    font2 = CreateFontIndirect(&logfont);

    for(int i = 0; i <= SOME_NUMBER; i++)
    {
        DrawStuff(hdc, font1);
        DrawStuff(hdc, font2);
    }   

    EndPaint (hWnd, &ps);

}

INT DrawStuff(HDC hdc, HFONT font)
{
    HPEN pen = CreatePen(PS_SOLID, borderWidth, bordercolor);
    HBRUSH brush = CreateSolidBrush(backcolor);

    SelectObject (hdc, pen);
    SelectObject (hdc, brush);
    SelectObject(hdc, font);

    SetTextColor (hdc, forecolor);
    SetBkColor (hdc, backcolor);
    DrawText (hdc, pChar, wcslen(pChar), prect, DT_CENTER|DT_VCENTER|DT_SINGLELINE|DT_NOPREFIX);

    DeleteObject(font);
    DeleteObject(brush);
    DeleteObject(pen);
}

我注意到在我看到的windows图形示例中,大多数grapics对象似乎都有一个模式:

HBRUSH brush = CreateBrush();
SelectObject(hdc, brush);
// use brush
DeleteObject(brush);

但是,正如您在上面的示例中看到的那样,每个字体都会被创建一次,然后被选中/删除多次。我不确定这样做的含义是什么。是否有理由怀疑这里有内存泄漏?

谢谢!

1 个答案:

答案 0 :(得分:5)

我同意@pmg的评论,表格的创建者应该是字体的破坏者,而不是DrawStuff被叫者。

还要记住,SelectObject会返回DC中的原始项目,并且在完成后应始终返回该对象,例如:

HPEN newPen = CreatePen(...);
HPEN oldPen = SelectObject(hdc, newPen);

// do stuff

// clean up
SelectObject(hdc, oldPen); // <-- note this line
DeleteObject(newPen);