Получение hwnd для uxtheme.dll DrawThemeParentBackground из графического объекта - PullRequest
0 голосов
/ 31 мая 2019

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

...