Как вызвать DrawThemeTextEx в .NET - PullRequest
2 голосов
/ 28 марта 2011

Мне нужно написать текст со свечением в стеклянном окне Vista / seven, и я пытаюсь вызвать API, чтобы написать там какой-нибудь текст.Я проверил отличный образец в CodeProject, но проблема в том, что я использую .NET 1 (пожалуйста, не спрашивайте: -)

Мне нужно перевести следующийКод .NET 2 для PInvoke, код .NET 1.

// using System.Windows.Forms.VisualStyles
VisualStyleRenderer renderer = new VisualStyleRenderer(
                               VisualStyleElement.Window.Caption.Active);

// call to UxTheme.dll
DrawThemeTextEx(renderer.Handle, 
                memoryHdc, 0, 0, text, -1, (int)flags,    
                ref textBounds, ref dttOpts);

Класс VisualStyleRenderer не существует в .NET 1, поэтому мне нужно получить renderer.Handle другим способом.

Ответы [ 2 ]

2 голосов
/ 29 марта 2011

Определите API OpenThemeData и DrawThemeTextEx, а также некоторые необходимые структуры и константы:

    [DllImport("uxtheme.dll", CharSet = CharSet.Unicode)]
    private static extern IntPtr OpenThemeData(IntPtr hwnd, string pszClassList);

    [DllImport("uxtheme.dll", CharSet = CharSet.Unicode)]
    private extern static Int32 DrawThemeTextEx(IntPtr hTheme, IntPtr hdc, int iPartId, int iStateId, string pszText, int iCharCount, uint flags, ref RECT rect, ref DTTOPTS poptions);

    [StructLayout(LayoutKind.Sequential)]
    private struct RECT
    {
        public int left;
        public int top;
        public int right;
        public int bottom;
    }

    [StructLayout(LayoutKind.Sequential)]
    private struct DTTOPTS
    {
      public int dwSize;
      public int dwFlags;
      public int crText;
      public int crBorder;
      public int crShadow;
      public int iTextShadowType;
      public int ptShadowOffsetX;
      public int ptShadowOffsetY;
      public int iBorderSize;
      public int iFontPropId;
      public int iColorPropId;
      public int iStateId;
      public bool fApplyOverlay;
      public int iGlowSize;
      public IntPtr pfnDrawTextCallback;
      public IntPtr lParam;
    }

    // taken from vsstyle.h
    private const int WP_CAPTION = 1;
    private const int CS_ACTIVE = 1;

А затем назовите это так:

IntPtr handle = OpenThemeData(IntPtr.Zero, "WINDOW");
DrawThemeTextExt(handle, hdc, WS_CAPTION, CS_ACTIVE, ...)

Значения WS_CAPTION и CS_ACTIVE соответствуют заголовкам .NET 2 и активным соответственно. Значения описаны здесь официально: Детали и состояния

0 голосов
/ 29 марта 2011

Короче говоря, вы получаете то, что хотите, позвонив по телефону OpenThemeData().

Чтобы проработать все детали, вам будет гораздо проще написать пример приложения на C ++, чтобы узнать, как управлять API темы с нуля. В Интернете есть много учебников и много примеров кода. Но делайте это в C ++, где у вас будут все доступные функции. Последнее, что вы хотите сделать, это бороться с P / Invokes, в то время как вы также овладеваете низкоуровневым API тем.

Как только вы взломали его в C ++, переходите к P / Invokes, и если у вас возникнут проблемы, будет легко вернуться к работающему коду C ++.

...