从图形对象获取uxtheme.dll DrawThemeParentBackground的hwnd

时间:2019-05-31 10:54:28

标签: .net winforms gdi+ visual-styles

我正在处理一些旧的绘制代码,这些代码用于在WinFroms应用程序中绘制样式化的系统控件的一部分。完成这项工作的核心例程之一如下:

private bool DrawTheme(Graphics graphics, XPThemeClasses themeClass, int themePart, int themeState, int x, int y, int width, int height)
{
    bool myResult;
    IntPtr myHdc = graphics.GetHdc();
    try
    {
        NativeMethods.RECT myRect = new NativeMethods.RECT(x, y, width, height);
        IntPtr myThemeData = GetThemeData(themeClass);
        if (NativeMethods.IsThemeBackgroundPartiallyTransparent(myThemeData, themePart, themeState))
        {
            IntPtr hwnd = NativeMethods.WindowFromDC(myHdc);
            int res = NativeMethods.DrawThemeParentBackground(hwnd, myHdc, ref myRect);
        }
        myResult = (0 <= NativeMethods.DrawThemeBackground(
          myThemeData,
          myHdc,
          themePart,
          themeState,
          ref myRect, ref myRect));
    }
    catch
    {
        myResult = false;
    }
    finally
    {
        graphics.ReleaseHdc(myHdc);
    }
    return myResult;
}

事实证明DrawThemeParentBackground函数失败。它返回错误代码0x80070006(E_HANDLE),表示“句柄无效”。看来,发生这种情况是因为先前的WindowFromDC API调用检索到了零窗口句柄。

是否可以从传递给此函数的Graphics对象中获取正确的hwnd并将其传递给DrawThemeParentBackground?我知道我可以传递窗口的句柄以从外部调用代码中提取内容,但这将需要重写该项目基础结构的很大一部分。因此,我正在寻找此问题的简单解决方案,而无需重写很多代码。

0 个答案:

没有答案