如何在.NET中调用DrawThemeTextEx

我需要在Vista / 7玻璃窗口中写一个带有发光的文本,我试图调用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); 

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

定义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匹配。 这里的数值正式描述: 零件和国家

简而言之,您可以通过调用OpenThemeData()获得所需的内容。

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

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