MFC 다이얼로그 생성과 동시에 숨기기

linsooServerStarter가 매부팅마다 화면가온데 떠 있는게 맘에 안들어서 자동으로 트레이바로 들어가 있도록 수정 작업중.

생각한거와 달리 다이얼로그로 만들때 OnInitDialog에 ShowWindow(SW_HIDE)를 넣어도 사라지지 않는다. 검색해보니 다이얼로그로 만들면 doModal()을 처리 하면서 WM_SHOWWINDOW를 사용하게 되서 저게 먹히지 않는거라고 함.

그래서 다른 꼼수를 찾아보았음.

방법1. 

void ClinsooServerStarterDlg::OnWindowPosChanging(WINDOWPOS* lpwndpos)
{
	CDialogEx::OnWindowPosChanging(lpwndpos);
	// TODO: Add your message handler code here
	lpwndpos->flags &= ~SWP_SHOWWINDOW; // <- 속성에서 윈도우를 hidden으로 설정한다.

}

위 방법을 쓰면 윈도우 창의 변화(위치나 크기)가 발생할때 마다 플래그값을 줘서 숨겨준다.

처음 다이얼로그가 생성될때 저기를 반드시 거치기 때문에 저 플래그 변화로 다이얼로그가 나오질 않는다. 그래서 별도의 변수를 줘서 화면에 보여줘야 할때는 저 플래그를 주지 않는 방법으로 처리 해야 한다.

lpwndpos->flags |= SWP_SHOWWINDOW;

화면에 다시 나오게 할려면 위 명령을 쓰면 됨.

 

방법2.

BOOL ClinsooServerStarterDlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();

	// 이 대화 상자의 아이콘을 설정합니다.  응용 프로그램의 주 창이 대화 상자가 아닐 경우에는
	//  프레임워크가 이 작업을 자동으로 수행합니다.
	SetIcon(m_hIcon, TRUE);			// 큰 아이콘을 설정합니다.
	SetIcon(m_hIcon, FALSE);		// 작은 아이콘을 설정합니다.

	// TODO: 여기에 추가 초기화 작업을 추가합니다.
	ShowWindow(SW_SHOWMINIMIZED);
	PostMessage(WM_SHOWWINDOW, FALSE, SW_OTHERUNZOOM);

	return TRUE;  // 포커스를 컨트롤에 설정하지 않으면 TRUE를 반환합니다.
}

실제 창을 숨기는 명령은 PostMessage(WM_SHOWWINDOW, FALSE, SW_OTHERUNZOOM); 으로 발생한다. 두번째 인자가 TRUE면 보여주고 FALSE면 숨긴다.

세번째 인자는 어떤 이유로 이 메세지가 발생했는지 알려주는건데 MSDN에 따르면 4가지 옵션이 있는데 이중 아무거나 해도 결과는 동일하다. (정확히는 0만 아니면 동일하게 작동한다)

근데 문제는 이렇게 창을 숨기기 하면 화면에 창이 한번 떴다가 사라지게 됨.
이걸 해결하기 위해서 바로 위에 ShowWindow(SW_SHOWMINIMIZED); 이 있는것임.

PostMessage(WM_SHOWWINDOW, TRUE, SW_OTHERUNZOOM);

화면에 다시 나오게 할려면 위 명령을 쓰면 됨.
뭐 화면에 사라진후 나오게 할려면 트레이아이콘 처리 하는 방법 밖에 없으니 그건 알아서…


Comments

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다