본문 바로가기
Education/Bit 18th

[WMADG] 2장 마이크로소프트 윈도우 폼 GUI 구축

by ★용호★ 2009. 12. 16.

2009년 12월 16일

폼 종료

 

메인 폼과 메인이 아닌 다른 폼이 있는데 메인 폼은 비쥬얼 스튜디오가 생성하는 Program.cs파일 내에 있는 정적 main 메소드의 Application.Run으로 전해진다.

static class Program

{

static void Main()

{

Application.Run(new Form1());

}

}

 

메인 폼 종료시에는 애플리케이션도 종료된다. 언제든 Application.Exit를 사용해서 애플리케이션을 종료 할 수 있지만 이 방법은 그리 좋은 방법이 아니다. 이 경우엔 Closing 이벤트 메소드 핸들러를 실행하지 않고, 즉각 윈도우 메시지루프 큐에 있는 윈도우 메시지들의 처리를 중지시키기 때문이다. 사용자가 메인 폼을 닫을 때 애플리케이션이 종료하게 설계하는 것이 깔끔한 방법이다.

 

 - 언제 애플리케이션을 종료하고, 언제 최소화 할 것인가?

 

대부분의 디바이스 애플리케이션에서는 종료하는 방법을 제공하지 않는 대신 애플리케이션이 영리하게 최소화되게 설정할 수 있다.   영리하게 최소화 된다는 것은 백그라운드로 사라진다는 것을 의미한다. 데스크 탑의 경우 X 모양이 있는 종료 버튼은 종료를 뜻하지 최소화를 뜻하지 않는다. 하지만 포켓 PC 사용자 인터페이스가 지금의 모습으로 개량을 거듭해 오던 몇 년 전부터 포켓 PC에서의 X는 최소화를 뜻하게 됐다. 휴대용 디바이스는 항상 켜져있는 것은 물론 즉각적인 반응이 필요한 기기이다. 애플리케이션을 종료하고 새로 시작하는데는 실행하는 속도가 느리지만 백그라운드에서 실행되고 있는 애플리케이션을 단순히 재활성화 시키는 속도는 매우 빠르다.  휴대용 디바이스 사용자에게는 애플리케이션을 종료하거나 최소화하는 것보다는 애플리케이션 간의 빠른 전환이 문제다. 어떻게 그렇게 되는가는 중요하지 않다. 애플리케이션을 다시 실행시키는게 아니라 이미 실행 중이던 영리하게 최소화된 애플리 케이션을 다시 활성화 시키면 사용자들은 애플리케이션이 빨리 시작된다고 느낄 것이다.

 

포켓 PC 디바이스에서는 폼의 MinimizeBox 속성의 불리언 값을 바꿔줌으로 써 코드 내에서 최소화 동작을 변경할 수 있다.

 false : OK 버튼을 표시,  true : 종료 버튼을 표시

메인 폼 이후 두번째 폼을 열 때 데스크탑처럼 FormShow, ShowDialog 메소드를 사용하는 것이 좋은 방법이라 할 수 있다. ShowDialog 메소드를 사용한다면 폼은 우측 상단에 OK 버튼을 가지게 될 것이고 MinimizeBox 속성은 무시될 것이다. ShowDialog 메소드를 사용하는 것은 데스크탑에서 모달 대화상자를 쓰는 것과 동일한 결과를 가져온다는 점에 유의해야한다.

폼이 백그라운드로 전환될 때는 Deactivate 이벤트가 발생한다. 사용자가 우측 상단의 OK 버튼을 써서 메인폼이 아닌 폼을 닫는다면 Closing 이벤트가 발생한다. 강제 종료시키려면 폼의 Close 메소드를 사용할 수도 있다.

private void frmShown_Closing(object sender, CalcelEventArgs e)

{

//OK나 종료 메소드 호출에 의해 폼이 종료될 때

Debug.WriteLine("Closing");

}

private void frmShown)Deactivate(object sender, EventArgs e)

{

//폼이 백그라운드로 갈 때

//(종료, 영리한 최소화 등)

Debug.WriteLine("Deactivate");

}

private void menuItem1_Click(object sender, EventArgs e)

{

//OK 버튼이 클릭되는 것과 동일

//폼이 종료 버튼(최소화 기능을 하는)을 가지고 있어도

//여기서 OK버튼이 하는 것처럼 폼을 종료시킨다.

this.Close();

}

 

 

폼 이동

 

윈도우 모바일 디마이스의 폼은 항상 전체화면이고 사용자는 한 번에 하나의 폼을 사용할 수 있다. 그러므로 폼 간의 이동은 상당히 까다로운 일이다. 폼 간의 의존도를 최소화 하게 노력해야 한다.

현재 폼으로 들어올때는 Activated, 현재 폼에서 빠져나갈 때는 Deactivated 이벤트가 발생한다. 새 폼이 모달로 열리면 새로 열린 폼이 닫힐 때까지 원래 폼은 사용할 수 없다.

private void button2_Click(object sender, EventArgs e)

{

frmShown f = new frmShown();

if(checkBox1.Checked)   //모달로 표시

{

f. ShowDialog();

}

else

{

f.Show();

}

}

Show를 사용해서 연 모달리스 폼이 있다면 개발자가 이 폼만 보이게 하고 싶었더라도 사용자는 부모 폼을 활성화할 수 있다. 그러므로 이러한 방법은 바람직하지 않다. 이에 대한 해결책으로 Owner 속성을 설정한다면 단일 화면 애플리케이션의 외양을 갖추기 위해 열리는 폼의 모든 캡션을 동일하게 유지하는 것과 실행중인 프로그램 목록에 단 하나의 폼만 나오게 하는 것이 가능하다.

다음 내용을 보장하면서 폼을 표시한다.

  1. 실행중인 프로그램 목록에 하나의 엔트리만 등록되게 한다.
  2. 단일 엔트리는 보여지는 폼에 상관없이 같은 캡션을 가진다.

private void button3_Click(object sender, EventArgs e)

{

frmShown f = new frmShown();

f.Owner = this;

f.ShowDialog();

}

Owner 속성을 사용하는 것은 폼이 ShowDialog를 사용해서 표시됐을 경우에만 가능하다는 것에 주의하자.

'Education > Bit 18th' 카테고리의 다른 글

프로젝트 구현 계획  (0) 2009.12.16
프로젝트 계획  (0) 2009.12.16
[WMADG] 1장 닷넷 컴팩트 프레임워크  (0) 2009.12.16
DirectShow 정보  (0) 2009.12.10
OpenCV 관련 사이트  (0) 2009.12.10

댓글