惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

B
Blog
D
Docker
J
Java Code Geeks
腾讯CDC
Blog — PlanetScale
Blog — PlanetScale
G
Google Developers Blog
M
MIT News - Artificial intelligence
L
LangChain Blog
T
The Blog of Author Tim Ferriss
P
Proofpoint News Feed
MyScale Blog
MyScale Blog
博客园 - Franky
GbyAI
GbyAI
Hugging Face - Blog
Hugging Face - Blog
aimingoo的专栏
aimingoo的专栏
Last Week in AI
Last Week in AI
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - 聂微东
N
Netflix TechBlog - Medium
B
Blog RSS Feed
Y
Y Combinator Blog
阮一峰的网络日志
阮一峰的网络日志
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Google DeepMind News
Google DeepMind News

囧克斯

奔四了,写给40岁的自己 有序退网 我和 Vue.js 的十年 我参与《代码之外 Beyond Code》的故事 博客站迁移至 VitePress 的备忘 写给我的奶奶 中文格式化小工具 zhlint 及其开发心得 vue-mark-display:用 markdown 语法轻松撰写幻灯片 我对技术会议的一些看法 VueConf Hangzhou 见闻 第四届 CSSConf CN 见闻 [译]Web 表单的未来 [译]苹果正在做一些他们的程序员明摆着不想要的东西 [译]为什么我不会无偿加班且你也不应该 [译]如果管理是唯一可走的路,那就完蛋了 [译]如何撰写 Git 提交信息 [译]C 程序的原则 Vue 2.0 来了! Weex 近 4 个月的开源之路 Weex 在 JS Runtime 内的多实例管理 我理解的 SPA 我理解的 Flux 架构 【整理】Vue 2.0 自 beta 1 到 beta 4 以来的主要更新 通过一张图走进 Vue 2.0 Code Review for Vue 2.0 Preview Vue 2.0 发布啦! 务实的小而美 Vue.js 1.0.0 发布了! [译]如何成为一名卓越的前端工程师 手机淘宝前端的图片相关工作流程梳理
浅浅浅谈将 Aero 特效应用到整个窗体
勾三股四 · 2009-09-26 · via 囧克斯

本文摘自 勾三股四 更早时期的 不老歌 博客。


传说中的 Aero 这个词,是指 Windows 窗体的一种半透明的显示效果。
在 Vista+ 的操作系统里,窗体是自动有 Aero 边框的,但有些程序不仅仅是边框才有 Aero 特效。比如 IE / Media Player 等等。(这两个例子都快被人举烂了……)

前阵子看到了 Firefox 4.0 的未来设计图,整个窗体都是 Aero 特效的,看过一直流口水。经过一些无聊的探索,我发现了将 Aero 特效从边框扩展到其它区域的实现方法。

以下是 C# 代码

在 C# 代码出现之前
好吧
表问我为什么 Ajax 程序员会写 C#
表问我为什么会写 C# 却去做低贱的 Ajax
表问我为什么决定了要做 Ajax,还回头去看 C# ……

internal class DwmApi
{
    [DllImport("dwmapi.dll", PreserveSig = false)]
    public static extern void DwmExtendFrameIntoClientArea(IntPtr hWnd, MARGINS pMargins);

    [DllImport("dwmapi.dll", PreserveSig = false)]
    public static extern bool DwmIsCompositionEnabled();

    [StructLayout(LayoutKind.Sequential)]
    public class MARGINS
    {
        public int cxLeftWidth, cxRightWidth, cyTopHeight, cyBottomHeight;

        public MARGINS(int left, int top, int right, int bottom)
        {
            cxLeftWidth = left; cyTopHeight = top;
            cxRightWidth = right; cyBottomHeight = bottom;
        }
    }
}

这段代码引入了:

  1. 扩展窗体“实体”区域的方法
  2. 判断当前操作系统是否开启了 Aero 显示方式的方法
  3. 描述“实体”区域的数据格式

    有了这些东西,代码就基本会写了吧^_^

private void Form1_Load(object sender, EventArgs e)
{
    if (DwmApi.DwmIsCompositionEnabled()) {
        DwmApi.DwmExtendFrameIntoClientArea(this.Handle, new DwmApi.MARGINS(-1, -1, -1, -1));
    }
}

private void OnPaint(object sender, PaintEventArgs e)
{
    if (DwmApi.DwmIsCompositionEnabled())
    {
        e.Graphics.FillRectangle(Brushes.Black, this.ClientRectangle);
    }
}

protected override void WndProc(ref Message m)
{
    base.WndProc(ref m);

    const int WM_DWMCOMPOSITIONCHANGED = 0x031E;

    switch (m.Msg)
    { 
        case WM_DWMCOMPOSITIONCHANGED:
            if (DwmApi.DwmIsCompositionEnabled())
            {
                DwmApi.DwmExtendFrameIntoClientArea(this.Handle, new DwmApi.MARGINS(-1, -1, -1, -1));
            }
            break;
    }
}

这三个函数分别做的是:

  1. 窗体载入成功后将“实体”窗体区域扩展到“窗体外面”,这样窗体就仿佛全 Aero 了,实际是“实体”区域不可见罢了——当然这不影响我们往非“实体”区域放置控件或别的任何对象
  2. 绘制窗体时,将“实体”区域涂黑(这样做的缘由还没完全研究明白,总之这个函数不可或缺,等我弄明白了会把理由补上)
  3. 窗体监听到操作系统显示方式改变是,判断是否还支持 Aero 特效,如果是,则“实体”区域需要重新扩展

    一点浅浅的认识
    最后补一个链接:http://tech.ddvip.com/2008-11/122569523088390.html