본문 바로가기
delphi

TRichEdit에 컨텍스트 메뉴 활성화 방법

by 천지조율 2024. 8. 8.

TRichEdit 컴포넌트는 기본적으로 마우스 오른쪽 버튼 클릭 시 기본 컨텍스트 메뉴(실행 취소, 복사, 붙여넣기 등)가 활성화되지 않습니다. 이를 해결하기 위해 TRichEdit에 컨텍스트 메뉴를 활성화하는 방법을 자세히 알아보겠습니다.

TRichEdit 컨텍스트 메뉴 활성화를 위한 세팅

컨텍스트 메뉴를 활성화하려면 몇 가지 설정이 필요합니다. 아래 코드는 TRichEdit에 컨텍스트 메뉴를 활성화하기 위한 설정입니다.

컨텍스트 메뉴 활성화를 위한 코드

procedure RichEditPopupMenu(re: TRichEdit);
const
  IDM_UNDO   = WM_UNDO;
  IDM_CUT    = WM_CUT;
  IDM_COPY   = WM_COPY;
  IDM_PASTE  = WM_PASTE;
  IDM_DELETE = WM_CLEAR;
  IDM_SELALL = EM_SETSEL;
  IDM_RTL    = $8000; // WM_APP

  Enables: array[Boolean] of DWORD = (MF_DISABLED or MF_GRAYED, MF_ENABLED);
  Checks: array[Boolean] of DWORD = (MF_UNCHECKED, MF_CHECKED);
var
  hUser32: HMODULE;
  hmnu, hmenuTrackPopup: HMENU;
  Cmd: DWORD;
  Flags: Cardinal;
  HasSelText: Boolean;
  FormHandle: HWND;
begin
  hUser32 := LoadLibraryEx(user32, 0, LOAD_LIBRARY_AS_DATAFILE);
  if (hUser32 <> 0) then
  try
    hmnu := LoadMenu(hUser32, MAKEINTRESOURCE(1));
    if (hmnu <> 0) then
    try
      hmenuTrackPopup := GetSubMenu(hmnu, 0);

      HasSelText := Length(re.SelText) <> 0;
      EnableMenuItem(hmnu, IDM_UNDO,   Enables[re.CanUndo]);
      EnableMenuItem(hmnu, IDM_CUT,    Enables[HasSelText]);
      EnableMenuItem(hmnu, IDM_COPY,   Enables[HasSelText]);
      EnableMenuItem(hmnu, IDM_PASTE,  Enables[Clipboard.HasFormat(CF_TEXT)]);
      EnableMenuItem(hmnu, IDM_DELETE, Enables[HasSelText]);
      EnableMenuItem(hmnu, IDM_SELALL, Enables[Length(re.Text) <> 0]);

      FormHandle := GetParentForm(re).Handle;
      Flags := TPM_LEFTALIGN or TPM_RIGHTBUTTON or TPM_NONOTIFY or TPM_RETURNCMD;
      Cmd := DWORD(TrackPopupMenu(hmenuTrackPopup, Flags,
        Mouse.CursorPos.X, Mouse.CursorPos.Y, 0, FormHandle, nil));
      if Cmd <> 0 then
      begin
        case Cmd of
          IDM_UNDO:   re.Undo;
          IDM_CUT:    re.CutToClipboard;
          IDM_COPY:   re.CopyToClipboard;
          IDM_PASTE:  re.PasteFromClipboard;
          IDM_DELETE: re.ClearSelection;
          IDM_SELALL: re.SelectAll;
          IDM_RTL:; //  
        end;
      end;
    finally
      DestroyMenu(hmnu);
    end;
  finally
    FreeLibrary(hUser32);
  end;
end;

이 코드를 통해 TRichEdit에 기본 컨텍스트 메뉴를 추가할 수 있습니다.

OnContextPopup 이벤트 핸들러 작성

컨텍스트 메뉴가 활성화되도록 TRichEdit의 OnContextPopup 이벤트 핸들러를 작성해야 합니다.

이벤트 핸들러 코드

procedure TForm1.RichEditEx1ContextPopup(Sender: TObject; MousePos: TPoint; var Handled: Boolean);
begin
  RichEditPopupMenu(TRichEdit(Sender));
  Handled := True;
end;

이 코드를 통해 TRichEdit 컴포넌트에 오른쪽 클릭 시 컨텍스트 메뉴가 나타나도록 할 수 있습니다.

 

결론

TRichEdit 컴포넌트에 기본 컨텍스트 메뉴를 활성화하는 방법을 알아보았습니다. 이를 통해 다양한 애플리케이션에서 텍스트 편집 기능을 향상시킬 수 있습니다. 이 코드를 활용하여 사용자에게 더 나은 텍스트 편집 환경을 제공할 수 있습니다.