2012-04-18 9 views
5

Gibt es eine einfache/clevere Möglichkeit, das Standard-Windows-TEdit-Menü in dieses TRichEdit zu laden?Verwenden des TEdit-Kontextmenüs für TRichEdit

Ich weiß, dass ich ein einfaches Menü erstellen konnte, um das TEdit-Menü für die einfachen Operationen wie Kopieren/Einfügen usw. (Example) zu simulieren, jedoch würde ich auch die fortgeschritteneren Menüoptionen wie die Unicode-Optionen beibehalten wollen. Lesereihenfolge und die gleichen Lokalisierungszeichenfolgen verwenden.

Edit: Ich habe festgestellt, ein possible lead (versucht es herauszufinden, wie ich nicht ein MFC-Experte bin) ...

+0

schön, ich weiß, dass ich die Forschung über diese früher gemacht habe, und ich denke, dass in Verbindung mit einer SO Frage. –

+0

@Andreas, und eine Schlussfolgerung: -? Meine Vermutung ist, dass diese Menüs aus Windows-Basisklassen stammen. – TLama

+0

TLama, yeah, ich glaube nicht, dass es einen 'dokumentierten' Weg gibt, dieses Menü zu erreichen. –

Antwort

8

Basierend auf der „möglichen lead“ und ein wenig MSDN, ich kam mit eine mögliche Lösung. Ich kann das Lesefehlerproblem (und die Unicode-Optionen) immer noch nicht beheben. Es scheint, dass es für RichEdit anders als für Edit funktioniert, und das Festlegen oder Abrufen des WS_EX_RTLREADING-Flags funktioniert nicht wie erwartet. Wie auch immer, hier ist der Code:

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; 

würde Jedes Feedback :)

Verwandte Themen