1. FormBorderStyle None.
2. 버튼 아이콘 설정.
3. 위에 패널 or label 더블 클릭시 폼 최대화.
4. 위에 패널 or label 마우스 클릭후 폼 이동.
5. form padding으로 폼 Resize.
6. 작업표시줄에서 아이콘 클릭시 폼 최소화, 원상태 복귀.
2. 아이콘
- 환경설정 버튼 : font Wingdings, 16.2pt, style=Bold, text = R
- 최소화, 최대화, 닫기 : font Webdings, 13.8pt, style=Bold, text = 0, 1(최대화시 원상 복귀 2), r
C#: 아이콘 폰트를 사용해보자. (webdings, wingdings) (tistory.com)
C#: 아이콘 폰트를 사용해보자. (webdings, wingdings)
WindowsForms를 개발하다보면, 필연적으로 마주치는 상황이 생긴다. 타이틀바의 최소화, 최대화, 닫기 버튼 이라든지.. 뮤직플레이어의 재생, 정지 버튼이라든지.. 버튼의 텍스트를 아이콘으로 표현
vip00112.tistory.com
namespace WindowsFormsApp1
{
public partial class Form1 : Form
{
const int WS_MINIMIZEBOX = 0x20000;
const int CS_DBLCLKS = 0x8;
const int WM_NCHITTEST = 0x0084;
const int HTCLIENT = 1;
private Point point;
private bool isMove;
private readonly Color _BackGroundColor = Color.FromArgb(42, 44, 52);
private readonly Color _ForeGroundColor = Color.FromArgb(250, 250, 250);
private bool maximized;
public Form1()
{
InitializeComponent();
SetControls();
SetControlsEvent();
}
// 작업표시줄 아이콘 클릭시 최소화, 복귀
protected override CreateParams CreateParams
{
get
{
CreateParams cp = base.CreateParams;
cp.Style |= WS_MINIMIZEBOX;
cp.ClassStyle |= CS_DBLCLKS;
return cp;
}
}
protected override void OnShown(EventArgs e)
{
base.OnShown(e);
BackColor = _BackGroundColor;
// 폼 리사이즈시 필요한 패딩
Padding = new Padding(3);
label1.Text = "test";
}
// 폼 이동, 리사이즈
protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
switch (m.Msg)
{
case WM_NCHITTEST:
if (m.Result == (IntPtr)HTCLIENT)
{
var p = this.PointToClient(new Point(m.LParam.ToInt32()));
m.Result =
(IntPtr)
(p.X <= 6
? p.Y <= 6 ? 13 : p.Y >= this.Height - 7 ? 16 : 10
: p.X >= this.Width - 7
? p.Y <= 6 ? 14 : p.Y >= this.Height - 7 ? 17 : 11
: p.Y <= 6 ? 12 : p.Y >= this.Height - 7 ? 15 : p.Y <= 24 ? 2 : 1);
}
break;
}
}
private void SetControls()
{
label1.ForeColor = _ForeGroundColor;
btn_Setting.ForeColor = _ForeGroundColor;
btn_Setting.BackColor = _BackGroundColor;
btn_Setting.Cursor = Cursors.Hand;
// 버튼 border 사이즈 0으로 변경
btn_Setting.FlatStyle = FlatStyle.Flat;
btn_Setting.FlatAppearance.BorderSize = 0;
btn_Min.ForeColor = _ForeGroundColor;
btn_Min.BackColor = _BackGroundColor;
btn_Min.Cursor = Cursors.Hand;
btn_Min.FlatStyle = FlatStyle.Flat;
btn_Min.FlatAppearance.BorderSize = 0;
btn_Max.ForeColor = _ForeGroundColor;
btn_Max.BackColor = _BackGroundColor;
btn_Max.Cursor = Cursors.Hand;
btn_Max.FlatStyle = FlatStyle.Flat;
btn_Max.FlatAppearance.BorderSize = 0;
btn_Exit.ForeColor = _ForeGroundColor;
btn_Exit.BackColor = _BackGroundColor;
btn_Exit.Cursor = Cursors.Hand;
btn_Exit.FlatStyle = FlatStyle.Flat;
btn_Exit.FlatAppearance.BorderSize = 0;
}
private void SetControlsEvent()
{
this.FormClosed += Form1_FormClosed;
// 최대화
flowLayoutPanel1.MouseDoubleClick += Form_MouseDoubleClick;
label1.MouseDoubleClick += Form_MouseDoubleClick;
// 폼 이동
label1.MouseDown += Label1_MouseDown;
label1.MouseUp += Label1_MouseUp;
label1.MouseMove += Label1_MouseMove;
// 최소화
btn_Min.Click += (s, e) => { WindowState = FormWindowState.Minimized; };
// 최대화
btn_Max.Click += (s, e) => { SetWindowState(); };
// 닫기
btn_Exit.Click += (s, e) => { Close(); };
}
private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
}
private void Form_MouseDoubleClick(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
SetWindowState();
}
private void Label1_MouseDown(object sender, MouseEventArgs e)
{
isMove = true;
point = new Point(e.X, e.Y);
}
private void Label1_MouseUp(object sender, MouseEventArgs e)
{
isMove = false;
}
private void Label1_MouseMove(object sender, MouseEventArgs e)
{
if (isMove && (e.Button & MouseButtons.Left) == MouseButtons.Left)
{
Location = new Point(this.Left - (point.X - e.X), this.Top - (point.Y - e.Y));
}
}
private void SetWindowState()
{
if (maximized)
{
this.WindowState = FormWindowState.Normal;
maximized = false;
// 이모티콘 변경
btn_Max.Text = "1";
}
else
{
this.WindowState = FormWindowState.Maximized;
maximized = true;
// 이모티콘 변경
btn_Max.Text = "2";
}
}
}
}
'C#' 카테고리의 다른 글
[C#] .NET 6 - Worker Service Environment.Exit (0) | 2022.04.27 |
---|---|
[C#] string.Create (0) | 2022.02.23 |
[C#] System.Text.Json.JsonSerializer.Serialize 할 때 한글이 유니코드 형식으로 출력 될 때 (0) | 2022.02.11 |
[C#] .NET 6 - NativeMemory 사용 (0) | 2022.01.12 |
[C#] HttpClient download file example (2) | 2022.01.11 |