처음에 나오는 부분은 Late 인가 하는 어떤 에디터 편집기 부분이었습니다. 물론 단순히 텍스트만 취급하느냐 하면 그 것도 아니고 이미지, 이미지 와 텍스트의 합성등 흔히 Windows 환경에서 볼 수 있는 Rich EditorBox 와 그나마 비슷하다고 할까요? 문단 형식지정은 물론이고 다양한 기능을 지원하는 에디터를 예로 들어 구현이 아닌 단순한 구현에서 설계의 예시를 간략하게나마 보여주더군요.
이 부분을 읽다보니 제가 예전에 프로젝트를 하면서 사용했던 방식과 아주 비슷하다는 생각이 들더군요. 완전히 동일한 것인지는 모르겠지만 어차피 디자인 패턴이라는 것이 수정을 적게 하기위한 코딩방법들이 모여 만들어진것이다보니 어느정도 비슷하다는 생각이 들더군요.
그래서 프로젝트를 하면서 사용했던 방식을 간략하게 구현을 해봤습니다. 내용은 자기가 닫힐 때, 별 어려운 방법을 사용하지 않고 부모같이 지정했던 창을 숨기거나 보여주는 창입니다. 이 것이 어디에 사용되었냐면 버튼을 누르고 검색을 하게 되었을 때 검색을 선택하거나, 다른 부분에서 해당 정보를 선택했을 때 자기는 닫히면서 부모는 보여주고 그런 형태였죠. 문제는 ShowDialog를 쓰려니 최상위 다이얼로그가 아니었기 때문에 에러가 발생했기 때문에 Show로 처리하다 보니 그랬습니다.
위와 같이 DlgBase 를 버튼을 클릭했을 때 나타나도록 수정합니다. 단순히 ShowDialog 로 처리하는 것은 바로 그 다음 처리를 할 수도 있기 때문에 그냥 Show로 처리를 해봅니다.
OwnForm 이라는 Property로 부모(?)로 지정할 폼을 설정할 수 있도록 한 다음 DlgBase에 버튼을 하나 배치하여 그 버튼을 클릭하면 ShowDlg라는 함수를 호출하도록 하였습니다. 물론 ShowDlg는 가상함수로 되어있어 서브클래스에서 override 할 수 있죠. 그리고 자기의 Visible이 바뀔 때, OwnForm의 Visible또한 바꾸어 줍니다.
그런 다음 DlgChild를 ShowDlg override 하여 그냥 단순히 메시지를 뿌리도록 합니다. 계속된 중첩도 가능하나, 버튼을 눌러서 종료된 시점과 자식창이 닫혔을 때, 부모에게 통지하여 모드를 설정할 수 있도록 하여야 2번 이상 들어갔을 때, 제일 첫 번째의 창이 다시 보이지 않기 때문에 단순화 한 이 코드로는 간단하게 간만 보도록 하겠습니다.
이렇게 되면 작동이 어떻게 되느냐 하면 일단 프로그램을 실행 시켰을 때, 창이 하나 보이고 가운데 버튼이 있습니다. 그런데 버튼을 클릭하면 DlgBase 창이 뜨게 되지요.
그런데 DlgBase 에서 존재하는 버튼을 또 클릭하게 되면 DlgBase 창은 사라지고, DlgChild1 창이 나타나게 됩니다. 물론 DlgChild1에서 원하는 작업을 수행하고 마친 뒤, 창을 닫게되면 DlgChild1창이 사라짐과 동시에 숨겨져있던 DlgBase창이 다시 나타나게 됩니다. 물론 닫는 다는 이벤트를 여기서는 구현하지 않았기 때문에 버튼을 누르게 되면 액션으로 Hide를 하는 작업으로 진행을 하여야 합니다.
약간 뭔가 불편한 것 같은 방식으로 제가 구현을 한 것 같지만 나름대로 코드의 큰 수정 없이 많은 폼들을 잘 컨트롤 한 것 같습니다. 사실 폼마다 따로따로 코드를 작성하여 작동을 하도록 만들었다면 정말 많이 복잡해졌을 겁니다. 왜냐하면 폼이 정말 많은 것은 아니지만 기능상 사소한 불편함이 발생하지 않도록 여러가지 케이스를 고려해주어야 했기 때문이죠.
이 것 보다 더 좋은 방식이 없지 않을거라는 것 또한 생각을 하고는 있는데, 언젠간 웹 서핑을 하다가 혹은 코딩의 문제점을 해결하기 위한 검색을 하다 볼 수도 있겠죠^^. 그 땐 더욱 확실하게 좋은 디자인을 제 것으로 만들어 보고 싶습니다. 이상한 예지만 복잡한 상황에서 도움이 되길 바라며 이만 글을 줄이겠습니다.
"Program" 분류의 다른 글
| \r\n 과 \n 차이 때문에 생기는 문제 (0) | 2008/04/15 |
| Bitmap Filtering - 비트맵 필터링 (0) | 2008/04/04 |
| PangCal - 팡야계산기 (0) | 2008/02/16 |
| War 3 Axis - 워크래프트3 후킹 프로그램 (0) | 2008/02/16 |


LinToWin.rar









댓글을 달아 주세요