C# .net6 轉場(過場)UI
C# .net6 轉場(過場)UI
參考資料來源: https://stackoverflow.com/questions/50012020/c-sharp-form-show-does-not-paint-labels-in-the-form-to-show-showdialog-do-i
GITHUB: https://github.com/jash-git/Transitions
code
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Transitions
{
public partial class main : Form
{
public main()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
TransitionsFun.ShowUI("TransitionsFun.ShowUI");
Thread.Sleep(10000);
TransitionsFun.CloseUI();
}
}
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Transitions
{
public partial class TransitionsUI : Form
{
//---
//C# WinForm 控制項隨視窗大小變化而比例改變_start00
// ~ https://dotblogs.com.tw/davidtalk/2018/06/03/182559
// ~ https://www.itread01.com/content/1547625088.html
//---C# WinForm 控制項隨視窗大小變化而比例改變_end00
//---
//C# WinForm 控制項隨視窗大小變化而比例改變_start01
private float m_X;//當前窗體的寬度
private float m_Y;//當前窗體的高度
private bool m_isLoaded; // 是否已設定各控制的尺寸資料到Tag屬性
//---C# WinForm 控制項隨視窗大小變化而比例改變_end01
//---
//C# WinForm 控制項隨視窗大小變化而比例改變_start02
//將控制項的寬,高,左邊距,頂邊距和字體大小暫存到tag屬性中
private void SetTag(Control cons)
{
foreach (Control con in cons.Controls)
{
con.Tag = con.Width + ":" + con.Height + ":" + con.Left + ":" + con.Top + ":" + con.Font.Size;
if (con.Controls.Count > 0)
SetTag(con);
}
}
//---C# WinForm 控制項隨視窗大小變化而比例改變_end02
//---
//C# WinForm 控制項隨視窗大小變化而比例改變_start03
//根據窗體大小調整控制項大小
private void SetControls(float newx, float newy, Control cons)
{
if (m_isLoaded)
{
//遍歷窗體中的控制項,重新設置控制項的值
foreach (Control con in cons.Controls)
{
string[] mytag = con.Tag.ToString().Split(new char[] { ':' });//獲取控制項的Tag屬性值,並分割後存儲字元串數組
float a = System.Convert.ToSingle(mytag[0]) * newx;//根據窗體縮放比例確定控制項的值,寬度
con.Width = (int)a;//寬度
a = System.Convert.ToSingle(mytag[1]) * newy;//高度
con.Height = (int)(a);
a = System.Convert.ToSingle(mytag[2]) * newx;//左邊距離
con.Left = (int)(a);
a = System.Convert.ToSingle(mytag[3]) * newy;//上邊緣距離
con.Top = (int)(a);
Single currentSize = System.Convert.ToSingle(mytag[4]) * newy;//字體大小
con.Font = new Font(con.Font.Name, currentSize, con.Font.Style, con.Font.Unit);
if (con.Controls.Count > 0)
{
SetControls(newx, newy, con);
}
}
}
}
//---C# WinForm 控制項隨視窗大小變化而比例改變_end03
public TransitionsUI(String StrInfoe)
{
InitializeComponent();
//---
//C# WinForm 控制項隨視窗大小變化而比例改變_start05
m_isLoaded = false;//
//---C# WinForm 控制項隨視窗大小變化而比例改變_end05
//---
//C#控件改变大小时闪烁问题
SetStyle(ControlStyles.DoubleBuffer, true);
SetStyle(ControlStyles.AllPaintingInWmPaint, false);
SetStyle(ControlStyles.ResizeRedraw, true);
SetStyle(ControlStyles.UserPaint, true);
SetStyle(ControlStyles.SupportsTransparentBackColor, true);
this.UpdateStyles();
//---C#控件改变大小时闪烁问题
labInfor.Text = StrInfoe;
}
private void TransitionsUI_Load(object sender, EventArgs e)
{
//---
//C# WinForm 控制項隨視窗大小變化而比例改變_start04
if (Screen.AllScreens[0].WorkingArea.Width < 1920)
{
m_X = 360 * (Screen.AllScreens[0].WorkingArea.Width / 1920.0f);//獲取窗體的寬度
m_Y = 90 * (Screen.AllScreens[0].WorkingArea.Height / 1080.0f);//獲取窗體的高度
}
else
{
m_X = this.Width;
m_Y = this.Height;
}
m_isLoaded = true;// 已設定各控制項的尺寸到Tag屬性中
SetTag(this);//調用方法
//---C# WinForm 控制項隨視窗大小變化而比例改變_end04
//---
//showOnMonitor
// 取得延伸螢幕的工作區大小
Screen extendedScreen = Screen.AllScreens[0]; // 若延伸螢幕為主要螢幕
Rectangle workingArea = extendedScreen.WorkingArea;
// 計算視窗的位置
int x = workingArea.Left + (workingArea.Width - (int)m_X) / 2;
int y = workingArea.Top + (workingArea.Height - (int)m_Y) / 2;
// 設定視窗的位置
this.Location = new Point(x, y);
//---showOnMonitor
//---
//C# WinForm 控制項隨視窗大小變化而比例改變_start07
if (m_isLoaded)
{
float newx;
float newy;
if (Screen.AllScreens[0].WorkingArea.Width < 1920)
{
newx = m_X / 360;
newy = m_Y / 90;
}
else
{
newx = (this.Width) / m_X;
newy = (this.Height) / m_Y;
}
SetControls(newx, newy, this);
this.Width = (int)m_X;
this.Height = (int)m_Y;
}
//---C# WinForm 控制項隨視窗大小變化而比例改變_end07
}
}
public class TransitionsFun
{
public static TransitionsUI transitionsUI;
public static void ShowUI(String StrMsg)
{
CloseUI();
transitionsUI = new TransitionsUI(StrMsg);
transitionsUI.Show();
transitionsUI.Refresh();//https://stackoverflow.com/questions/50012020/c-sharp-form-show-does-not-paint-labels-in-the-form-to-show-showdialog-do-i
}
public static void CloseUI()
{
if (transitionsUI != null)
{
transitionsUI.Close();
transitionsUI = null;
}
}
}
}