C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 팁&트릭
C++Builder Programming Tip&Tricks
[825] [Win32] 시스템 메뉴 내맘대로 3 - 작업표시줄 메뉴 원래대로
장성호 [nasilso] 9072 읽음    2008-11-26 17:22
작업표시줄에 프로그램 버튼을 우클릭하면 대게 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.


그럼 좋은 하루되세요..
장성호 [nasilso]   2008-12-01 15:02 X


앗참 위코드는 델7 BCB6에서 테스트 한것입니다.

BCB2007을 보니 메인폼이 바로 작업표시줄(TaskBar)에 나타나도록 하는 기능이 있네요

SetApplicationMainFormOnTaskBar(Application, true);
그럼..

+ -

관련 글 리스트
825 [Win32] 시스템 메뉴 내맘대로 3 - 작업표시줄 메뉴 원래대로 장성호 9072 2008/11/26
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.