임프랍니다..
오늘도.. 에구.. 바쁜 일에 쫓기다보니.. 간단한 팁 하나만 올리죠.
오늘은.. 캡션바의 오른쪽 끝에 나타나는 버튼들중 종료버튼(X버튼)을 동작하지
않도록 하는 간단한 팁입니다.
사실은.. 이건 무지 간단한건데도.. 흑~ 컨닝입니다. 쩝~
출처는 Tom's Builder Page(
http://members.xoom.com/demjen/builder/)입니다.
이 사이트는 몇가지 팁들과 유용한 컴퍼넌트들의 소스를 제공하고 있습니다.
한번씩 들러서 살펴보시기 바랍니다.
유명한 IvoryDraw(다이렉트X 컴퍼넌트죠)도 이 사이트의 주인 아찌 작품입니다.
그럼 본론으로 들어가서.. 어케 X 버튼을 헤까닥 동작 안하게 만드느냐?
방법은, 역시 어제처럼 무지 간단합니다.
윈도우컨트롤이 create될때는 내부적으론 CreateWindowEx()를 호출하게 되는데,
이 함수는 윈도우를생성하는 api 함수죠. 그리고 CreateParams()라는 함수가
윈도우 생성시 그 윈도우에 팁?특성을 전달하게 됩니다.
이 CreateParams()에서는 단 하나의 인자만 받는데, TCreateParams 라는
구조체입니다. 그리고 이 구조체의 WindowClass 멤버는 사실상 api에서 윈도우를
생성할때 쓰는 바로 그 윈도우 클래스가 되구요, 이 WindowClass의 멤버중
style 에 특정 값을 비트연산함으로서 여러가지 윈도우의 특성을 제어할 수
있습니다.
우리가 지금 주목할 것은 이 스타일로 지정할 수 있는 값들 중 CS_NOCLOSE이죠.
윈도우 클래스의 스타일에 CS_NOCLOSE가 포함되면, 우리가 원하는 결과를 얻을
수 있습니다.
그럼, 어떻게 CreateParams()로 전달되는 윈도우클래스의 내용을 중간에
가로채서 값을 변경시켜주는가?
여기서 사용할 수 있는 가장 좋은 해결책은 오버라이딩입니다.
폼클래스의 CreateParams()를 오버라이딩하면, 가만히 입만 벌리고 있으면
TCreateParams 가 인자로 전달되 입안으로 뚝 떨어집니다. 그럼 이렇게
전달받은 TCreateParams의 멤버중 윈도우클래스의 스타일을 적당히 조작한 후,
원래의 CreateParams()를 호출하면 되는거죠.
원래의 함수를 호출하려면, 베이스클래스인 TForm을 명시하여
TForm::CreateParams(Params) 이렇게 하면 되겠죠?
그럼.. 이제 소스를 봅시다.
void __fastcall TForm1::CreateParams(TCreateParams& Params)
{
TForm::CreateParams(Params);
Params.WindowClass.style := CS_NOCLOSE;
}
물론 이 오버로딩한 CreateParams()는 폼 클래스 내에 선언해줘야죠.
이걸로 만사 땡입니다. 컴파일해서 실행해보면, 정말 X 버튼이 disable되어있고,
눌러도 아무일도 생기지 않습니다.
이때, 키보드로 알트+F4를 눌러도 종료가 되지 않습니다.
오늘의 팁은 정말 간단했지요?
내용은 간단했지만.. 가능하면 단순한 팁 하나를 갈쳐드리는 것보다는
그 뒷면에 깔린 배경지식을 알려드리려고 애쓰는 임프였습니다.
그런데.. 제대로 이해가 되셨나요? ^^;;;;
독립문에서 임펠리테리였습니다.