怎么使用C#3.0创建窗口并显示彩色Emoji文字?

2026-08-04T10:11:35.2133333+00:00

屏幕截图 2026-08-04 180638

图一是源代码。

屏幕截图 2026-08-04 180826

这是显示出来的效果,Emoji不是彩色的。

有更好的解决办法吗?

开发人员技术 | C#
开发人员技术 | C#

一种面向对象的类型安全的编程语言,它起源于 C 语言系列,包括对面向组件的编程的支持。


问题作者接受的答案
Tony Thach (WICLOUD CORPORATION) 1,120 信誉分 Microsoft 外部员工 审查方
2026-08-05T06:23:56.2533333+00:00

您好 @电脑先生工作室

感谢您的提问。

这里的问题并不完全是 C# 3.0 或字体文件导致的,而主要与 WinForms 的文字渲染机制有关。

即使加载了 Segoe UI Emoji 或其他包含彩色 Emoji 的字体,WinForms 的 Label 控件通常仍通过 GDI/GDI+ 渲染文字。这套传统渲染方式不能完整处理彩色 Emoji 字体中的彩色字形数据,因此 Emoji 最终可能被显示为黑白轮廓。

PrivateFontCollection 只能让应用程序使用指定字体,并不能让 Label 自动获得彩色 Emoji 渲染能力。也就是说,简单更换字体通常无法解决此问题。

对于旧版 WinForms,一个比较稳定的替代方案是:

  1. 普通文字继续使用 Label 显示。
  2. 将 Emoji 转换成 PNG 图片。
  3. 使用 PictureBox 显示 Emoji 图片。
  4. 使用 FlowLayoutPanel 将文字和图片横向排列。

用户的图像

例如,可以从 Twemoji 等 Emoji 图片资源中加载对应的 PNG:


//这是源代码: 

using System; 

using System.Windows.Forms; 

using System.Drawing; 

using System.Drawing.Text; //必须引入 

using System.Net; 

using System.IO; 



namespace MyWindows 

{ 

    public class Windows 

    { 

        static void Main() 

        { 

            Application.EnableVisualStyles(); 



            // 私有字体集合,加载本地OTF,不会安装进系统字体库 

            PrivateFontCollection pfc = new PrivateFontCollection(); 

            //string fontPath = @"G:\罗斯頔2025标准字体\不开玩笑 标准字体\无中文\Emoji+Icons\ChuangYan Icon & Emoji 2026.otf"; 

            string fontPath = @"C:\Windows\Fonts\seguiemj.ttf"; 



            try 

            { 

                pfc.AddFontFile(fontPath); 

            } 

            catch (Exception ex) 

            { 

                MessageBox.Show("加载字体失败:" + ex.Message); 

            } 



            Form form = new Form(); 

            form.Text = "MyWindows"; 

            form.Size = new Size(300, 300); 

/* 

            Label label = new Label(); 

            label.Text = "文字😀🚗"; 

            // 使用私有字体集合里的第一个字体家族 

            if (pfc.Families.Length > 0) 

            { 

                label.Font = new Font(pfc.Families[0], 30); 

            } 

            label.Dock = DockStyle.Fill; 

            label.TextAlign = ContentAlignment.MiddleCenter; 



            form.Controls.Add(label); 

*/ 



           // 横向排列文字和图片 

            FlowLayoutPanel panel = new FlowLayoutPanel(); 

            panel.Dock = DockStyle.Fill; 

            panel.FlowDirection = FlowDirection.LeftToRight; 

            panel.WrapContents = false; 

            panel.Padding = new Padding(45, 95, 0, 0); 



            // 只显示普通文字,不再放 Emoji 字符 

            Label label = new Label(); 

            label.Text = "文字"; 

            label.AutoSize = true; 

            label.Font = new Font("Microsoft YaHei", 30); 

            label.Margin = new Padding(0, 0, 2, 0); 


            string msfluentui = "https://raw.github"+"usercontent.com/microsoft/fluentui-emoji/main/assets";

            // 😀 

            PictureBox emoji1 = new PictureBox(); 

            emoji1.Image = LoadImageFromUrl(msfluentui+"/Grinning%20face/3D/grinning_face_3d.png"); 

            emoji1.Size = new Size(48, 48); 

            emoji1.SizeMode = PictureBoxSizeMode.Zoom; 

            emoji1.Margin = new Padding(2, 3, 2, 0); 



            // 🚗 

            PictureBox emoji2 = new PictureBox(); 

        emoji2.Image = LoadImageFromUrl(msfluentui+"/Automobile/3D/automobile_3d.png");

            emoji2.Size = new Size(48, 48); 

            emoji2.SizeMode = PictureBoxSizeMode.Zoom; 

            emoji2.Margin = new Padding(2, 3, 2, 0); 



            panel.Controls.Add(label); 

            panel.Controls.Add(emoji1); 

            panel.Controls.Add(emoji2); 



            form.Controls.Add(panel); 

            // 正确主消息循环,替代ShowDialog 

            Application.Run(form); 



            //释放字体资源 

            pfc.Dispose(); 

        } 

        private static Image LoadImageFromUrl(string url) 

        { 

            using (WebClient client = new WebClient()) 

            { 

                byte[] data = client.DownloadData(url); 



                using (MemoryStream stream = new MemoryStream(data)) 

                using (Image temporaryImage = Image.FromStream(stream)) 

                { 

                    return new Bitmap(temporaryImage); 

                } 

            } 

        } 

    } 

}

需要注意的不足

这种方式可以稳定显示彩色 Emoji,但也存在一些限制:

程序启动时需要访问网络

同步下载图片可能暂时阻塞界面

图片地址失效或网络不可用时,Emoji将无法显示。

每个Emoji 都需要根据 Unicode 码位找到对应的图片文件。

使用第三方 Emoji 图片资源时,需要检查相应项目的许可证和署名要求。

组合 Emoji、肤色、国旗或家庭 Emoji 可能由多个 Unicode 码位组成,不能简单地只使用一个文件名。

因此,在正式项目中,更建议将需要使用的 Emoji 图片提前下载,然后:

作为应用程序资源嵌入;

或保存在本地目录;

或首次下载后缓存到本地。

这样可以避免应用程序每次启动时都依赖网络。

总的来说,如果必须继续使用旧版 WinForms,那么将 Emoji 作为 PNG 图片显示,是比依赖 Label 和彩色 Emoji 字体更可靠的解决方案。如果需要原生的彩色字体渲染,则需要考虑 DirectWrite、WebView2、WPF 或其他支持现代彩色字体格式的渲染方案。

如果我的解释和所提供的信息对您有所帮助,烦请您按照此处的说明进行操作,以便其他遇到类似问题的用户也能从中受益。

此答案是否有帮助?

1 个人认为此答案很有帮助。

问题作者接受的答案
Tony Thach (WICLOUD CORPORATION) 1,120 信誉分 Microsoft 外部员工 审查方
2026-08-04T10:55:24.58+00:00

您好 @电脑先生工作室

我们正在积极调查此问题,并会尽快向您同步最新进展。感谢您的耐心等待与理解。

此答案是否有帮助?

1 个人认为此答案很有帮助。
0 个注释 无注释

0 个其他答案

排序依据: 非常有帮助

你的答案

提问者可以将答案标记为“已接受”,审查方可以将答案标记为“已推荐”,这有助于用户了解答案是否解决了提问者的问题。