프로그램 시작시 다이얼로그를 숨기고 트레이아이콘만 나오게 설정하는 프로그램을 만들어 보신분은 조금은 고생하셨을 거라고 생각합니다.
ShowWindow(SW_HIDE) 을 삽입하면 다이얼로그를 숨기고 트레이아이콘만 나오게 할 수 있을 거라고 쉽게 생각하기 마련입니다. 저도 그와 같은 생각으로 소스코드의 여러군데에 삽입해 보았지만 아무 소용이 없었습니다. 그래서 다른 방법으로 다이얼로그를 제어해야한다는 것을 깨달았습니다.
WindowPosChanging 메시지는 윈도우의 크기, 위치, Z-order 순서 변경할때 발생하는 메시지입니다. 윈도우의 변화가 있으면 발생하는 메시지입니다.
WindowPosChanging 메시지의 멤버변수를 보면 flags 멤버변수가 있습니다. 이 변수는 윈도우의 위치에 대한 다양한 설정 값을 가지고 있습니다.
다이얼로그가 생성될때 flags 가 SWP_SHOWWINDOW 값으로 설정되어질 것 입니다. 설정되어 있는 flags 값을 삭제하면 다이얼로그는 보이지 않을 것입니다.
[MFC] 트레이 아이콘 등록 ☞ http://pangsan.tistory.com/161
다이얼로그 시작시 m_bShowStatus 변수값을 false 값으로 설정합니다.
m_bShowStatus 가 true 값이면 윈도우를 보이게 하고, false 값이면 윈도우를 숨깁니다.
이대로 설정해두면 다이얼로그는 계속 숨김상태로 됩니다. 다이얼로그를 보이게 설정하려면 위의 소소크드처럼 트레이아이콘을 클릭하여 다이얼로그를 보이게 하는 메서드를 만들어서 m_bShowStatus 에 true 값을 설정해두면 다이얼로그를 보이게 만들 수 있습니다.
ShowWindow(SW_HIDE) 을 삽입하면 다이얼로그를 숨기고 트레이아이콘만 나오게 할 수 있을 거라고 쉽게 생각하기 마련입니다. 저도 그와 같은 생각으로 소스코드의 여러군데에 삽입해 보았지만 아무 소용이 없었습니다. 그래서 다른 방법으로 다이얼로그를 제어해야한다는 것을 깨달았습니다.
WindowPosChanging 메시지를 이용한 숨기기 |
WindowPosChanging 메시지는 윈도우의 크기, 위치, Z-order 순서 변경할때 발생하는 메시지입니다. 윈도우의 변화가 있으면 발생하는 메시지입니다.
WindowPosChanging 메시지의 멤버변수를 보면 flags 멤버변수가 있습니다. 이 변수는 윈도우의 위치에 대한 다양한 설정 값을 가지고 있습니다.
SWP_DRAWFRAME 프레임을 그린다.
SWP_FRAMECHANGED
SWP_HIDEWINDOW 윈도우를 숨긴다.
SWP_NOACTIVATE 윈도우를 활성화 시키지 않는다.
SWP_NOCOPYBITS 클라이언트 영역과 관련된 모든 정보를 무시한다.
SWP_NOMOVE 현재 위치를 유지한다. (x,y 파라미터를 무시한다.)
SWP_NOOWNERZORDER 소유주 윈도우의 Z-order를 변경하지 않는다.
SWP_NOREDRAW 윈도우를 새로 그리지 않는다. 어떠한 페인팅 관련 메시지도 포스트 되지 않는다.
SWP_NOREPOSITION SW_NOOWNERZORDER 플래그와 같음
SWP_NOSENDCHANGING 윈도우가 WM_WINDOWPOSCHANGING 메시지를 받는 것을 막는다.
SWP_NOSIZE 사이즈를 변경하지 않는다. (cx, cy 파라미터를 무시한다.)
SWP_NOZORDER Z-order를 변경하지 않는다.
SWP_SHOWWINDOW 윈도우를 출력한다.
[MFC] 트레이 아이콘 등록 ☞ http://pangsan.tistory.com/161
1. m_bShowStatus 멤버변수 선언 |
protected:
bool m_bShowStatus;
2. OnWindowPosChanging 메시지를 작성한다. |
void CTrayDlg::OnWindowPosChanging(WINDOWPOS* lpwndpos)
{
CDialog::OnWindowPosChanging(lpwndpos);
// TODO: 여기에 메시지 처리기 코드를 추가합니다.
if( m_bShowStatus == true ) {
lpwndpos->flags |= SWP_SHOWWINDOW;
}
else {
lpwndpos->flags &= ~SWP_SHOWWINDOW;
}
}
LRESULT CTrayDlg::TrayIconMessage(WPARAM wParam, LPARAM lParam)
{
// 등록된 TrayIcon 클릭하면 Show....
if(lParam == WM_LBUTTONDBLCLK) {
ShowWindow(SW_SHOW);
m_bShowStatus = true;
}
return 0L;
}
야이노마
» Contact Me: yainoma00@gmail.com