임프랍니다~
매일같이 아침마다 올라오는.... 오늘의...(둥둥둥둥~~~~~) 팁! ^^;;;
오늘의 팁은, 메인폼이 아닌 폼을 작업표시줄에 따로 표시하기 입니다.
예를 들어서, 넷스케입 같은 경우 넷스케입 네비게이터와 그 외의 윈도우들이
작업표시줄에 따로 표시되지요? 그런데 실제로 어플리케이션은 하나랍니다.
가끔가다 이러한 테크닉이 필요할때가 있는데.. 보통 그렇게 생각하죠,
작업표시줄에 표시되는 아이콘은 모두 하나의 어플리케이션이어야 한다고..
보조적인 폼들도 작업표시줄에 따로 표시가능하답니다.
방법은 TWinControl의 멤버인 CreateParams() 함수를 오버라이드하는 것입니다.
이 함수는 모든 윈도핸들을 가지는 컨트롤(실제로 하나의 윈도우지요)가 화면에
나타날때의 특성이나 모양등등을 결정합니다. api를 조금이라도 공부해보신 분은
api에서 사용하는 CreateWindow()함수에 넘겨주는 인자들이 아주 복잡하다는 거
기억하시지요? 내부적으로 CreateParams() 함수는 CreateWindow()함수에 넘겨줄
인자들을 결정하는 역할을 한답니다. 관심있으신 분은 Controls.hpp, .pas를
뒤져보시면 되겠구요..
어쨌든, 이 함수를 오버라이딩 하면서 윈도우의 스타일을 세팅해주면 됩니다.
소스를 봅시다.
C++ 코드
void __fastcall TForm2::CreateParams(TCreateParams &Params)
{
TForm::CreateParams(Params);
Params.ExStyle = WS_EX_APPWINDOW;
}
// 델파이 코드
procedure TForm2.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams(Params);
Params.ExStyle := WS_EX_APPWINDOW;
end;
이것을 두번째 폼, 그러니까 서브폼의 소스에 추가해주고요..(물론 이 폼이름이
Form2일때를 가정한겁니다.) 그리고 이 폼의 헤더엔 다음과 같이 추가해줘야 겠죠.
C++ 코드 : 헤더의 폼 클래스에 추가
protected:
void __fastcall CreateParams(TCreateParams &Params);
델파이 코드 : interface 섹션의 폼 클래스에 추가
protected
procedure CreateParams(var Params: TCreateParams); override;
이렇게 하고 실행해보면... 놀랍게도! 두번째 폼이 작업표시줄에 나온답니다!
놀랍지요? ^^;;;
근데.. 알고보면 이 팁은 많이 알려져 있는거랍니다. 거기다.. 약간의 문제도
있어요.. 메인폼을 미니마이즈 해버리면 두번째 폼은 작업표시줄에서 사라져요~
그리고 다시 메인폼을 보이게 하면 두번째 폼도 작업표시줄에 나타나고..
이건 두번째 폼의 윈도 핸들로서의 오너(vcl에서의 오너가 아닙니다)가 메인폼이기
때문입니다. 그래서 메인폼이 안보이는 상태가 되면 소유된 모든 윈도우들을
숨겨버리거든요. 그래서... 문제점이 있으면 풀어봐야죠? ^^
방법은, 역시 CreateParams()에서 두번째 폼의 오너를 바꿔버리면 됩니다.
가장 쉽게는, 데스크탑을 오너로 잡는게 좋겠죠.
소스를 봅시다!
C++ 코드
void __fastcall TForm2::CreateParams(TCreateParams &Params)
{
TForm::CreateParams(Params);
Params.ExStyle := WS_EX_APPWINDOW;
Params.WndParent = GetDesktopWindow();
}
델파이 코드
procedure TForm2.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams(Params);
Params.ExStyle := WS_EX_APPWINDOW;
Params.WndParent := GetDesktopWindow;
end;
헤더의 프로토타입은 동일합니다.
이렇게 하면, 메인폼이 최소화되었을때도 두번째폼은 작업표시줄에 남아있답니다!
조~쵸~? ^^;;;;;
참고로 말씀드리면... 그냥 참고입니다.. 서브폼이 아닌 메인폼에다가 위와 같이
CreateParams()를 오버라이딩해서 스타일을 WS_EX_APPWINDOW로 잡아주면...
헉~! 작업표시줄에 프로젝트 자체와 메인폼 항목이 따로 생겨버린답니다!
이유는... 아시는 분은 다 아시겠지만, vcl에서 메인폼은 실제 어플의 메인 윈도우가
아니기 때문이죠. 그래서 메인폼도 실제의 메인 윈도우와 분리가 가능한겁니다.
뭐.. 관심있으신 분만 관심 가지시면 될 문제구요.
이 팁은.. 어딘지 기억이 가물거리는데.. 인터넷의 어느 개인 빌더 홈페이지에서
참고한 내용입니다.
그럼, 도움되시길 바라면서, 이만...
독립문에서 임펠리테리였습니다.
그런데 Delphi2007부터 비스타를 지원에서 프로젝트 파일(*.dpr)에 다음 한줄이 있어야 원할합니다.
없으면 메인폼을 원래로 복귀하지를 않는 군요
Application.MainFormOnTaskbar := True;
아마도 작업표시줄이 비스타부터 바뀐때문인듯합니다.