Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在.NET中调用DrawThemeTextEx_C#_.net_Api_Pinvoke_Aero - Fatal编程技术网

C# 如何在.NET中调用DrawThemeTextEx

C# 如何在.NET中调用DrawThemeTextEx,c#,.net,api,pinvoke,aero,C#,.net,Api,Pinvoke,Aero,我需要在Vista/seven glass窗口中编写带有辉光的文本,我正在尝试调用API在那里编写一些文本。我已经签出了一个很棒的in-CodeProject,但问题是我使用的是.NET1(请不要问:-) 我需要将下面的.NET2代码翻译成PInvoke.NET1代码 // using System.Windows.Forms.VisualStyles VisualStyleRenderer renderer = new VisualStyleRenderer(

我需要在Vista/seven glass窗口中编写带有辉光的文本,我正在尝试调用API在那里编写一些文本。我已经签出了一个很棒的in-CodeProject,但问题是我使用的是.NET1(请不要问:-)

我需要将下面的.NET2代码翻译成PInvoke.NET1代码

// 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

简而言之,您可以通过调用

为了解决所有的细节,你可以更容易地在C++中编写一个示例应用程序来了解如何从地面上驱动主题API。网上有很多教程和很多示例代码。但是在C++中,你将拥有所有的函数。您最不想做的事情就是在处理低级别主题API的同时,还要处理P/Invokes


一旦你在C++中破解它,然后转到P/Cube,如果你有问题,很容易引用到C++的代码。

< P>定义OpenMeTeDATA API和DejTeMeExtEX,以及一些所需的结构和常数:

    [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_标题和CS_活动值分别匹配.NET 2的标题和活动。此处对值进行了正式描述:

任何想要使用此代码的人都要小心。它有内存泄漏。作者使用的Win32 API要求通过
CloseMetadata
API调用释放
handle
。@ahmd0-当然,Windows API不是“托管”的,通常您必须释放所获得的。如果您仔细阅读,这段代码甚至没有编译,只是完整的。这是示例代码,不是生产代码。您还应该检查OpenThemeData的返回值和DrawThemeText的返回值。