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

cpintel 2019-08-07 10:57:46
请教,给定一段文本,也有了 这段文本所对应的拼音。如何用c# 实现, 在 每个汉字上方显示拼音呢?
...全文
2760 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
全栈 2019-08-14
  • 打赏
  • 举报
回复
自己写个插件不就简单了。专门显示拼音
cpintel 2019-08-14
  • 打赏
  • 举报
回复
虽没有解决,但感谢各位的建议。结贴。散分。
Chip_Liu 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 词组;
    }
内容概要:本文聚焦于高维多阶段随机规划问题,深入研究了正则化分解方法与马尔可夫过程在刻画不确定性动态演化中的应用,并提供了完整的Python代码实现。通过引入正则化技术有效降低了高维随机优化问题的计算复杂度,结合马尔可夫链建模多阶段决策过程中的不确定性传播机制,提升了模型在复杂动态环境下的求解效率与鲁棒性。研究涵盖了问题建模、算法设计、数值求解及结果分析全过程,具有较强的理论深度与工程实践价值; 适合人群:具备一定运筹学、优化理论基础及Python编程能力,从事智能决策、人工智能、能源系统优化、金融工程等相关领域的科研人员、高校研究生以及工业界研发工程师; 使用场景及目标:①应用于电力系统调度、供应链管理、金融资产配置等存在多阶段不确定性的复杂决策场景;②掌握高维随机规划的建模思路与高效求解技术,深入理解正则化方法与马尔可夫过程在实际优化算法中的融合机制与实现路径; 阅读建议:建议结合提供的Python代码进行动手实践,重点关注算法实现细节、参数敏感性分析与收敛性验证,鼓励在不同应用场景中迁移和改进该方法,进一步探索其在分布鲁棒优化、动态规划等前沿方向的扩展潜力。
内容概要:本文系统研究了离散时间线性系统中基于共识的分布式滤波器的稳定性与最优性问题,深入探讨了KF(卡尔曼滤波)、DKF(分布式卡尔曼滤波)、SMDKF(基于平方根的最大熵分布式卡尔曼滤波)、CI(协方差交叉)、ICF(信息共识滤波)和HCMCI(基于高阶交叉协方差的信息融合)等多种滤波算法的理论基础、数学推导与实现机制。通过Matlab平台构建多传感器网络仿真环境,实现了各类算法在不同噪声统计特性和通信拓扑结构下的状态估计仿真,重点分析了各算法在估计精度、收敛速度、鲁棒性及一致性方面的性能差异,并对融合策略中的协方差传播、信息权重分配与共识迭代过程进行了细致对比,旨在为复杂环境下多智能体系统的分布式状态估计提供可复现的技术方案与理论支撑。; 适合人群:具备控制理论、信号处理、线性系统理论及Matlab编程基础的研究生、科研人员,以及从事多传感器融合、分布式估计算法开发、无人系统导航与智能电网监控等领域的工程技术人员。; 使用场景及目标:① 掌握主流分布式滤波算法的核心思想与数学建模方法;② 在多节点传感网络中实现高效可靠的状态估计;③ 对比分析不同共识融合策略在非理想通信条件下的性能表现;④ 支持学术论文复现、算法改进与工程化验证,服务于科研创新与系统优化设计。; 阅读建议:建议结合Matlab代码逐模块解析算法实现流程,重点关注状态预测、局部更新、信息融合与一致性达成的关键步骤;可通过调整系统噪声、观测噪声、网络连接拓扑等参数开展扩展性仿真实验,深入理解算法的稳定边界与最优性条件,进一步探索其在实际应用场景中的适应性与改进空间。

111,129

社区成员

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

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

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