Я имею дело со старым кодом рисования, который использовался для рисования частей стилизованных системных элементов управления в приложении 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.
Есть ли способ получить правильный hwnd из объекта Graphics, переданного этой функции для передачиэто к DrawThemeParentBackground
?Я знаю, что могу передать дескриптор окна для извлечения из внешнего вызывающего кода, но для этого потребуется переписать большую часть инфраструктуры этого проекта.Поэтому я ищу простое решение этой проблемы без переписывания большого количества кода.