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
[800] [Controls] TEdit나 TMemo에 win32 의 디폴트 Popup메뉴 띄우기
장성호 [nasilso] 6888 읽음    2008-09-11 11:18
제목을 의아하게 생각하실텐데요

대게는
TEdit나 TMemo에 PopupMemu를 설정하지 않으면 win32 디폴트 Popup메뉴가 뜹니다.
실행취소,잘라내기,복사,붙여넣기,삭제,모두선택....등의 메뉴가 뜨죠

그런데 TEdit에 PopupMenu를 설정하지 않아도
Win32의 Default 팝업메뉴가 뜨지 않는경우가 있습니다.

어떤경우냐면?
Edit의 Parent들중에 (TPanel , TForm , TGroupBox 등등....)  PopupMenu가 설정되어있으면
가장가까운 Parent의 Popupmenu가 뜹니다.


예를들어

TEdit컨트롤이 아래와 같이 배치되어있가고 가장하구
    ( TForm1->Panel1->GroupBox1->Edit1  )

Panel1의 PopupMenu에 PopupMenu1이 설정되어있을때
Edit1에서 마우스 오른쪽을 클릭하면 Panel1의 Popupmenu가 뜹게됩니다.


대게 컨테이너 컨트롤에는 PopupMenu를 잘 설정하지 않기때문에
이런 현상이 별로 드러나지 않는것 같습니다.

하여간 이런경우에
(Edit나 Memo에는 PopupMenu가 설정되어 있지 않는데 , Parent컨트롤중에 PopupMenu가 설정되어있는경우에)
EDIT의 Default 팝업메뉴를 띄워주려면 어떻게 해야할까요?


방법1.
  Parent의 PopupMenu를 모두 빼주면 됩니다.
  Edit를 올려놓은 Panel에 PopupMenu가 필요한데 빼면 어떻게 뛰우냐구요

  Parent컨트롤에 PopupMenu를 빼고도 해당 Controld에서 PopupMenu를 띄우는 방법은?
  1.1 해당 Control의 OnMouseDown에  PopupMenu를 설정하고 OnMouseUp에 PopupMenu를 빼버립니다.
 
void __fastcall TForm1::Panel1MouseDown(TObject *Sender,
      TMouseButton Button, TShiftState Shift, int X, int Y)
{
    Panel1->PopupMenu=PopupMenu1;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Panel1MouseUp(TObject *Sender, TMouseButton Button,
      TShiftState Shift, int X, int Y)
{
    Panel1->PopupMenu=NULL;
}


  1.2 또는 해당 Parent컨트롤의 OnMouseUp에서 직접 Popupmemufmf 띄워줍니다.
void __fastcall TForm1::Panel1MouseUp(TObject *Sender, TMouseButton Button,
      TShiftState Shift, int X, int Y)
{
    PopupMenu1->PopupComponent=(TComponent *)Sender;
    PopupMenu1->Popup(Mouse->CursorPos.x,Mouse->CursorPos.y );
}


그런데 이방법은 Parnet가 많을경우(parnet에 parent에 ....) 좀 거시기 하죠



방법2. Win32 Default-Window-Procedure를 직접 호출
 
   TEdit나 TMemo는 win32컨트롤등은 EDIT를 슈퍼클래싱한것입니다.
   그래서 TEdit에서는 메세지가 오면 프로시져에서 처리할것은 처리하고
   나머지는 오리지날 win32프로시져에 넘줍니다.

   이 원리를 이용해서 EDIT의 default-window-procedure에 WM_CONTEXTMENU를 보내줍니다.


//***.h에
class TEdit : public Stdctrls::TEdit
{
  public:
    void *__fastcall GetDefEditProc()
    {
        return DefWndProc;
    }
};
#define TEdit                ::TEdit

class TForm1 : public TForm
{
 ...

};

// ***.cpp 에서

void __fastcall TForm1::Edit2ContextPopup(TObject *Sender,
      TPoint &MousePos, bool &Handled)
{
    Handled=true;
    CallWindowProc((FARPROC)Edit2->GetDefEditProc(),Edit2->Handle,WM_CONTEXTMENU,0,MAKELONG(Mouse->CursorPos.x,Mouse->CursorPos.y));
}



//Delphi에선

type
  TEdit = class(Stdctrls.TEdit);


  TForm1 = class(TForm)
    ...

implementation

procedure TForm1.Edit1ContextPopup(Sender: TObject; MousePos: TPoint;
  var Handled: Boolean);
begin
  Handled:=true;
  CallWindowProc(Edit1.DefWndProc,Edit1.Handle,WM_CONTEXTMENU,0,MAKELONG(Mouse.CursorPos.X,Mouse.CursorPos.Y));
end;





많이 필요할것 같지는 않는데, 그래도 알고있으면 좋을듯 해서 올려봅니다.


그럼..

+ -

관련 글 리스트
800 [Controls] TEdit나 TMemo에 win32 의 디폴트 Popup메뉴 띄우기 장성호 6888 2008/09/11
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.