实现温度显示菜单功能:全局温度、区域温度显示及互斥逻辑,最高/平均/最低温度显示

This commit is contained in:
zqm
2025-11-05 10:19:05 +08:00
parent bb622e6b3f
commit 93f8afcfa4
3 changed files with 212 additions and 5 deletions

View File

@@ -35,6 +35,12 @@ namespace JoyD.Windows.CS.Toprie
this.ironGrayToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.redHotToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.rainbow2ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.temperatureDisplayToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.globalTemperatureToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.areaTemperatureToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.maxTemperatureToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.avgTemperatureToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.minTemperatureToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();
this.saveTemperatureToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.pauseDetectionToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
@@ -58,6 +64,7 @@ namespace JoyD.Windows.CS.Toprie
this.contextMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.imageModeToolStripMenuItem,
this.colorModeToolStripMenuItem,
this.temperatureDisplayToolStripMenuItem,
this.toolStripSeparator1,
this.saveTemperatureToolStripMenuItem,
this.pauseDetectionToolStripMenuItem});
@@ -87,6 +94,58 @@ namespace JoyD.Windows.CS.Toprie
this.visibleModeToolStripMenuItem.Text = "自然模式";
this.visibleModeToolStripMenuItem.Click += new System.EventHandler(this.VisibleModeToolStripMenuItem_Click);
//
// temperatureDisplayToolStripMenuItem
//
this.temperatureDisplayToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.globalTemperatureToolStripMenuItem,
this.areaTemperatureToolStripMenuItem,
this.maxTemperatureToolStripMenuItem,
this.avgTemperatureToolStripMenuItem,
this.minTemperatureToolStripMenuItem});
this.temperatureDisplayToolStripMenuItem.Name = "temperatureDisplayToolStripMenuItem";
this.temperatureDisplayToolStripMenuItem.Size = new System.Drawing.Size(160, 22);
this.temperatureDisplayToolStripMenuItem.Text = "温度显示";
//
// globalTemperatureToolStripMenuItem
//
this.globalTemperatureToolStripMenuItem.CheckOnClick = true;
this.globalTemperatureToolStripMenuItem.Name = "globalTemperatureToolStripMenuItem";
this.globalTemperatureToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
this.globalTemperatureToolStripMenuItem.Text = "全局温度";
this.globalTemperatureToolStripMenuItem.Click += new System.EventHandler(this.GlobalTemperatureToolStripMenuItem_Click);
//
// areaTemperatureToolStripMenuItem
//
this.areaTemperatureToolStripMenuItem.CheckOnClick = true;
this.areaTemperatureToolStripMenuItem.Name = "areaTemperatureToolStripMenuItem";
this.areaTemperatureToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
this.areaTemperatureToolStripMenuItem.Text = "区域温度";
this.areaTemperatureToolStripMenuItem.Click += new System.EventHandler(this.AreaTemperatureToolStripMenuItem_Click);
//
// maxTemperatureToolStripMenuItem
//
this.maxTemperatureToolStripMenuItem.CheckOnClick = true;
this.maxTemperatureToolStripMenuItem.Name = "maxTemperatureToolStripMenuItem";
this.maxTemperatureToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
this.maxTemperatureToolStripMenuItem.Text = "最高温度";
this.maxTemperatureToolStripMenuItem.Click += new System.EventHandler(this.MaxTemperatureToolStripMenuItem_Click);
//
// avgTemperatureToolStripMenuItem
//
this.avgTemperatureToolStripMenuItem.CheckOnClick = true;
this.avgTemperatureToolStripMenuItem.Name = "avgTemperatureToolStripMenuItem";
this.avgTemperatureToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
this.avgTemperatureToolStripMenuItem.Text = "平均温度";
this.avgTemperatureToolStripMenuItem.Click += new System.EventHandler(this.AvgTemperatureToolStripMenuItem_Click);
//
// minTemperatureToolStripMenuItem
//
this.minTemperatureToolStripMenuItem.CheckOnClick = true;
this.minTemperatureToolStripMenuItem.Name = "minTemperatureToolStripMenuItem";
this.minTemperatureToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
this.minTemperatureToolStripMenuItem.Text = "最低温度";
this.minTemperatureToolStripMenuItem.Click += new System.EventHandler(this.MinTemperatureToolStripMenuItem_Click);
//
// colorModeToolStripMenuItem
//
this.colorModeToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
@@ -218,5 +277,11 @@ namespace JoyD.Windows.CS.Toprie
private System.Windows.Forms.ToolStripMenuItem fusionMode4ToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem fusionMode5ToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem saveTemperatureToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem temperatureDisplayToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem globalTemperatureToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem areaTemperatureToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem maxTemperatureToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem avgTemperatureToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem minTemperatureToolStripMenuItem;
}
}

View File

@@ -32,7 +32,13 @@ namespace JoyD.Windows.CS.Toprie
private Image _infoImage = null;
// 最近一次获取到的温度数据
// 温度显示状态标志
private bool _showGlobalTemperature = false; // 是否显示全局温度
private bool _showAreaTemperature = false; // 是否显示区域温度
private bool _showMaxTemperature = true; // 是否显示最高温度默认为true
private bool _showAverageTemperature = false; // 是否显示平均温度
private bool _showMinTemperature = false; // 是否显示最低温度
// 用于保护_lastImage的线程锁
private readonly object _lastImageLock = new object();
@@ -168,13 +174,60 @@ namespace JoyD.Windows.CS.Toprie
}
}
else if (isReady)
{
// 就绪条件下,根据用户要求不再显示温度数据
{
// 就绪条件下,根据用户选择显示温度数据
if ((_showGlobalTemperature || _showAreaTemperature) && _deviceManager != null && _deviceManager.ConnectionStatus == ConnectionStatus.Connected)
{
TemperatureData temperatureData = _deviceManager.LastTemperature;
if (temperatureData != null && temperatureData.Timestamp != null)
{
// 检查温度数据时间是否在最近3秒内
TimeSpan timeDiff = DateTime.Now - temperatureData.Timestamp;
if (timeDiff.TotalSeconds <= 3)
{
using (Font font = new Font("Arial", 20, FontStyle.Bold))
using (SolidBrush textBrush = new SolidBrush(Color.White))
{
StringFormat format = new StringFormat() { Alignment = StringAlignment.Center };
// 绘制温度信息
StringBuilder tempInfoBuilder = new StringBuilder();
// 添加温度标题
tempInfoBuilder.AppendLine(_showGlobalTemperature ? "全局温度" : "区域温度");
tempInfoBuilder.AppendLine();
// 根据勾选状态添加最高温度
if (_showMaxTemperature)
{
tempInfoBuilder.AppendLine($"最高温度: {temperatureData.MaxTemperature:F2} °C");
}
// 根据勾选状态添加平均温度
if (_showAverageTemperature)
{
tempInfoBuilder.AppendLine($"平均温度: {temperatureData.AverageTemperature:F2} °C");
}
// 根据勾选状态添加最低温度
if (_showMinTemperature)
{
tempInfoBuilder.AppendLine($"最低温度: {temperatureData.MinTemperature:F2} °C");
}
// 将温度信息居中显示
g.DrawString(tempInfoBuilder.ToString(), font, textBrush,
new RectangleF(0, BUFFER_HEIGHT / 4, BUFFER_WIDTH, BUFFER_HEIGHT / 2),
format);
}
}
}
}
}
}
// 设置显示标志
_isDisplayingInfo = (isPaused || isDisconnected || isReconnecting);
_isDisplayingInfo = (isPaused || isDisconnected || isReconnecting || _showGlobalTemperature || _showAreaTemperature);
}
// 步骤4最后调用更新UI注意在DeviceManager_ImageReceived中已处理非暂停状态下的UI更新
@@ -1239,6 +1292,12 @@ namespace JoyD.Windows.CS.Toprie
/// </summary>
private void ContextMenuStrip1_Opening(object sender, System.ComponentModel.CancelEventArgs e)
{
// 确保全局温度和区域温度的互斥性
// 如果两个都被选中,默认保持全局温度选中状态,取消区域温度选中状态
if (globalTemperatureToolStripMenuItem.Checked && areaTemperatureToolStripMenuItem.Checked)
{
areaTemperatureToolStripMenuItem.Checked = false;
}
// 暂停菜单项的文本已经在点击事件中更新,这里无需再次更新
if (DesignMode) return;
try
@@ -1772,6 +1831,82 @@ namespace JoyD.Windows.CS.Toprie
/// </summary>
/// <param name="sender">事件发送者</param>
/// <param name="e">事件参数</param>
/// <summary>
/// 全局温度菜单项点击事件处理
/// 当全局温度被勾选时,自动取消区域温度的勾选
/// </summary>
private void GlobalTemperatureToolStripMenuItem_Click(object sender, EventArgs e)
{
// 更新全局温度显示状态标志
_showGlobalTemperature = globalTemperatureToolStripMenuItem.Checked;
// 当全局温度被勾选时,自动取消区域温度的勾选
if (_showGlobalTemperature)
{
_showAreaTemperature = false;
areaTemperatureToolStripMenuItem.Checked = false;
}
// 刷新UI以显示或隐藏温度信息
UpdateInfo();
}
/// <summary>
/// 区域温度菜单项点击事件处理
/// 当区域温度被勾选时,自动取消全局温度的勾选
/// </summary>
private void AreaTemperatureToolStripMenuItem_Click(object sender, EventArgs e)
{
// 更新区域温度显示状态标志
_showAreaTemperature = areaTemperatureToolStripMenuItem.Checked;
// 当区域温度被勾选时,自动取消全局温度的勾选
if (_showAreaTemperature)
{
_showGlobalTemperature = false;
globalTemperatureToolStripMenuItem.Checked = false;
}
// 刷新UI以显示或隐藏温度信息
UpdateInfo();
}
/// <summary>
/// 最高温度菜单项点击事件处理
/// </summary>
private void MaxTemperatureToolStripMenuItem_Click(object sender, EventArgs e)
{
// 更新最高温度显示状态标志
_showMaxTemperature = maxTemperatureToolStripMenuItem.Checked;
// 刷新UI以更新温度信息显示
UpdateInfo();
}
/// <summary>
/// 平均温度菜单项点击事件处理
/// </summary>
private void AverageTemperatureToolStripMenuItem_Click(object sender, EventArgs e)
{
// 更新平均温度显示状态标志
_showAverageTemperature = averageTemperatureToolStripMenuItem.Checked;
// 刷新UI以更新温度信息显示
UpdateInfo();
}
/// <summary>
/// 最低温度菜单项点击事件处理
/// </summary>
private void MinTemperatureToolStripMenuItem_Click(object sender, EventArgs e)
{
// 更新最低温度显示状态标志
_showMinTemperature = minTemperatureToolStripMenuItem.Checked;
// 刷新UI以更新温度信息显示
UpdateInfo();
}
private void SaveTemperatureToolStripMenuItem_Click(object sender, EventArgs e)
{
try

View File

@@ -119,4 +119,11 @@
1. 时间戳转换时需注意低字节在前、高字节在后的顺序
2. 温补值是设备补偿值,必须应用到原始温度上才能得到与网页计算结果一致的温度
3. 分辨率不同时,温度数据长度会相应变化,解析时需根据实际分辨率计算
4. 原始温度数据更新频率约为每秒一条
4. 原始温度数据更新频率约为每秒一条
### 温度显示菜单
1. 增加温度显示菜单
2. 温度显示菜单下显示全局温度(可勾选)
3. 温度显示菜单下显示区域温度(可勾选)
4. 区域温度和全局温度只能二选一显示
5. 温度显示菜单下显示最高温度、平均温度和最低温度(可勾选)