달력

32024  이전 다음

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

-- DB Server 감시 데몬 하나 만드는 중 --

-- 일본어 번역기로 돌렸음 --

-- http://www.atmarkit.co.jp/fdotnet/dotnettips/392notifyicon/notifyicon.html --



 Outlook (이)나MSN Messenger 등과 같이,Windows 어플리케이션에서는 시스템 트레이(task tray, 스테이터스 영역등이라고도 불린다)에 아이콘을 표시하고, 어플리케이션 상태를 나타내거나 어플리케이션의 폼을 표시하거나하기 위한 쇼트 컷으로서 이용할 수 있다.

 .NET Framework 의 클래스·라이브러리에는, 시스템 트레이에 아이콘을 표시하기 위한NotifyIcon 컴퍼넌트가 준비되어 있어 이것을 사용하는 것으로써, 상기와 같은 어플리케이션을 간단하게 작성할 수 있다.

 본고에서는, 이하와 같은 사양의 어플리케이션을 작성하면서,NotifyIcon 컴퍼넌트의 기본적인 이용 방법에 대해 정리한다.

  • 기동시에 폼과 동시에 시스템 트레이에 아이콘을 표시한다
  • 아이콘을 오른쪽 클릭해 표시되는 문맥·메뉴의[종료]로, 어플리케이션을 종료할 수 있다.
  • 폼의 우상구석에 있는[닫는]버튼의 클릭으로, 폼을 비표시로 한다(어플리케이션은 종료하지 않는다).
  • 아이콘의 더블 클릭으로 폼을 표시해, 한편 액티브하게 한다.

시스템 트레이에의 아이콘의 표시

 우선 어플리케이션의 기동시에, 시스템 트레이에 아이콘이 표시되도록 하자.

 Visual Studio .NET 그리고Windows 어플리케이션의 프로젝트를 신규 작성해,[툴 박스]윈도우로부터NotifyIcon 컴퍼넌트를 폼상에 드러그&드롭 한다.

 다음에,[프롭퍼티]윈도우에서,Icon 프롭퍼티로 적당한 아이콘·파일(.ico 파일)을 선택한다.여기서 지정한 아이콘이, 시스템 트레이에 표시되는 아이콘이 된다.이 설정을 실시하지 않으면, 어플리케이션을 실행해도 시스템 트레이에 아이콘은 표시되지 않는다.

 또,NotifyIcon 컴퍼넌트의Text 프롭퍼티에 문자열을 설정해 두면, 그것이 아이콘의 툴·힌트·텍스트로서 사용된다.이것은 마우스·커서를 아이콘상에 이동시켰을 때에 표시된다.

시스템 트레이·아이콘에 있어서의 문맥·메뉴의 표시

 계속 되어서는, 아이콘의 오른쪽 클릭에 의해[종료]메뉴를 표시해, 그것을 실행해 어플리케이션을 종료할 수 있도록 한다.

 이것에는,ContextMenu 컴퍼넌트를 폼상에 드러그&드롭 해,[종료]메뉴 항목을 추가한다.그리고[프롭퍼티]윈도우에서,NotifyIcon 컴퍼넌트의ContextMenu 프롭퍼티에, 지금 작성했다ContextMenu 컴퍼넌트를 설정한다.

[종료]메뉴의 항목을 추가했다ContextMenu 컴퍼넌트
여기에서는 폼의 메뉴로서 디자인하지만, 메뉴(이 화면에서는contextMenu1 )(을)를NotifyIcon 컴퍼넌트의ContextMenu 프롭퍼티로 설정하는 것으로써, 아이콘을 오른쪽 클릭했을 때에 표시되게 된다.□

아이콘의[종료]메뉴에 의한 어플리케이션의 종료

 다음에, 지금 추가한[종료]메뉴 항목을 더블 클릭 하고, 메뉴 항목의 선택시에 실행되는 이벤트·핸들러를 이하와 같이 기술한다.

private void menuItem1_Click(object sender, System.EventArgs e)
{
  notifyIcon1.Visible = false; // 아이콘을 트레이로부터 없앤다
  Application.Exit(); // 어플리케이션의 종료
}
Private Sub MenuItem1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItem1.Click
  NotifyIcon1.Visible = False ' 아이콘을 트레이로부터 없앤다
  Application.Exit() ' 어플리케이션의 종료
End Sub
문맥·메뉴의[종료]의 이벤트·핸들러의 기술(위:C# , 아래:VB.NET )

 통상,Windows 폼을 종료시킬 때는Close 메소드를 호출하지만, 이번 경우에서는 다음의 항목으로 말하고 있도록(듯이)Close 메소드 호출에 의해 발생한다Closing 이벤트를 캔슬해 버리므로, 여기에서는Application.Exit 메소드에 의해 어플리케이션을 강제적으로 종료시킨다.

 또, 어플리케이션의 종료시에는 시스템 트레이에 아이콘이 남아 버리는 일이 있으므로, 아이콘(NotifyIcon 오브젝트)의Visible 프롭퍼티를false (으)로 설정하고, 명시적으로 시스템 트레이로부터 지워 둔다.

 시스템 트레이·아이콘을 이용한 어플리케이션을 작성한 경우에는, 어플리케이션이 종료했음에도 불구하고 아이콘이 남아 버려, 그 아이콘을 마우스·커서로 덧써 주면 사라진다고 하는 현상이 이따금 발생하는 일이 있지만, 그러한 경우에는 이 방법을 시험해 주셨으면 한다.

폼이[닫는]버튼·클릭에 의한 폼의 비표시

 시스템 트레이·아이콘을 표시하는, 이른바 상주형의 어플리케이션에서는, 폼의 우상구석에 있는[닫는]버튼이 클릭되어도 어플리케이션을 종료시키지 않고 , 폼을 비표시로 할 만한 경우가 많다.

 이 동작을 실장하려면 , 폼을 닫으려고 했을 때에 발생한다Closing 이벤트의 이벤트·핸들러를 폼에 추가해, 다음과 같이 기술한다.

private void Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
  e.Cancel = true; // 종료 처리의 캔슬
  this.Visible = false; // 폼의 비표시
}
Private Sub Form1_Closing(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles MyBase.Closing
  e.Cancel = True ' 종료 처리의 캔슬
  Me.Visible = False ' 폼의 비표시
End Sub
폼의Closing 이벤트·핸들러의 기술(위:C# , 아래:VB.NET )

 이 이벤트·핸들러에서는, 파라미터로 건네받는다CancelEventArgs 오브젝트의Cancel 프롭퍼티에true (을)를 설정하는 것으로써, 폼의 종료 처리를 캔슬할 수 있다.

 또 여기에서는, 폼의Visible 프롭퍼티에false (을)를 설정하는 것으로써, 폼을 비표시로 한다.

아이콘의 더블 클릭에 의한 폼의 표시

 마지막으로, 폼이[닫는]버튼에 의해 비표시가 된 폼을, 시스템 트레이의 아이콘을 더블 클릭 하는 것으로써 재차 표시되도록 하자.

 이것에는NotifyIcon 컴퍼넌트에DoubleClick 이벤트·핸들러를 추가해, 다음과 같이 기술한다.

private void notifyIcon1_DoubleClick(object sender, System.EventArgs e)
{
  this.Visible = true; // 폼의 표시
  if (this.WindowState == FormWindowState.Minimized)
    this.WindowState = FormWindowState.Normal; // 최소화를 그만둔다
  this.Activate(); // 폼을 액티브하게 한다
}
Private Sub NotifyIcon1_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles NotifyIcon1.DoubleClick
  Me.Visible = True ' 폼의 표시
  If Me.WindowState = FormWindowState.Minimized Then
    Me.WindowState = FormWindowState.Normal ' 최소화를 그만둔다
  End If
  Me.Activate() ' 폼을 액티브하게 한다
End Sub
아이콘(NotifyIcon 컴퍼넌트)의DoubleClick 이벤트·핸들러의 기술(위:C# , 아래:VB.NET )

 여기에서는, 폼이 최소화되고 있는 경우에는, 폼의WindowState 프롭퍼티에FormWindowState.Normal (을)를 설정하는 것으로써, 폼의 통상 상태에 되돌리고 있다.

 또, 폼의Activate 메소드를 호출해 폼을 액티브하게 하고 있다.이것에 의해, 폼이 다른 윈도우에 숨어 있었을 경우에도, 맨 앞면에 표시되게 된다.End of Article

Posted by tornado
|

http://www.castleproject.org/


시간날때 다이나믹 프락시 점 봐야겠습니다.

Posted by tornado
|

아주 큰~~~ 삽질

.NET/C# 2006. 7. 25. 19:46

현재 ASP.NET 2.0 으로 개발하고 있는데, 데이터베이스 관련해서 프레임워크를


하나 만들어서 사용한다.


COM+ 사용 안하고 멀티 트랜잭션 가능하고, 테이블과 객체 매핑 되고, Stored Procedure 에


최적화 시켜놨당.


그런데, 웹페이지 띠우고 새로고침 몇십번 하면 tcp resource 부족으로 먹통이 된다. ㅎㅎ


왜 그러나~ 하고 코드 자세히 뜯어보니...


private ArrayList dbts = new ArrayList();



public void CreateTransaction(bool isTransaction)
{


  DBTransaction dbt = new DBTransaction(true);

  dbts.add(dbt);

}


public void ReleaseTransaction()

{

    foreach(DBTransaction dbt in dbts){

        dbts.Clone();

    }

}


대충 이런 코드가 있는데... 빨간색 부분.... 허걱..


Close() 해야 하는데, Clone() 이당...


Visual Studio 에 코드 자동완성 뜨는거에 대충 엔터쳐서 작성해 놨더니


저렇게 되었음.



즉 트랜잭션 열어놓구, 종료두 안하고 ArrayList 를 계속 복사한 상황이다.


빨리 알아냈으니 다행이지 큰일날뻔했네 ㅎ



Posted by tornado
|

괜찮은 Chart 하나~

.NET/C# 2006. 7. 20. 17:12
Posted by tornado
|

[WebMethod (Description="Simple mailer w/ authentication")]
public string SimpleMail(string mailto, string mailfrom, string mailsubject, string mailbody, string mailcc, string mailbcc, string smtpserver, string username, string password)
{
string _results = "success!";
MailMessage mm = new System.Web.Mail.MailMessage();
mm.From = mailfrom;
mm.To = mailto;
mm.Subject = mailsubject;
mm.Body = mailbody;
mm.Cc = mailcc;
mm.Bcc = mailbcc;
mm.BodyFormat = MailFormat.Text;

int cdoBasic = 1;
int cdoSendUsingPort = 2;

mm.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate", cdoBasic);
mm.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendusername", username);
mm.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendpassword", password);
mm.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendusing", cdoSendUsingPort);
mm.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpserver", smtpserver);
mm.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout", 10);
mm.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpserverport", 25);
mm.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpusessl", false);

try
{
System.Web.Mail.SmtpMail.Send(mm);
}
catch (Exception e)
{
_results = e.ToString();
}

return _results;

}

'.NET > C#' 카테고리의 다른 글

[펌] winmm.dll 을 이용한 간단한 MP3 Player  (0) 2007.01.04
닷넷 어플리케이션을 TrayIcon 화 시키는 방법  (0) 2007.01.03
http://www.castleproject.org/  (0) 2006.12.15
아주 큰~~~ 삽질  (0) 2006.07.25
괜찮은 Chart 하나~  (0) 2006.07.20
Posted by tornado
|