我正在处理一些用于在 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
?我知道我可以通过窗口句柄从外部调用代码中绘制,但这需要重写该项目的大部分基础设施。所以我正在寻找这个问题的简单解决方案,而无需重写太多代码。