C#计算器如何在label控件中显示根号包裹数字的标准数学平方根样式
C# 计算器根号显示实现方案
这个需求完全可以实现,常用有两种实现路径,适配不同的精度要求:
方案1:快速实现(原生控件拼接,无需自定义开发)
直接用两个Label拼接即可,用第二个Label的上边框模拟根号的顶部横线,无需修改现有计算逻辑,仅需额外保存原始待开方数:
if (CW3.Checked) // 勾选平方根计算 { if (Z3N.Checked) // 勾选负数输入 { MessageBox.Show("负数无法计算平方根。"); return; } // 保存原始待开方数,不要直接覆盖原变量 double originalNum = Zahl3; // 原有计算逻辑不变 Zahl3 = Math.Sqrt(Zahl3); // 配置根号显示Label labelRadical.Font = new Font("微软雅黑", 24, FontStyle.Regular); labelRadical.Text = "√"; labelRadical.Location = new Point(10, 10); labelRadical.AutoSize = true; // 配置待开方数显示Label labelRadicand.Font = new Font("微软雅黑", 12, FontStyle.Regular); labelRadicand.Text = originalNum.ToString(); labelRadicand.AutoSize = true; // 调整位置让数字在根号下方 labelRadicand.Location = new Point(labelRadical.Right - 3, labelRadical.Top + 12); // 绘制上边框模拟根号横线 labelRadicand.Paint += (s, e) => { e.Graphics.DrawLine(Pens.Black, 0, 0, labelRadicand.Width, 0); }; // 结果可以额外加Label显示: 等号 + Zahl3的结果 labelResult.Text = $" = {Zahl3:0.##}"; labelResult.Location = new Point(labelRadicand.Right + 5, labelRadicand.Top); }
方案2:高还原度实现(自定义绘制控件,完全匹配数学书写规范)
如果需要适配任意长度的待开方数、显示效果和数学公式完全一致,可以重写Label的绘制逻辑,自定义绘制根号、待开方数和结果:
// 自定义平方根显示控件,编译后可直接拖到WinForm界面使用 public class SquareRootLabel : Label { /// <summary> /// 待开方数字 /// </summary> public double Radicand { get; set; } /// <summary> /// 平方根计算结果 /// </summary> public double RootResult { get; set; } protected override void OnPaint(PaintEventArgs e) { base.OnPaint(e); Graphics g = e.Graphics; g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; Brush textBrush = new SolidBrush(this.ForeColor); // 绘制根号符号 Font radicalFont = new Font(this.Font.FontFamily, this.Font.Size * 1.8f, FontStyle.Regular); SizeF radicalSize = g.MeasureString("√", radicalFont); g.DrawString("√", radicalFont, textBrush, 0, 0); // 绘制根号下的待开方数 string radicandStr = Radicand.ToString(); SizeF radicandSize = g.MeasureString(radicandStr, this.Font); float radicandX = radicalSize.Width - 3; float radicandY = (radicalSize.Height - radicandSize.Height) / 2 + 2; g.DrawString(radicandStr, this.Font, textBrush, radicandX, radicandY); // 绘制根号顶部横线 g.DrawLine(new Pen(textBrush, 1.5f), radicandX, radicandY - 1, radicandX + radicandSize.Width, radicandY - 1); // 绘制等号和计算结果 string resultStr = $" = {RootResult:0.####}"; g.DrawString(resultStr, this.Font, textBrush, radicandX + radicandSize.Width + 5, radicandY); } } // 调用方式 if (CW3.Checked) { if (Z3N.Checked) { MessageBox.Show("负数无法计算平方根。"); return; } squareRootLabel1.Radicand = Zahl3; Zahl3 = Math.Sqrt(Zahl3); squareRootLabel1.RootResult = Zahl3; squareRootLabel1.Refresh(); }
内容的提问来源于stack exchange,提问作者DieserTBZ
相关产品推荐
相关产品推荐

