修改显示逻辑

This commit is contained in:
zqm
2025-10-30 15:21:16 +08:00
parent 444c62efe4
commit 58ac23b57b
2 changed files with 42 additions and 48 deletions

View File

@@ -101,19 +101,19 @@ namespace JoyD.Windows.CS.Toprie
bool isReconnecting = _deviceManager != null && _deviceManager.ConnectionStatus == ConnectionStatus.Reconnecting;
bool isPaused = _isPaused; // 使用_isPaused标志判断暂停状态
bool isPingFailed = !IsDevicePingable;
// 根据用户要求的优先级显示信息先检查暂停状态然后再检查Ping状态和连接状态
if (isPaused)
{
// 暂停状态 - 最高优先级
using (Graphics g = Graphics.FromImage(_infoImage))
using (Graphics g = Graphics.FromImage(_infoImage))
{
// 设置半透明背景
using (SolidBrush brush = new SolidBrush(Color.FromArgb(128, Color.Transparent)))
{
// 设置半透明背景
using (SolidBrush brush = new SolidBrush(Color.FromArgb(128, Color.Black)))
{
g.FillRectangle(brush, 0, 0, BUFFER_WIDTH, BUFFER_HEIGHT);
}
g.FillRectangle(brush, 0, 0, BUFFER_WIDTH, BUFFER_HEIGHT);
}
if (isPaused)
{
// 暂停状态 - 最高优先级
// 绘制暂停文本
string text = "暂停";
Color textColor = Color.Red;
@@ -130,17 +130,9 @@ namespace JoyD.Windows.CS.Toprie
format);
}
}
}
else if (isPingFailed || isDisconnected || isReconnecting)
{
// 非暂停状态下检查Ping状态和连接状态
using (Graphics g = Graphics.FromImage(_infoImage))
{
// 设置半透明背景
using (SolidBrush brush = new SolidBrush(Color.FromArgb(128, Color.Black)))
{
g.FillRectangle(brush, 0, 0, BUFFER_WIDTH, BUFFER_HEIGHT);
}
else if (isPingFailed || isDisconnected || isReconnecting)
{
// 非暂停状态下检查Ping状态和连接状态
// 确定显示的文本和颜色
string text = "";
@@ -589,11 +581,8 @@ namespace JoyD.Windows.CS.Toprie
if (ms.CanRead && ms.Length > 0)
{
// 从流中创建图像
using (Image tempImage = System.Drawing.Image.FromStream(ms))
{
// 创建一个全新的位图而仅仅是克隆,确保数据完整性
Image newImage = new Bitmap(tempImage);
using (Image newImage = System.Drawing.Image.FromStream(ms))
{
// 立即验证新创建的图像是否有效
try
{
@@ -603,36 +592,23 @@ namespace JoyD.Windows.CS.Toprie
if (width <= 0 || height <= 0)
{
Console.WriteLine("创建的图像尺寸无效");
newImage.Dispose();
return;
}
if (_lastImage == null) _lastImage = new Bitmap(newImage);
else
{
using(Graphics g= Graphics.FromImage(_lastImage))
{
g.DrawImage(newImage,Point.Empty);
}
}
}
catch (Exception)
{
Console.WriteLine("创建的图像无效");
newImage.Dispose();
return;
}
// 按照用户要求收到图像数据后将图像保存到LastImage中
// 不释放旧的LastImage仅在控件Dispose时释放
lock (_lastImageLock)
{
// 如果是第一次设置LastImage直接赋值
if (_lastImage == null)
{
_lastImage = newImage;
}
else
{
// 后续更新时,使用临时变量保存新图像,然后替换引用
Image temp = newImage;
newImage = _lastImage;
_lastImage = temp;
// 注意这里不Dispose旧图像只在控件Dispose时统一释放
}
}
// 按照用户要求调用更新到UI
// 只有当图像更新未暂停时才更新UI
if (!_isPaused)

View File

@@ -0,0 +1,18 @@
# JoyD
### InfoImage, ImageBuffer, 图像框的bitmap, LastImage
1. 初始化时都创建成512x384的透明bitmap
2. 中途不进行Dispose和设置为null只在上面进行绘制
3. 仅当控件被Dispose时才进行Dispose和设置为null
### 修改流程:
1. 暂停或恢复时设置暂停状态调用更新Info
2. 断开或连接时设置连接状态调用更新Info
3. Ping通状态变化时修改Ping状态调用更新Info
4. 图像更新时, 保存LastImage, 调用更新到UI
### 更新Info:
1. 如果暂停显示暂停信息否则如果Ping不通或断开显示重连信息否则清空InfoImage
2. 最后调用更新UI
### 更新UI:
1. 先将LastImage绘制到全局缓冲
2. 再将InfoImage绘制到缓冲
3. 最后一次性绘制到图像框的bitmap