안녕하세요. 천리안 프로그래머 포럼 C++Builder 담당자 임펠리테리입니다.
음.. 정확한 답변은 아니라고 생각하지만.. 일단 썰을 풀어보겠습니다.
WM_SYSCOMMAND를 호출했는데 작업표시줄로 들어가지 않고 화면 하단에 최소화된 상태
로 남아버리죠? 근데 이런 꼴을.. 어디선가 보신듯 하다는 생각은 안해보셨는지? 흐~
바로 MDIChild폼일 경우에 요렇게 미니마이즈되죠. 아시겠죠? 그럼.. 거꾸로 생각을
해보면.. 프로젝트의 메인폼으로 보이는 것이 실제로는 메인폼이 아니라는 것을 유추
해 볼 수 있습니다. 델파이나 빌더에서 상당히 웃기는 문제인데.. 여러가지 이유로
화면에 보이는 메인폼은 실제의 메인윈도우가 아닙니다. 저도 전에 잠깐 POD를 볼 일
이 있어서 줏어들은겁니다만... ^^;; 잠깐 지나가다 본거라 자세한 내용은 기억이 안
나구요.. 그 사실 하나만 기억나는군요. 어쨌든.. 실제의 메인 윈도우는 항상 메인폼
의 뒤에 숨겨져 있습니다. 결과적으로 윈도우 시스템의 입장에서는 빌더나 델파이에서
메인폼이랍시고 지정한 윈도우는 실제의 메인 윈도우가 아니니까, 거기다가 미니마이
즈를 주니 당연히 작업표시줄로 들어가지 않는겁니다. 알고보면 이유는 간단하죠?
VCL에서는 이들 WM_SYSCOMMAND같은 모든 메시지를 중간에서 다 가로채서 마치 메인폼
인척 미니마이즈를 하지만.. 표가 날 수밖에 없는 것이.. 빌더나 델파이는 미니마이즈
에니메이션, 그러니까 미니마이즈 버튼을 눌렀을때 아래로 차차 줄어들면서 작업표시
줄로 들어가는 화려한(?) 모습을 볼수가 없지 않습니까.
지금 제가 너무 피곤해서 말이 좀 꼬이네요. 어쨌든, 이런 문제가 있으니, 다음과 같
이 코딩을 해서는 그런 결과밖에 볼수가 없습니다.
DefWindowProc(Handle, msg.Msg, msg.WParam, msg.LParam);
그래서... 쩝... 답변을 드리려고 잔머리를 좀 굴리다보니.. 핸들에다 어플리케이션의
핸들을 집어넣으면 어떨까.. 싶더군요. 어플리케이션의 핸들은 메인윈도우의 핸들과
동일하니까요. 그래서 해봤습니다.
DefWindowProc(Application->Handle, msg.Msg, msg.WParam, msg.LParam);
잘 됩니다.. 미니마이즈 에니메이션도 좀 어색하나마 볼 수 있고.. 근데.. 하하~
지금 원하시는 동작은 곤란합니다. 왜냐하면.. 흐흐~ 앞에서 말씀드렸다시피 작업표시
줄로 들어간 프로그램의 캡션은 실제 윈도우의 캡션이고.. 바꿔준 캡션은 가짜 메인폼
의 캡션인데.. 실제로 해본 결과를 볼때, 이 캡션을 바꿔주는 동작조차도 vcl에서 미
니마이즈될때의 시스컴맨드를 가로채어서 한 것인가 보더군요. 그래서 작업표시줄에
들어간 프로그램의 캡션은 이전에 바꾸어주었어도 원래의 캡션 그대로 있는겁니다.
요건 좀 문제가 되겠죠? 그래서... 캡션을 바꾸는 것도 API 함수를 사용하여 해줘야
한다는 겁니다. 윈도우 타이틀을 바꿔주는 함수가 뭐였는지 가물거리는데... ^^;;;;
어쨌든 그 함수를 쓰시면 되겠습니다.
좀더 원초적인 해결방법이 있을지 모르겠습니다만, 일단 저는 이렇게 해법을 찾아봤습
니다.
그럼, 도움되시길 바라면서, 이만...
독립문에서 임펠리테리였습니다.
(cbuilder, skyhi18, cbuilder@thrunet.com)
|