0

我正在尝试调用我自己的函数 - 从我无法控制的程序中 - 使用钩子在程序的同一窗口上进行绘制。它工作了一段时间,但随后崩溃让我认为这可能是 GDI 泄漏左右。想知道是否有人可以查看此代码并可以从通用结构的角度发表评论以及任何可以改进的地方。我遇到的第二个问题是文本每隔几秒钟就会闪烁一次。任何人都可以在这方面提供帮助吗?请注意,在 C++ GDI 方面,我仍然是初学者。谢谢。

void Paint(HWND hWnd)
{
    HDC hdc = GetWindowDC(hWnd);
    HBRUSH Brush = CreateSolidBrush(RGB(255,255,0));
    HPEN   Pen = CreatePen(PS_DOT,1,RGB(255,255,0));
    HGDIOBJ PriorBrush = SelectObject(hdc, Brush);
    HGDIOBJ PriorPen = SelectObject(hdc, Pen);

    Gdiplus::Graphics g(hdc);
    Gdiplus::Pen pen(Gdiplus::Color(255, 255, 0, 0), 1);
    g.DrawLine(&pen,fpx,fpy,spx,spy);
    Font font(&FontFamily(L"Arial"), 12);
    LinearGradientBrush brush(Rect(0,0,100,100), Color::Red, Color::Yellow, LinearGradientModeHorizontal);
    Status st = g.DrawString(L"SampleText!", -1, &font, PointF((float)spx, (float)spy), &brush);
    assert(st == Ok);

    SelectObject(hdc,PriorBrush);
    SelectObject(hdc,PriorPen);
    ReleaseDC(hWnd,hdc);
    return;
}

//

使用以下方法进行上述调用:

    case WM_PAINT:
    {
        LRESULT l = CallWindowProc(hook, hWnd, uMsg, wParam, lParam);
        Paint(hWnd);
        return l;
    }
4

2 回答 2

0

您正在泄漏Brush-Pen您需要DeleteObject在从 DC 中选择它们后使用。

(或者摆脱它们——它们甚至被使用过吗?)

于 2013-04-23T21:44:35.180 回答
0

这段代码现在看起来不错吗?谢谢

void Paint(HWND hWnd)
{
     HDC hdc = GetWindowDC(hWnd);

Gdiplus::Graphics g(hdc);
Gdiplus::Pen pen(Gdiplus::Color(255, 255, 0, 0), 1);
g.DrawLine(&pen,fpx,fpy,spx,spy);
Font font(&FontFamily(L"Arial"), 12);
LinearGradientBrush brush(Rect(0,0,100,100), Color::Red, Color::Yellow, LinearGradientModeHorizontal);
Status st = g.DrawString(L"SampleText!", -1, &font, PointF((float)spx, (float)spy), &brush);
assert(st == Ok);

DeleteObject(&pen);
DeleteObject(&brush);

ReleaseDC(hWnd,hdc);
return;
}
于 2013-04-23T22:03:43.587 回答