当前位置:编程学习 > C#/ASP.NET >>

比较完美的实现Areo,也就是win7的毛玻璃.

--------------------编程问答-------------------- using System.Runtime.InteropServices;
        [DllImport("kernel32")]
        static extern int GetVersionExA(ref OSVERSIONINFO 系统信息);
        [DllImport("user32")]
        static extern long GetWindowLongA(int hWnd, int nIndex);
        [DllImport("user32")]
        static extern int SetWindowLongA(int hWnd, int nIndex, long dwNewLong);
        [DllImport("user32")]
        static extern int SetLayeredWindowAttributes(int hWnd, int cr, int alp, int index);
        [DllImport("dwmapi")]
        static extern int DwmIsCompositionEnabled(ref int pfEnabled);
        [DllImport("dwmapi")]
        static extern int DwmEnableComposition(int uCompositionAction);
        [DllImport("dwmapi")]
        static extern int DwmExtendFrameIntoClientArea(int hWnd, ref _MARGINS pMarInset);
        [DllImport("dwmapi")]
        static extern int DwmEnableBlurBehindWindow(int hWnd, ref _DWM_BLURBEHIND pBlurBehind);

        int hWnd = new int();//定义程序集变量

        public struct OSVERSIONINFO
        {
            public int dwOSVersionInfoSize;
            public int dwMajorVersion;
            public int dwMinorVersion;
            public int dwBuildNumber;
            public int dwPlatformId;
        }
        public struct _MARGINS
        {
            public int cxLeftWidth;
            public int cxRightWidth;
            public int cyTopHeight;
            public int cyBottomHeight;
        } --------------------编程问答--------------------
        private void Form1_Load(object sender, EventArgs e)
        {
            hWnd = Handle.ToInt32();

            //判断系统版本,6和6以上版本可以使用
            OSVERSIONINFO 版本信息 = new OSVERSIONINFO();
            版本信息.dwOSVersionInfoSize = 148;
            GetVersionExA(ref 版本信息);
            if (版本信息.dwMajorVersion < 6)
            {
                MessageBox.Show("当前系统版本无法使用Areo!");
                DestroyHandle();
            }

            long nIndex = GetWindowLongA(hWnd, -20);
            nIndex = nIndex | 524288;
            SetWindowLongA(hWnd, -20, nIndex);
            SetLayeredWindowAttributes(hWnd, 16711680, 255, 1);
        }
--------------------编程问答--------------------
        private void button1_Click(object sender, EventArgs e)
        {
            int pfEnabled = new int();
            DwmIsCompositionEnabled(ref pfEnabled);
            if (pfEnabled == 1)
            {
                MessageBox.Show("该系统开启了Areo效果");
            }
            else
            {
                MessageBox.Show("该系统没有开启Areo效果");
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            DwmEnableComposition(0);
            MessageBox.Show("已经在当前进程关闭Aero 退出进程后界面会自动恢复");
        }

        private void button3_Click(object sender, EventArgs e)
        {
            DwmEnableComposition(1);
            MessageBox.Show("已经在当前进程开启Aero 退出进程后界面会自动恢复");
        }

        private void button4_Click(object sender, EventArgs e)
        {


            this.BackColor = ColorTranslator.FromWin32(16711680);
            checkedListBox1.BackColor = ColorTranslator.FromWin32(16711680);
            progressBar1.BackColor = ColorTranslator.FromWin32(16711680);
            textBox1.BackColor = ColorTranslator.FromWin32(16711680);
            tabPage1.BackColor = ColorTranslator.FromWin32(16711680);
            tabPage2.BackColor = ColorTranslator.FromWin32(16711680);
            tabPage1.ForeColor = ColorTranslator.FromWin32(16711680);
            tabPage2.ForeColor = ColorTranslator.FromWin32(16711680);
            _MARGINS sRT = new _MARGINS();
            sRT.cxLeftWidth = -1;
            DwmExtendFrameIntoClientArea(hWnd, ref sRT);
        }
--------------------编程问答-------------------- XP系统下也是这个效果?? 强烈支持!!! 顶起!!! --------------------编程问答-------------------- 可能吗?
引用 4 楼  的回复:
XP系统下也是这个效果?? 强烈支持!!! 顶起!!!
--------------------编程问答--------------------
引用 5 楼  的回复:
可能吗?

引用 4 楼 的回复:

XP系统下也是这个效果?? 强烈支持!!! 顶起!!!

嗯 即使实现 实现起来恐怕也没这么简单。。。 --------------------编程问答-------------------- XP没这API --------------------编程问答-------------------- DWM --------------------编程问答-------------------- 你得到了一个效果,你却失去了XP那么多用户。 --------------------编程问答-------------------- xp肯定是不行的。不过感谢分享。 --------------------编程问答-------------------- 感谢分享。 --------------------编程问答-------------------- 这不就是利用新系统提供的新API调用吗?还以为模拟实现哈.不过还是感谢分享. --------------------编程问答-------------------- 这些api应该受windows版本的限制,某些版本不支持 --------------------编程问答-------------------- 学习学习支持一个。 --------------------编程问答-------------------- Vista或者Win7 --------------------编程问答-------------------- 感谢分享。。不过代码貌似有些不全? --------------------编程问答-------------------- 以前做winform在win7 areo没发现有什么问题啊 --------------------编程问答-------------------- 感谢分享。。不过代码貌似有些不全? --------------------编程问答--------------------
引用 18 楼  的回复:
感谢分享。。不过代码貌似有些不全?

我也没怎么明白,来看看下 --------------------编程问答-------------------- 很好,很实用。 --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- Vista或者Win7 --------------------编程问答-------------------- 我还以为是LZ自己写算法实现出毛玻璃效果。。。 --------------------编程问答-------------------- 不懂还是不懂! --------------------编程问答-------------------- 感谢分享。。。 --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- 学习了。。不错 不错。 --------------------编程问答--------------------  新手学习了。。。。谢谢楼主分享 --------------------编程问答-------------------- 感谢分享,可惜现在国内还是XP的天下。 --------------------编程问答--------------------
long nIndex = GetWindowLongA(hWnd, -20);
        
这句报异常
“AccessViolationException异常,尝试读取或写人受保护的内存。这通常指示其他内存已损坏。” --------------------编程问答-------------------- 不错,好好学习 --------------------编程问答-------------------- 句柄用IntPtr更好吧,用int的话,64位机不就完了? --------------------编程问答-------------------- --------------------编程问答--------------------
引用 35 楼  的回复:
句柄用IntPtr更好吧,用int的话,64位机不就完了?


当时没有考虑到,谢谢指教 --------------------编程问答-------------------- 不错啊。辛苦了 --------------------编程问答-------------------- 支持楼主,楼主辛苦了 --------------------编程问答-------------------- 楼主辛苦了…………………… --------------------编程问答-------------------- 变量名还用中文,还是说为了方便大家理解? --------------------编程问答-------------------- xp有什么好的? 那种 安于现状,恐惧革新,接受不了新事物的、人云亦云的、掏2000块钱换新机器的钱不肯花的,老东西。 何必为他们服务?他们肯为你的软件掏一分钱吗?

引用 9 楼  的回复:
你得到了一个效果,你却失去了XP那么多用户。
--------------------编程问答-------------------- 既然可以用,那就用呗。 不于老外合作,用中文不也是挺好的么。      最终编译后出的代码不会受影响的
引用 41 楼  的回复:
变量名还用中文,还是说为了方便大家理解?
--------------------编程问答-------------------- 学习了 --------------------编程问答-------------------- 看到了 易语言的风格 中文变量 呵呵 --------------------编程问答-------------------- 擦 看到楼上说的 中文变量 我又上去看了下 果然 系统信息 囧rz
不过areo 我用SkinH_Net 解决 嘎嘎 自己写不好用哦..
不知道楼主这个 xp下实验过吗? --------------------编程问答-------------------- 正在用WIN7的来试试了,留名收藏 --------------------编程问答-------------------- --------------------编程问答-------------------- 说的好~!
引用 42 楼  的回复:
xp有什么好的? 那种 安于现状,恐惧革新,接受不了新事物的、人云亦云的、掏2000块钱换新机器的钱不肯花的,老东西。 何必为他们服务?他们肯为你的软件掏一分钱吗?

引用 9 楼  的回复:

你得到了一个效果,你却失去了XP那么多用户。
--------------------编程问答-------------------- 上网本    用不了win7 好不  只能xp了 --------------------编程问答-------------------- 支持楼主,楼主辛苦了
不过我都不用的,哈哈 --------------------编程问答-------------------- 看着不错 --------------------编程问答-------------------- 貌似以前在XP下實現過透明的類似win7的透明按鈕,不是areo。 --------------------编程问答-------------------- --------------------编程问答-------------------- win7谢谢!! --------------------编程问答-------------------- --------------------编程问答--------------------
引用 53 楼  的回复:
貌似以前在XP下實現過透明的類似win7的透明按鈕,不是areo。

那种透明不带毛玻璃效果的。如果带的话,卡的要命。
做过xp下面的模糊算法。当时比较兴奋,甚至想过自己在xp下面实现个dwm模块。。。但是发现一个是太卡、再一个拿到win7下面反而用不了了(除非你关掉win7自己的毛玻璃效果)。。。想想最终还是放弃了。。。 --------------------编程问答-------------------- --------------------编程问答-------------------- 感谢楼主 支持楼主 --------------------编程问答-------------------- XP支持就好了 --------------------编程问答-------------------- 貌似,不懂哦... .... --------------------编程问答-------------------- 支持!
我之前copy过类似代码,那个是把黑色当作透明色了,然后所有黑色字体都没了……从而导致了界面上面没字的悲剧。楼主好像是把粉色当背景色,这个应该很多win32的程序是这样处理透明的…… --------------------编程问答-------------------- w7挺起来!!! --------------------编程问答-------------------- --------------------编程问答-------------------- 感谢楼主分享 --------------------编程问答-------------------- 嗯嗯,这个好 --------------------编程问答-------------------- --------------------编程问答-------------------- 我去弄来看看。  --------------------编程问答--------------------
引用 62 楼  的回复:
支持!
我之前copy过类似代码,那个是把黑色当作透明色了,然后所有黑色字体都没了……从而导致了界面上面没字的悲剧。楼主好像是把粉色当背景色,这个应该很多win32的程序是这样处理透明的……

那些黑色的部分(其实应该是所有的部分)都要带alpha通道的。而老式gdi函数的alpha位都会被填0。结果被dwm当作全透明了。 --------------------编程问答-------------------- 受教了 --------------------编程问答--------------------
引用楼主  的回复:
大家有研究过areo的就知道,开启areo后,控件就会消失 或者看不到标题,其实解决方法很简单,大家看看就知道了.代码没有任何技术含量...

嗯,先上个效果图



嗯嗯,再容许我废话两句...

我刚刚接触C#,基本就是两眼什么看不到的瞎撞,基础一塌糊涂,这个等下你们看下我写的代码就知道.

写这个毛玻璃也是,百度+MSDN 挠破头皮写出来的.

作为一个新手,我想说,……

楼主,请教下,这个Aero效果怎么实现呢!
http://topic.csdn.net/u/20120425/15/1fa4f801-3647-4162-9992-258272476263.html --------------------编程问答--------------------
引用 71 楼  的回复:
引用楼主 的回复:
大家有研究过areo的就知道,开启areo后,控件就会消失 或者看不到标题,其实解决方法很简单,大家看看就知道了.代码没有任何技术含量...

嗯,先上个效果图



嗯嗯,再容许我废话两句...

我刚刚接触C#,基本就是两眼什么看不到的瞎撞,基础一塌糊涂,这个等下你们看下我写的代码就知道.

写这个毛玻璃也是,百度+MSDN 挠破头皮写出来的.

……


等我打完这局游戏 好好研究下 --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- 这个写的太麻烦,只要封装一个类就可以了。并且,这不是真正意义上的aero,只能是说窗体实现透明四种方式中的一种。可以看到有些控件周边呈现了锯齿效果。真正的aero效果窗体上的每一个label都是用GDI+画上去的,不是拖拖控件那么简单,图片绘制的时候要光滑绘制,这样才不会有锯齿。 --------------------编程问答-------------------- XP下没这API, Win7/Vista下要实现aero还得显示支持. --------------------编程问答-------------------- 不错
string str="good";
--------------------编程问答-------------------- --------------------编程问答--------------------
我这个算还好么。。。 其实实现Areo很简单的 一种是使用黑色做底色 全部弄成透明 一种是局部玻璃化效果
但是局部玻璃化效果更好一些 可以不需要黑色做底色 但是需要预先窗口透明 --------------------编程问答-------------------- 你这也算新手....那我算什么...没有手?
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,