퇴근5분전


 에... 늘 쓰던건데... 그냥 블로그에 기록해봄


1. 도구상자에서 NotifyIcon 컨트롤을 얹어놓고.
    더블클릭이벤트 -> Form.Show();  
     
2. contextMenu 컨트롤도 하나 올리고 -> 종료하기를 구현한다.
   
3. NotifyIcon에 사용할 아이콘 이미지 하나를 제작하고 컨트롤에 등록해준다.

4. bool Flag하나 선언하고 CheckBox하나를 더 등록한다.

5. 나머진 구현만 하면 되는데...  작업표시줄에 아이콘활성화는 폼을 Hide하고 NotifyIcon.Visible = true; 하면된다.

구현 시 동작은 폼이 닫힘 버튼을 누르거나 X를 눌러 종료시 -> 최소화라는 CheckBox 의 체크값에 따라 되고 안되고를 처리 하며 bClose는 FormClosing이벤트의 e.Cancel 값을 토글하는 목적으로 사용된다.

소스를 아래 붙힌다. 

수정 : 2010,2,24일 doClose는 삭제처리..
  -> 로직을 생각해보니 doClose는 필요없었던듯 함. 
   생기게된 이유는 원래 목적이 그거였는데 중간에 외부에서 입력시켜주는 checkBox를 추가하면서 doClose가 필요없는데도... 남겨두었던것...


 public partial class MainForm : Form
    {
//폼 닫히는 지 확인값.
        bool doClose = false;

        public MainForm()
        {
            InitializeComponent();
        }

// 닫기버튼으로 폼을 닫는다 
// 이때 checkBox의 값은 Closing될때 체크되어 진짜 닫을지 최소화 하고 작업표시줄에 나타낼지가 결정되므로
// 여기서는 무시한다.           
private void button3_Click(object sender, EventArgs e)
        {
            this.Hide();
            doClose = false;
            this.Close();
        }

// 폼이 처음 Show되는 위치를 지정한다.  작업표시줄 바로위에 표시되게 값을 지정함.        
protected override void OnShown(EventArgs e)
        {
            this.Left = Screen.PrimaryScreen.WorkingArea.Width - this.Width;
            this.Top = Screen.PrimaryScreen.WorkingArea.Height - this.Height;
            notifyIcon1.Visible = false;
            base.OnShown(e);
        }

// 폼이 닫힐때 최소화 체크값에 따라 닫힐지 최소화가 될지가 결정된다. 
// bClose값이 e.Cancel값으로 그냥 닫는 것을 캔슬 해준다.       
protected override void OnFormClosing(FormClosingEventArgs e)
        {
            if (checkBox1.Checked)
            {
                doClose = true;
                this.Hide();
                notifyIcon1.Visible = true;
            }
            e.Cancel = doClose;
            e.Cancel = checkBox1.Checked;  // 이렇게 바뀜.
            base.OnFormClosing(e);
        }

폼이 완전 닫혔으면 NotifyIcon을 정리해준다 안그러면 작업표시줄에 살아있는 것 처럼 남게 된다.        
protected override void OnFormClosed(FormClosedEventArgs e)
        {
            this.notifyIcon1.Visible = false;
            this.notifyIcon1.Dispose();
            this.notifyIcon1 = null;
            base.OnFormClosed(e);
        }

// 닫기버튼 클릭시...        
private void button4_Click(object sender, EventArgs e)
        {
            this.Hide();
            doClose = true;
            notifyIcon1.Visible = true;
        }

// ContextMenu에 종료하기 클릭시...        
private void 종료하기ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            doClose = false;
            this.checkBox1.Checked = false;
            this.Close();
        }

// NotifyIcon을 더블클릭시 프로그램 Show기능      
  private void notifyIcon1_DoubleClick(object sender, EventArgs e)
        {
            doClose = true;
            notifyIcon1.Visible = false;
            this.Show();
        }
    }


대충 훑어보았음... 늘 쓰는거라서... 정말 많이 필요해지면... 중간에 따로 관리 객체를 만들어서 프레임웍에 넣을까?