c# winform开发, 如何在 汉字的正上方 显示拼音?

cpintel 2019-08-07 10:57:46
请教,给定一段文本,也有了 这段文本所对应的拼音。如何用c# 实现, 在 每个汉字上方显示拼音呢?
...全文
2646 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
自己写个插件不就简单了。专门显示拼音
cpintel 2019-08-14
  • 打赏
  • 举报
回复
虽没有解决,但感谢各位的建议。结贴。散分。
Chip_Liu1227812601 2019-08-10
  • 打赏
  • 举报
回复
写一个for或foreach,碰到标点符号给它隔开,给变量多少行给它/r.(计算出汉字和拼音所占的字符长度)在你存的集合里面操作完,搬到winform自带的控件或是你重写的控件上。
上帝的亲哥哥 2019-08-08
  • 打赏
  • 举报
回复
感觉WPF才是你的归宿,不论是排版还是控制,都更方便,直接,不容易出错,建议LZ用WPF,WinForm,明显心有余,力不足啊~
SoulRed 2019-08-07
  • 打赏
  • 举报
回复
每个字设置为一个组件,包含拼音和中文,以两者最长的长度作为lable长度,问题不大
  • 打赏
  • 举报
回复
拼音lrc啊,这个有很多公司有成功控件的
cpintel 2019-08-07
  • 打赏
  • 举报
回复
后续还可能 需要播放这段文本的mp3录音,同时,根据播放进度,对文本高亮或者上色。 如有可行 代码,可另外加分。本人电邮zhangch@cpintel.com
cpintel 2019-08-07
  • 打赏
  • 举报
回复
感谢回复。我没说清楚。先不考虑分词问题。假定与汉字对应的拼音已经存在。 现在头疼的是 拼音和汉字的排版问题,感到无从下手。如有类似代码推荐,更感激不尽。
XBodhi. 2019-08-07
  • 打赏
  • 举报
回复
你可以自己绘制一个 控件,然后自己重绘
github_36000833 2019-08-07
  • 打赏
  • 举报
回复
如果只是显示,Winform倒是可以做。但需要你测量各组拼音的长度,并根据长度进行显示排版。

WPF的排版功能更强大,会比较容易实现。具体你可以先看看
比如微软的《流文档概述》
https://docs.microsoft.com/zh-cn/dotnet/framework/wpf/advanced/flow-document-overview
  • 打赏
  • 举报
回复
当然。里面的文本对齐、行间距等问题我没有说,因为我觉得你应该是能想到这些东西怎么做的,但是有个细节提醒你一下,就是换行不能标点符号打头,因此发现标点符号打头的时候需要将上行最后一个词取下来挥着把标点符号附在上行末尾。
  • 打赏
  • 举报
回复
这个分两个部分说: 1、显示部分,这个使用拼音字体然后输出正确的拼音就可以了,这个部分资料很多,百度一下有很多,至于显示方式是lable还是gdi+这是你自己的选择。 2、分词部分,这部分才是重点,比如“银行门口交易二十四口交换机”分词错误会出事的,这里可以选择国内几大分词系统,这也是你的自由。 举个例子我随便复制百度到的汉字拼音过来给你你也是能看到的: qǐng shū rù nín yào zhuǎn huàn de hàn zì nèi róng 。 但是他有这样的问题:
wanghui0380 2019-08-07
  • 打赏
  • 举报
回复
hanlp 的拼音 https://github.com/hankcs/HanLP#17-%E6%8B%BC%E9%9F%B3%E8%BD%AC%E6%8D%A2 哎,python牛叉哄哄,可惜都是玩具,实验品。真正变成产品的还是java,hanlp直接产品了,开箱即用
wanghui0380 2019-08-07
  • 打赏
  • 举报
回复
我们只给路径,你自己看 分词+seq2seq 这块有训练好的,比如java的hanlp
wanghui0380 2019-08-07
  • 打赏
  • 举报
回复
汉字不多,自己注音都行。 但是,讨厌的但是来了。 多音字问题。所以还是要分词,只有分了词你才能解决多音字问题。 至于排版有啥不好排版的,你gdi+画上去,还是放成两行label。还不是随意
github_36000833 2019-08-07
  • 打赏
  • 举报
回复
改错

                var 颜色 = (单元序号++ == 高亮点 % 文本.Count) ? Brushes.Red : Brushes.Black;
Winform做“居中对齐”很容易,但不容易做“两端对齐”。换WPF会好做一些。 在Winform下,两端对齐还要自己做,同样是测量每个字母,然后计算排版。
github_36000833 2019-08-07
  • 打赏
  • 举报
回复
新建一个WinForm项目,不用添加任何控件,把Form1.cs的Form1类换成如下代码:

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            this.Width = 300;
            this.DoubleBuffered = true;
            this.Font = new Font("宋体", 14);
            this.SizeChanged += delegate { Invalidate(); };
            this.定时器.Tick += delegate { this.高亮点++; Invalidate(); };
        }

        protected override void OnPaint(PaintEventArgs e)
        {
            const float 行距 = 4;
            const float 间距 = 4;

            var 行高 = e.Graphics.MeasureString("字", this.Font).Height;
            float 当前x = 0, 当前y = 0;

            var 单元序号 = 0;
            foreach(var 单元 in 文本)
            {
                var 拼音宽 = e.Graphics.MeasureString(单元.拼音 ?? "", this.Font).Width;
                var 词组宽 = e.Graphics.MeasureString(单元.词组 ?? "", this.Font).Width;
                var 单位宽 = Math.Max(拼音宽, 词组宽);

                if (当前x + 单位宽 > this.ClientSize.Width)
                {
                    当前x = 0;
                    当前y += 行高 + 行高 + 行距;
                }
                var 拼音框 = new RectangleF(当前x, 当前y, 单位宽, 行高);
                var 词组框 = new RectangleF(当前x, 当前y + 行高, 单位宽, 行高);
                var 颜色 = (单元序号++ % 文本.Count == 高亮点) ? Brushes.Red : Brushes.Black;
                e.Graphics.DrawString(单元.拼音 ?? "", this.Font, 颜色, 拼音框, 居中格式);
                e.Graphics.DrawString(单元.词组 ?? "", this.Font, 颜色, 词组框, 居中格式);

                当前x += 单位宽 + 间距;
            }
        }

        int 高亮点 = 0;
        Timer 定时器 = new Timer() { Interval = 500, Enabled = true};
        static StringFormat 居中格式 = new StringFormat() {Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Center};
        List<注音词组> 文本 = new List<注音词组>()
        {
            new 注音词组("Qīngzǎo", "清早"),
            new 注音词组("", ","),
            new 注音词组("wǒ", "我"),
            new 注音词组("zǒu", "走"),
            new 注音词组("zài", "在"),
            new 注音词组("héngkuà", "横跨"),
            new 注音词组("hé'àn", "河岸"),
            new 注音词组("hé", "和"),
            new 注音词组("xiǎodǎo", "小岛"),
            new 注音词组("chǎngchǎng", "长长"),
            new 注音词组("de", "的"),
            new 注音词组("dúmùqiáo", "独木桥"),
            new 注音词组("shàng", "上"),
            new 注音词组("", ","),
            new 注音词组("shǒulǐ", "手里"),
            new 注音词组("zhuāizhe", "拽着"),
            new 注音词组("niúshéng", "牛绳"),
            new 注音词组("", "。"),
        };
    }

    struct 注音词组
    {
        public 注音词组(string p, string c)
        {
            拼音 = p;
            词组 = c;
        }

        public string 拼音;
        public string 词组;
    }

110,502

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧