none
C#调用DWMAPI.dll函数实现毛玻璃效果诡异。。。 RRS feed

  • 问题

  • RT,怎么描述好呢。。。就是弄出来的窗口中间有道白色的东西,右边还有条黑色的线。。。
    首先为了调用API,我创建了两个类。
        class VistaAPI
        {
            [DllImport("dwmapi.dll", PreserveSig = false)]
            public static extern void DwmExtendFrameIntoClientArea(System.IntPtr hWnd, Margins pMargins);
            [DllImport("dwmapi.dll", PreserveSig = false)]
            public static extern bool DwmIsCompositionEnabled();

        }
        class Margins
        {
            public int Left, Right, Top, Bottom;
        }
    Form_Load方法中扩展框体。
           private void Form1_Load(object sender, EventArgs e)
            {
                Margins marg = new Margins();
                marg.Top = -1;
                marg.Bottom = -1;
                marg.Left = -1;
                marg.Right = -1;

                if (VistaAPI.DwmIsCompositionEnabled())
                {
                    VistaAPI.DwmExtendFrameIntoClientArea(this.Handle,marg);
                }
            }
    Form_Paint方法中填充黑色。
            private void Form1_Paint(object sender, PaintEventArgs e)
            {
                e.Graphics.FillRectangle(Brushes.Black, this.ClientRectangle);
            }
    结果弄出来效果很雷人,不知道这是哪里出错了。。。

    2010年2月21日 8:18

答案

  • 我是C#初学者,问一下,这个dwmapi.dll在引用里面无法导入是怎么回事?

    多谢!

    dwmapi需要使用平台调用来调用里面的函数,在类中声明

    [DllImport("dwmapi.dll")]
    public static extern void DwmExtendFrameIntoClientArea(System.IntPtr hWnd, Margins pMargins);
    [DllImport("dwmapi.dll")]
    public static extern bool DwmIsCompositionEnabled();

    之后,就可以像调用普通方法一样调用这些API了.

    关于P/Invoke,您可以看一下这篇文章:

    developer.51cto.com/art/200908/145191.htm

     

     


    共同努力,共同提高
    kaedei#live.cn My BLOG
    2010年4月19日 5:15

全部回复

  • 刚才试了一下,我这里结果是正常的……能否截个图呢
    共同努力,共同提高
    kaedei#live.cn My BLOG
    2010年2月21日 12:43
  • 我是C#初学者,问一下,这个dwmapi.dll在引用里面无法导入是怎么回事?

    多谢!

    2010年4月18日 10:11
  • 我是C#初学者,问一下,这个dwmapi.dll在引用里面无法导入是怎么回事?

    多谢!

    dwmapi需要使用平台调用来调用里面的函数,在类中声明

    [DllImport("dwmapi.dll")]
    public static extern void DwmExtendFrameIntoClientArea(System.IntPtr hWnd, Margins pMargins);
    [DllImport("dwmapi.dll")]
    public static extern bool DwmIsCompositionEnabled();

    之后,就可以像调用普通方法一样调用这些API了.

    关于P/Invoke,您可以看一下这篇文章:

    developer.51cto.com/art/200908/145191.htm

     

     


    共同努力,共同提高
    kaedei#live.cn My BLOG
    2010年4月19日 5:15
  • 你是说在Vista或者win7环境下编译吗?我想在xp下编译,在vs08建的C#项目中导入这个dll文件作引用,可是提示无法导入,郁闷。我有个VB的玻璃效果程序代码,模拟的效果很完美,可是我看不懂VB。

    2010年4月19日 7:10
  • 您好。

    请不要使用VS的“添加引用”,直接在类里面写上这些代码就可以了。

    当程序需要调用这几个函数时才会检查API名称是否正确。

    所以在调用函数前先检查一下系统版本吧

    if(Enviorment.OSVersion.Version.Major >= 6)
    { 
      if(DwmIsCompositionEnabled())
      {
        //绘图
      }
    }
    else
    {
      //XP
    } 

    另外,如果只是在XP下模拟玻璃效果的话,就不能使用这两个API了(因为从Vista开始才提供)

     

    这里有个网站可以把简单的VB.NET代码转换为C#代码

    www.developerfusion.com/tools/convert/vb-to-csharp/

     


    共同努力,共同提高
    kaedei#live.cn My BLOG
    2010年4月23日 4:56