如何在.NET中调用DrawThemeTextEx

时间:2011-03-28 16:15:56

标签: c# .net api pinvoke aero

我需要在Vista / 7玻璃窗口中写一个带有发光的文本,我试图调用API在那里写一些文本。我在CodeProject中检查了一个很棒的sample,但问题是我使用的是.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);

.NET 1中不存在类VisualStyleRenderer,因此我需要以其他方式获取renderer.Handle

2 个答案:

答案 0 :(得分:2)

定义OpenThemeData API和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的Caption和Active匹配。这里的值正式描述:Parts and States

答案 1 :(得分:0)

简而言之,您可以致电OpenThemeData()来获得所需内容。

要弄清楚所有细节,您可以更轻松地用C ++编写示例应用程序,以了解如何从头开始驱动主题API。网上有很多教程和大量示例代码。但是在C ++中你可以使用所有功能。你想要做的最后一件事就是与P / Invokes斗争,同时你也要掌握低级主题API。

一旦你用C ++破解它,然后转到P / Invokes,如果你遇到问题,很容易回到有效的C ++代码。