2012-04-18 39 views
5

Có cách đơn giản/thông minh nào để tải menu Windows TEdit chuẩn vào trong TRichEdit này không?Sử dụng menu ngữ cảnh TEdit cho TRichEdit

Tôi biết rằng tôi có thể tạo một menu đơn giản để mô phỏng menu TEdit cho các thao tác đơn giản như sao chép/dán vv (Example), tuy nhiên tôi cũng muốn giữ các tùy chọn menu nâng cao hơn như tùy chọn unicode, thứ tự đọc và sử dụng cùng một chuỗi địa phương hóa.

Edit: Tôi đã tìm thấy một possible lead (cố gắng tìm nó ra như tôi không phải là một chuyên gia MFC) ...

+0

Tôi biết tôi đã thực hiện nghiên cứu về vấn đề này trước đó, và tôi nghĩ rằng đó là liên quan đến một câu hỏi SO. –

+0

@Andreas và kết luận: -? Tôi đoán là các menu đó đến từ các lớp Windows cơ sở. – TLama

+0

TLama, vâng, tôi không nghĩ rằng có bất kỳ cách nào được 'tài liệu' để có được trình đơn này. –

Trả lời

8

Dựa trên "có thể dẫn" và một chút của MSDN, tôi đã đưa ra một giải pháp có thể. Tôi vẫn không thể giải quyết vấn đề về đọc sách (và các tùy chọn unicode). Dường như nó hoạt động khác với RichEdit so với Chỉnh sửa, và đơn giản là thiết lập hoặc nhận cờ WS_EX_RTLREADING không hoạt động như bị cắt xén. Dù sao, đây là mã:

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; 
    // IsRTL: Boolean; 
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]); 

     // IsRTL := GetWindowLong(re.Handle, GWL_EXSTYLE) and WS_EX_RTLREADING <> 0; 
     // EnableMenuItem(hmnu, IDM_RTL, Enables[True]); 
     // CheckMenuItem(hmnu, IDM_RTL, Checks[IsRTL]); 

     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; 

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

Bất kỳ thông tin phản hồi sẽ được tốt đẹp :)

Các vấn đề liên quan