작업표시줄에 프로그램 버튼을 우클릭하면 대게 6개의 메뉴가 있습니다.
이전 크기로 / 이동 / 크기 조정 / 최소화 / 최대화 / 닫기
그런데 Delphi,C++Builder를 포함해서 VCL로 만든 프로그램은
작업표지줄에 버튼을 우클릭하면 3개 밖에 뜨지 않습니다.
이전 크기로 / 최소화 / 닫기
[VCL에서 메인폼의 작업표시줄 시스템메뉴가 3가지인 이유]
그이유를 간단하게 설명하면
작업표시줄에 버튼은 메인폼이 아니라
Application->Handle의 버튼인데
Application->Handle은 CreateWindow 한뒤에
SystemMemu에서 "이동 / 크기 조정 / 최대화 " 3가지 메뉴를 삭제했기 때문입니다.
그리고 실제로 저 메뉴를 클릭하면
Application->Handle로 메세지가 가지 않고
Application객체에서는 그 메세지를 그대로 Application->MainForm으로 전달하도록 되어있죠
[삭제한 Application의 System Menu 복구]
여튼 오늘 하고자 하는것은
삭제한 메뉴3개를 다시 복구 하려고 하는것입니다.
TApplication 클래스의
TApplication.CreateHandle; 함수에서
CreateWindow하고 또 메뉴를 삭제하는데
TApplication클래스를 상속받아 새로 Application를 만드는 방법으로도 가능하겠지만...
서브클래싱을 이용한 방법입니다.
이는 오늘 델마당 강좌팁게시판에 ep12님께서 올려주신것인데
http://www.delmadang.com/community/bbs_view.asp?bbsNo=3&bbsCat=0&st=&keyword=&indx=409114&keyword1=&keyword2=&page=1
ep12님께서 올린것은 "이동"메뉴만 복구 했는데..
제가 그걸 다시 수정해서 세가지 메뉴다 복구 했습니다.
델파이로 되어있는데 C++Builder에는 delphi컴파일러도 같이 포함되어있기때문에
그냥 프로젝트에 포함만 하면 됩니다.
코드나갑니다.
unit _SysCommand;
interface
implementation
uses
Forms,
Windows,
Messages;
var
pOldWndProc :Integer;
hSysMenu :HMENU;
function NewWndProc(hWin:HWND;uMsg,wPar,lPar:DWORD) :DWORD; stdcall;
begin
if uMsg=WM_SYSCOMMAND then
case wPar of
SC_MOVE,SC_SIZE,SC_MAXIMIZE : begin
Result :=0;
if Assigned(Application.MainForm) then
Application.MainForm.Perform(uMsg,wPar,lPar);
EXIT;
end;
end;
Result :=CallWindowProc(Pointer(pOldWndProc),hWin,uMsg,wPar,lPar);
end;
initialization
begin
pOldWndProc :=GetWindowLong(Application.Handle,GWL_WNDPROC);
SetWindowLong(Application.Handle,GWL_WNDPROC,Integer(@NewWndProc));
hSysMenu :=GetSystemMenu(Application.Handle, FALSE);
InsertMenu(hSysMenu,0,MF_STRING,SC_MOVE,'이동(&M)');
InsertMenu(hSysMenu,0,MF_STRING,SC_SIZE,'크기 조정(&S)');
InsertMenu(hSysMenu,0,MF_STRING,SC_MAXIMIZE,'최대화(&X)');
SetWindowLong(Application.Handle,GWL_STYLE,GetWindowLong(Application.Handle,GWL_STYLE) or WS_MAXIMIZEBOX or WS_THICKFRAME);
end;
end.
그럼 좋은 하루되세요..
앗참 위코드는 델7 BCB6에서 테스트 한것입니다.
BCB2007을 보니 메인폼이 바로 작업표시줄(TaskBar)에 나타나도록 하는 기능이 있네요
SetApplicationMainFormOnTaskBar(Application, true);
그럼..