You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在WinForm中动态调整图表Y轴位置适配不同显示器分辨率?

WinForm 24小时开关活动图表自适应屏幕解决方案

问题核心

在Surface Pro设备上,设置Y轴1像素对应1分钟、中间面板高度1440像素(匹配24小时1440分钟)时图表显示正常。更换不同尺寸显示器后,中间面板高度变为862像素,导致Y轴位置计算错误,图表布局错乱。需求为不固定程序高度,仍按1分钟增量绘制图表,适配任意屏幕尺寸。

解决方案思路

核心是通过动态缩放比例替代固定像素与分钟的对应关系,根据面板实时高度计算每个时间点的绘制位置:

  • 计算缩放比例:以1440分钟(24小时)为基准,缩放比例 = 面板实际高度 / 1440
  • 绘制图表元素时,将原分钟对应的像素值乘以缩放比例,得到适配当前面板的位置和尺寸
  • Y轴刻度同步按缩放比例绘制,保证刻度与图表内容对齐
  • 监听面板Resize事件,尺寸变化时自动重绘图表

代码实现示例

1. 动态计算缩放比例与绘制矩形

private void middlePanel_Paint(object sender, PaintEventArgs e)
{
    Graphics g = e.Graphics;
    int panelHeight = middlePanel.Height;
    // 计算缩放比例:当前面板高度 / 总分钟数(1440)
    float scaleFactor = (float)panelHeight / 1440f;

    // 示例:绘制单个开关活动矩形(minuteValue为活动起始分钟,duration为持续分钟)
    int minuteValue = 120; // 活动起始于第120分钟(2点)
    int duration = 30; // 持续30分钟
    int x = 50; // X轴位置(可根据实际逻辑调整)

    // 计算适配后的Y位置和高度
    int yPos = (int)(minuteValue * scaleFactor);
    int adaptedHeight = (int)(duration * scaleFactor);

    // 绘制矩形
    g.DrawRectangle(Pens.Black, x, yPos, 100, adaptedHeight);
}

2. 绘制自适应Y轴刻度

private void DrawYAxis(Graphics g, int panelHeight, float scaleFactor)
{
    // 绘制每小时刻度线和文本
    for (int hour = 0; hour <= 24; hour++)
    {
        int minute = hour * 60;
        int yPos = (int)(minute * scaleFactor);

        // 绘制水平刻度线
        g.DrawLine(Pens.LightGray, 0, yPos, middlePanel.Width, yPos);
        // 绘制小时文本
        g.DrawString($"{hour:D2}:00", this.Font, Brushes.Black, 5, yPos - 10);
    }
}

3. 监听Resize事件触发重绘

private void middlePanel_Resize(object sender, EventArgs e)
{
    // 面板尺寸变化时触发重绘
    middlePanel.Invalidate();
}

注意事项

  • 所有绘制逻辑需放在面板的Paint事件中执行,避免在非绘制事件中直接绘图
  • 开启面板双缓冲可提升重绘流畅度,避免闪烁:middlePanel.DoubleBuffered = true;

内容的提问来源于stack exchange,提问作者Dev_DylanJ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 03:13:12