본문 바로가기

Language/MFC

Property sheet 위자드 형식 Next 강제 이벤트 발생

제목도 참 만들기 힘들구만;;

 

어떠한 옵션을 단계적으로 선택하고픈 기능을 만들때 일반적인 Dialog 를 여러개 만들어서 하나 띄운뒤 선택하면 종료후 다음 Dialog 띄우고 하는 짓은 사실 매우 귀찬고 창이 제대로 종료가 됐는지 않됐는지 확인하기도 참 힘들다.

 

물론 선택된 옵션이 제대로만 됐으면 상관이 없지만 만들기가 심플한 부분은 절대 아니다.

 

때문에 많이들 사용하는 것이 프로퍼티 시트 기능으로 모달리스나 모달, 위자드 스타일로 만드는 것이다.

 

VS는 MFC 프로젝트 생성시 이런 위자드 형식의 창을 이용하여 어떤 (SDI/MDI/Dialog base) 기반으로 할껀지 기반이 정해지면 해당 기반에서 사용하고픈 옵션 제거 하고픈 옵션등을 정의하고 마지막에 피니쉬와 함께 프로젝트가 생성이 된다.

 

복수개의 옵션을 단계적으로 선택하기엔 이런 방법이 최고다.

 

이 방법을 사용할때 Next 나 Back 버튼을 사용하는 것도 어려운 것도 아니지만 귀찬은건 사실이다.

 

특히 옵션이 매우 큰(이미지를 선택하는 등등)것이라면, 마우스의 이동 반경이 엄청나게 커지게 된다. 그래서 더블클릭을 이용하여 다음단계 로 이동을 하게 하는데 이게 생각보다 쉽지 않더라;;

 

사실 다른 기능들 중에서 머 간단하게 버튼 이벤트에서 발생하더라 하면, 그 버튼이벤트 함수를 그대로 호출하면 된다.

 

여기서 사용되는 버튼이벤트 함수는 OnWizardNext() 나 OnWizardBack() 등이 있다.

 

이 함수를 그대로 호출하기도 편한게 별다른 매개변수가 없기 때문이다.

 

호출을 해보자!

 

OnLButtonDblclk() 함수에서 어떤 루틴에 의해 선택된 것이 존재한다면, 다음 으로 넘어가기 위하여

 

OnLButtonDblclk()

{

....어떤루틴들....

OnWizardNext():

}

 

이 구문을 디버그로 따라가보면 분명히 제어가 호출이 되는 것을 확인 할 수 있다.

 

하지만 아무리 이 함수를 호출하고 제대로 내부 API 변수에 들어가더라도 다음으로 절대 않넘어 간다 .ㅡ,.ㅡ;

 

않먹힌다는 것이다.

 

인터넷에서 보고 적용 해보았는데 매우 잘된다.

 

OnWizardNext() 함수 내부에 두줄이면 충분하다.

 

OnWizardNext()

{

((CPropertySheet*)GetParent())->SetActivePage(PageNum);

return 1;

}

 

간단하게 활성화 하고 싶은 페이지 번호를 PageNum 에 넣어주면 해당 패이지로 이동이 된다.

 

이때  returnvalue 가 1인걸 놓치지 말자.

 

Back 역시 동일한 방법이다 .

 

한결 옵션을 선택하기가 편해졌다.

 

-_- 지금은 마지막으로 OnWizardFinish() 함수가 문제이다.

 

이녀석은 버튼이 눌러져 메시지 함수가 호출이 되면 내부에 유저 코드를 거쳐 내부적으로

 

OnWizardFinishEx() 함수 호출을 하고 다시 CPreperty::OnWizardFinisho()  함수를 호출하여 리턴값을 정하고! 해당 모달리스나 모달 Dialog 를 종료시킨 후 이 프로퍼티 시트를 생성하고 호출했던 부분의 다음 라인으로 제어가 넘어가게 된다.

 

근데 이 모든걸 동일하게 버튼으로 하던 더블클릭으로 하던 루틴이 같지만 Dialog가 죽지도 않고 제어가 이동하지도 않는다.ㄱ-

 

ㅠㅠ 아직도 이 문제를 해결하려 발버둥 치고 있다. 혹시 아는 님은 덧글을 반드시 좀...부탁합니다~