kcontrols这个控件TKMemo可以使用rich功能,但有个致命问题是在linux不能使用中文输入法。
今天尝试修复这个Bug。
打开kcontrols\source\kmemo.pas
添加红色代码:
今天尝试修复这个Bug。
打开kcontrols\source\kmemo.pas
添加红色代码:
{ @abstract(This file is part of the KControls component suite for Delphi and Lazarus.) @author(Tomas Krysl) Copyright (c) 2020 Tomas Krysl<BR><BR> <B>License:</B><BR> This code is licensed under BSD 3-Clause Clear License, see file License.txt or https://spdx.org/licenses/BSD-3-Clause-Clear.html. } {$ifdef linux} {$define WITH_GTK2_IM} {$endif} unit kmemo; // lowercase name because of Lazarus/Linux {$include kcontrols.inc} {$WEAKPACKAGEUNIT ON} interface
在1817行添加红色代码行:
TKCustomMemo增加输入法消息处理:
procedure WMImeComposition (var Message: TLMessage); message LM_IM_COMPOSITION;
procedure WMCut(var Msg: TLMessage); message LM_CUT; {$IFNDEF FPC} // no way to get filenames in Lazarus inside control (why??) procedure WMDropFiles(var Msg: TLMessage); message LM_DROPFILES; {$ENDIF} procedure WMEraseBkgnd(var Msg: TLMessage); message LM_ERASEBKGND; procedure WMGetDlgCode(var Msg: TLMNoParams); message LM_GETDLGCODE; procedure WMHScroll(var Msg: TLMHScroll); message LM_HSCROLL; procedure WMKillFocus(var Msg: TLMKillFocus); message LM_KILLFOCUS; procedure WMPaste(var Msg: TLMessage); message LM_PASTE; procedure WMSetFocus(var Msg: TLMSetFocus); message LM_SETFOCUS; procedure WMVScroll(var Msg: TLMVScroll); message LM_VSCROLL; {$ifdef linux} procedure WMImeComposition (var Message: TLMessage); message LM_IM_COMPOSITION; {$endif} protected FCaretRect: TRect; FDragCurPos: TPoint; FDragMode: TKSizingGripPosition; FDragOrigRect: TRect;
在7121行添加红色代码:
procedure TKCustomMemo.WMVScroll(var Msg: TLMVScroll); begin SafeSetFocus; Scroll(cScrollNoAction, Msg.ScrollCode, 0, Msg.Pos, eoScrollWindow in FOptions); end; {$ifdef linux} procedure TKCustomMemo.WMImeComposition (var Message: TLMessage); var IMStr,s1,s2:string; i:integer; pos:TPoint; begin if Message.WParam=GTK_IM_FLAG_COMMIT then begin IMStr:=UTF8Decode(pchar(Message.LParam)); //输入的字符 if IMStr<>'' then begin for i:=1 to utf8length(IMStr) do InsertChar(SelEnd, utf8copy(IMStr,i,1)); end; end; inherited; end; {$endif} { TKMemoBlock } constructor TKMemoBlock.Create; begin inherited; FOffset := CreateEmptyPoint; FDoubleClickState := mdblNone; FMouseCaptureWord := -1; FClickOnMouseUp := True; FOnClick := nil; FOnDblClick := nil; end;
修改后重新编译就可以在linux使用中文输入(fcitx)。




浙公网安备 33010602011771号