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);

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

참고사이트: http://purelab.net/zbxe/guruin/87929

뱀발: 왜 TODO 문이 하난 한글이고 하난 영문이냐고?
첨에 만들땐 VS2013CE 한글판으로 했고 지금은 VS2015CE 영문판임.

크리에이티브 커먼즈 라이선스Linsoo의 저작물인 이 저작물은(는)크리에이티브 커먼즈 저작자표시-동일조건변경허락 4.0 국제 라이선스에 따라 이용할 수 있습니다.

댓글 남기기

이메일은 공개되지 않습니다.

This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

This site uses Akismet to reduce spam. Learn how your comment data is processed.