🔎 유용한 정보
1. 강의 개요
이번 강의에서는 NotifyIcon과 ContextMenuStrip을 사용하여 트레이 아이콘 기능을 구현하는 방법을 학습합니다.
트레이 아이콘은 응용 프로그램을 시스템 트레이(Windows 작업 표시줄 우측 하단)에 표시하며, 사용자는 이 아이콘을 통해 앱을 제어할 수 있습니다.
2. 학습 목표
- NotifyIcon을 사용하여 시스템 트레이에 아이콘 추가.
- ContextMenuStrip을 NotifyIcon과 연결해 메뉴 동작 구현.
- 트레이 아이콘을 통해 폼 숨기기/표시하기.
3. NotifyIcon이란?
NotifyIcon은 시스템 트레이에 아이콘을 표시하는 Windows Forms 컨트롤입니다.
- 트레이 아이콘: 앱이 실행 중임을 나타내고 사용자와 상호작용을 가능하게 함.
- 컨텍스트 메뉴: ContextMenuStrip을 연결하여 사용자 동작(종료, 설정 등)을 추가 가능.
NotifyIcon 주요 속성
속성 설명 예제
Icon | 트레이에 표시할 아이콘 파일 | notifyIcon1.Icon = SystemIcons.Application; |
Text | 트레이 아이콘에 표시될 툴팁 텍스트 | notifyIcon1.Text = "앱 실행 중"; |
ContextMenuStrip | 트레이 아이콘의 메뉴 | notifyIcon1.ContextMenuStrip = contextMenuStrip1; |
NotifyIcon 주요 이벤트
이벤트 설명 예제
DoubleClick | 아이콘을 더블 클릭했을 때 발생 | notifyIcon1.DoubleClick += ...; |
4. 실습: NotifyIcon과 ContextMenuStrip으로 트레이 아이콘 구현
요구사항
- NotifyIcon을 사용해 시스템 트레이에 아이콘 추가.
- ContextMenuStrip으로 "앱 열기", "종료" 메뉴 구현.
- 트레이 아이콘 더블 클릭 시 폼 숨기기/표시하기.
폼 구성
컨트롤 타입 이름 텍스트 위치 크기
NotifyIcon | notifyIcon1 | (없음) | 없음 | 없음 |
ContextMenuStrip | contextMenuStrip1 | (없음) | 없음 | 없음 |
코드 작성
Form1.cs
using System;
using System.Drawing;
using System.Windows.Forms;
namespace WindowsFormsApp1
{
public partial class Form1 : Form
{
private bool isHidden = false; // 폼 숨김 상태 확인 변수
public Form1()
{
InitializeComponent();
InitializeNotifyIcon();
}
private void InitializeNotifyIcon()
{
// ContextMenuStrip 생성 및 설정
contextMenuStrip1 = new ContextMenuStrip();
var menuOpen = new ToolStripMenuItem("앱 열기");
var menuExit = new ToolStripMenuItem("종료");
menuOpen.Click += (s, e) => ShowForm();
menuExit.Click += (s, e) => Application.Exit();
contextMenuStrip1.Items.Add(menuOpen);
contextMenuStrip1.Items.Add(menuExit);
// NotifyIcon 설정
notifyIcon1 = new NotifyIcon
{
Icon = SystemIcons.Application, // 기본 앱 아이콘 사용
Text = "트레이 아이콘 예제",
Visible = true,
ContextMenuStrip = contextMenuStrip1 // ContextMenuStrip 연결
};
notifyIcon1.DoubleClick += NotifyIcon1_DoubleClick;
}
// NotifyIcon 더블 클릭 이벤트
private void NotifyIcon1_DoubleClick(object sender, EventArgs e)
{
if (isHidden)
{
ShowForm();
}
else
{
HideForm();
}
}
// 폼 표시
private void ShowForm()
{
this.Show();
this.WindowState = FormWindowState.Normal;
isHidden = false;
}
// 폼 숨기기
private void HideForm()
{
this.Hide();
isHidden = true;
}
protected override void OnFormClosing(FormClosingEventArgs e)
{
base.OnFormClosing(e);
// 폼 닫기 대신 숨기기 처리
if (e.CloseReason == CloseReason.UserClosing)
{
e.Cancel = true;
HideForm();
}
}
}
}
Form1.Designer.cs
namespace WindowsFormsApp1
{
partial class Form1
{
private System.ComponentModel.IContainer components = null;
private NotifyIcon notifyIcon1;
private ContextMenuStrip contextMenuStrip1;
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
private void InitializeComponent()
{
this.SuspendLayout();
// Form1
this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 20F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(400, 300);
this.Name = "Form1";
this.Text = "트레이 아이콘 예제";
this.ResumeLayout(false);
}
}
}
5. 실행 결과
- 트레이 아이콘 표시
- 프로그램 실행 시, 시스템 트레이에 앱 아이콘이 표시됩니다.
- 아이콘 위에 마우스를 올리면 툴팁 텍스트("트레이 아이콘 예제")가 표시됩니다.
- ContextMenuStrip 동작
- 트레이 아이콘을 오른쪽 클릭하면 "앱 열기"와 "종료" 메뉴가 표시됩니다.
- "앱 열기" 클릭 → 폼이 표시됩니다.
- "종료" 클릭 → 프로그램이 종료됩니다.
- 아이콘 더블 클릭 동작
- 트레이 아이콘 더블 클릭 → 폼 숨기기/표시 전환이 이루어집니다.
- 폼 닫기 동작
- 버튼 클릭 시 폼이 닫히지 않고 숨겨지며, 트레이 아이콘이 유지됩니다.
6. 주요 개념 요약
- NotifyIcon 사용
- 시스템 트레이에 아이콘과 컨텍스트 메뉴를 표시하는 데 사용.
- Icon, Text, ContextMenuStrip 등의 속성을 설정.
- ContextMenuStrip 연결
- NotifyIcon에 컨텍스트 메뉴를 연결해 사용자 동작을 정의.
- 폼 숨기기 및 표시
- Hide() 및 Show() 메서드를 사용하여 폼의 숨김 상태를 관리.
- FormClosing 이벤트를 재정의하여 폼 닫기를 숨김으로 대체.
'📁 [4] 개발자 정보 & 코드 노트 > C#' 카테고리의 다른 글
C# Windows Forms 강의 41편: Custom Control 제작 (0) | 2025.03.16 |
---|---|
C# Windows Forms 강의 40편: ProgressBar를 활용한 작업 진행률 표시 (0) | 2025.03.15 |
C# Windows Forms 강의 38편: TreeView로 계층적 데이터 표시 (0) | 2025.03.13 |
C# Windows Forms 강의 37편: ListView를 활용한 데이터 목록 표시 (0) | 2025.03.12 |
C# Windows Forms 강의 36편: TabControl을 활용한 다중 페이지 인터페이스 구성 (0) | 2025.03.11 |
🔎 유용한 정보