Event Dialog Box를 만들어 보자

Event Dialog Box를 만들어 보자
종종 Application을 보다보면 1~2초 동안 잠깐 나와서 메시지를 보여주고 스스로 사라지는 윈도우를 볼 수 있을 것이다.

AfxMessageBox 처럼 쉽게 만들고, 사용자가 delete 시키는 아무런 작업을 하지 않아도 스스로 사라지는 그런 편리한 이벤트 대화 상자를 만들어 보자 이런 대화 상자는 아빠 윈도우에 아무런 영향을 주어서는 않된다. 모달 대화 상자와 같은 경우에는 대화 상자가 생성되면 아빠 윈도우의 동작이 멈춰버리므로 적합하지 않으므로 모달리스 대화 상자를 사용하자.

모달리스 대화 상자는 모달대화 상자외 달리 의 DoModal로써 윈도우를 생성하고 보여주지않고 보통의 윈도우처럼 create와 ShowWindow를 사용해서 윈도우를 생성하고 보여 준다. 아래의 코드가 바로 그 부분이다..

Create(IDD_EVENT, AfxGetMainWnd() );
ShowWindow( SW_SHOWNORMAL );

Create의 첫번째 인자는 다이알 로그 위자드에서 만든 대화상자의 ID 이다. 실제 코딩된 모습이 아래에 나와 있다.

CEventDialog dlg = new CEventDialog( “Test Event Occure!” )
dlg.Create(IDD_EVENT, AfxGetMainWnd() );
dlg.ShowWindow( SW_SHOWNORMAL );

위와 같이 클래스 외부에서 윈도우를 생성하고 보여 줄 수 있으나 CEventDialog 클래스 내부의 생성자에 삽입을 하여 더욱 간단하게 만들 수 있다.

CEventDialog::CEventDialog( CString strMessage, int iTime, CWnd* pParent /*=NULL*/)
: CDialog(CDlgEvent::IDD, pParent)
{
m_iTime = iTime;
m_strMessage = strMessage;

Create(IDD_EVENT, AfxGetMainWnd() );
ShowWindow( SW_SHOWNORMAL );
SetFocus();
}

이제 단순히 new 를 하게 되면 클래스의 생성, 윈도우의 생성, 윈도우의 출력까지 되게 된다. m_iTime변수는 윈도우를 얼마동안 출력할 것인지를 나타내는 값이다.

모달리스 대화 상자에서는 DoModal, EndDialog, OnOK, OnCacel함수를 재 정의 해서 사용하거나 사용하지않는다.

생성된 윈도우를 지울때도 모달 대화 상자와는 달리 DestroyWindow함수르 호출하거나 WM_CLOSE 메시지를 던진다. 일반적으로 DestroyWindow를 하지만 두 경우 모두 같은 역할을 한다.

일정한 시간이 흐르면 스스로 죽게 하기 위해서느 SetTimer를 사용하여 Timer를 작동시킨다.

SetTimer( 1, 500, NULL );

SetTimer함수는 윈도우와 관계된 함수이므로 윈도우가 생성된 후에 호출하자. 그러기 위해서는 OnInitDialog함수 안에 코드를 삽입하자. 이부분에 MoveWindow를 삽입하여 윈도우의 위치를 조정할 수 있다.

첫번째 인자는 Timer의 ID이다. 여러개의 타이머가 동시에 한 윈도우에서 작동한다면 이 아이디를 보고 구별한다. 두 번째 인자는 1초에 몇번의 타이머가 종작하는지를 나타낸다. 세 번째 인자는 callback함수.

void CDlgEvent::OnTimer(UINT nIDEvent)
{
m_iTime –;
if( m_iTime < 0 )
{
PostMessage( WM_CLOSE );
KillTimer( nIDEvent );
}
CDialog::OnTimer(nIDEvent);
}

일정 시간이 흐르고 나면 PostMessage( WM_CLOSE )를 호출하여 윈도우를 없앤다. 절대로 DestroyWindow나 SendMessage( WM_CLSE )를 사용해서는 안된다. 이 함수를 사용하게 되면 그 즉시 윈도우가 사라지기때문에 더이상 그아래의 함수를 호출하지 못하고 윈도우가 다운된다.

이제 윈도우가 사라 졌으니 윈도우 클래스를 없애야한다. 우리는 이 모든 작업을 자동으로 해야하기 때문에 클래스 내부에 클래스를 없애는 코드도 넣어야한다. PostNcDstroy함수윈도우가 없어진 직후 호출되는 함수이다. 이부분에 delete this 코드를 삽입하자.

void CDlgEvent::PostNcDestroy()
{
CDialog::PostNcDestroy();
 
delete this;
}

이제 이벤트 대화 상자가 필요한 부분에 아래와 같이 코딩하자.



new CEventDialog( “?????” );

대화 상자가 나타 났다가 얼마뒤 스스로 메모리에서 흔적도 없이 사라지게 될것이다. 물론 화면에서도 ….

zemna

Programmer/Web/Mobile/Desktop

You may also like...

Leave a Reply