研究心得------->Seskin控件包中SeskinEdit汉字问题的解决办法

汉字|解决|控件|问题|心得

公司采用Seskin控件包来开发。却发现SeskinEdit在使用汉字是有问题。主要是由汉字时光标定位不准。鼠标选字也选不准。
于是看了其代码。发现它在计算文本长度时采用的函数TextLength有问题。
其实TCanvas提供了一个TextLength方法,在去文本长度时汉字没有问题。
所以把这里替换下来就行了。
替换后的se_controls单元中的TSeCustomEdit的代码如下
TSeCustomEdit = class(TSeCustomControl)
private
FText: WideString;
FLMouseSelecting: boolean;
FCaretPosition: integer;
FSelStart: integer;
FSelLength: integer;
FFirstVisibleChar: integer;
FPopupMenu: TSeCustomPopupMenu;
FAutoSelect: boolean;
FCharCase: TEditCharCase;
FHideSelection: Boolean;
FMaxLength: Integer;
FReadOnly: Boolean;
FOnChange: TNotifyEvent;
FPasswordChar: WideChar;
FPasswordKind: TPasswordKind;
FTextAlignment: TAlignment;
FActionStack: TEditActionStack;
FPopupMenuDropShadow: boolean;
FPopupMenuShowAnimationTime: integer;
FPopupMenuBlendValue: integer;
FPopupMenuShadowWidth: integer;
FPopupMenuShowAnimation: TSeAnimationRec;
FPopupMenuBlend: boolean;
FContextMenuOptions: TSePopupMenuOptions;
procedure UpdateFirstVisibleChar;
procedure UpdateCaretePosition;
procedure UpdateCarete;

procedure WMGetDlgCode(var Msg: TWMGetDlgCode); message WM_GETDLGCODE;
procedure WMCopy(var Message: TMessage); message WM_COPY;
procedure WMPaste(var Message: TMessage); message WM_PASTE;
procedure WMCut(var Message: TMessage); message WM_CUT;
procedure WMUnDo(var Message: TMessage); message WM_UNDO;
procedure WMContexMenu(var Message: TMessage); message WM_CONTEXTMENU;
procedure WMLButtonDblClk(var Message: TWMLButtonDblClk); message
WM_LBUTTONDBLCLK;
{ unicode }
procedure WMImeStartComposition(var Message: TMessage); message
WM_IME_STARTCOMPOSITION;
procedure WMImeComposition(var Msg: TMessage); message WM_IME_COMPOSITION;
{ VCL messages }
procedure CMEnabledChanged(var Msg: TMessage); message CM_ENABLEDCHANGED;
procedure CMFontChanged(var Message: TMessage); message CM_FONTCHANGED;
procedure CMTextChanged(var Msg: TMessage); message CM_TEXTCHANGED;

function GetSelText: WideString;
function GetVisibleSelText: WideString;
function GetNextWordBeging(StartPosition: integer): integer;
function GetPrivWordBeging(StartPosition: integer): integer;
function GetSelStart: integer;
function GetSelLength: integer;
function GetText: WideString;
procedure SetText(const Value: WideString);
procedure SetFont(Value: TFont);
procedure SetCaretPosition(const Value: integer);
procedure SetSelLength(const Value: integer);
procedure SetSelStart(const Value: integer);
procedure SetAutoSelect(const Value: boolean);
procedure SetCharCase(const Value: TEditCharCase);
procedure SetHideSelection(const Value: Boolean);
procedure SetMaxLength(const Value: Integer);
procedure SetPasswordChar(const Value: WideChar);
procedure SetCursor(const Value: TCursor);
procedure SetTextAlignment(const Value: TAlignment);
procedure SetPasswordKind(const Value: TPasswordKind);
procedure SetPopupMenuBlendValue(const Value: integer);
procedure SetPopupMenuDropShadow(const Value: boolean);
procedure SetPopupMenuShadowWidth(const Value: integer);
procedure SetPopupMenuShowAnimation(const Value: TSeAnimationRec);
procedure SetPopupMenuShowAnimationTime(const Value: integer);
procedure SetPopupMenuBlend(const Value: boolean);
procedure SetContextMenuOptions(const Value: TSePopupMenuOptions);
protected
function GetEditRect: TRect; virtual;
function GetPasswordCharWidth: integer; virtual;
function GetCharX(A: integer): integer;
function GetCoordinatePosition(x: integer): integer;
function GetSelRect: TRect; virtual;
function GetAlignmentFlags: integer;

procedure PaintBuffer; override;

procedure PaintText; virtual;
procedure PaintBackground(Rect: TRect; Canvas: TCanvas); virtual;
procedure PaintSelectedText; virtual;
procedure DrawPasswordChar(SymbolRect: TRect; Selected: boolean); virtual;

function ValidText(NewText: WideString): boolean; virtual;
function CanAutoSize(var NewWidth, NewHeight: Integer): Boolean; override;

procedure BorderChanged; override;
procedure HasFocus; override;
procedure KillFocus; override;
procedure MouseDown(Button: TMouseButton; Shift: TShiftState; x, y:
int

时间: 2024-10-01 20:27:52

研究心得------->Seskin控件包中SeskinEdit汉字问题的解决办法的相关文章

C# label控件的背景色Transparent透明不了解决办法

C# label控件的背景色Transparent透明不了解决办法 C# label控件的背景色改为Transparent还是透明不了,label控件后面是picturebox,需要先设置,然后再添加到父控件,如果已经添加到父控件,设置为透明则无效. Label1.Parent=Picturebox1 Label1.BackColor = Color.Transparent Label1.Parent=Picturebox1 这样一句就可以,需要在代码中写.设计时无法实现.... 控件默认是没有

紧急求助:各位大侠,给小弟一个支持Office2007风格的VS2005控件包,跪求!!!

问题描述 老板要一个支持Office2007风格的VS2005控件包,限定今晚,小弟跪求了!!! 解决方案 解决方案二:这个~~现在有了吗?还在用旧的~~解决方案三:跪求????解决方案四:听老板的口气,好象有了,各位大侠,帮帮小弟吧:(解决方案五:dotnetbar去搜索一下 看楼主有没有用的上解决方案六:.net中的winformUI本来就慢,还用第三方控件.解决方案七:找一下Dev系列的.

VC控件“树”中多选拖放功能的实现

控件"树"(tree)能够清晰地显示所包含数据的继承关系,是一个强有力的控件.但是真正掌握并能运用CTreeCtrl类的众多特性并不是一件容易的事情.在Visual C++ Developer杂志的9月份.10月份这两期中,Stephen介绍了两个类CBitmapTree和CCheckableTree的用法,这两个类可以扩展和简化类CTreeCtrl.在这篇文章里,将主要介绍类CBitmapTree的升级版,它可以简化往"树"控件中添加拖放功能的过程,而且还可以实现

非ie内核 64位 ocx-ocx控件调用中遇到的2个问题:

问题描述 ocx控件调用中遇到的2个问题: 1, vc2010编译的64位的ocx控件,但是该控件的依赖库是32位的,能正常运行吗? 非ie内核的浏览器,如果调用ocx控件?网上有很多,但是没找到靠谱的希望大侠给指明一下,谢谢! 解决方案 vc2010编译的64位的ocx控件,但是该控件的依赖库是32位的,能正常运行吗? -〉你的依赖库指得是static library么?如果指的是static library, 应该编译/链接就有问题才对. 如果指得是另外一个32bit的OCX控件,那可能是能

datagridview-C#控件DataGridView中的columns该怎么用呢,求大神帮我解决一下这个问题

问题描述 C#控件DataGridView中的columns该怎么用呢,求大神帮我解决一下这个问题 //dgvEmployee.Columns[0].Width = 40; //dgvEmployee.Columns[1].Width = 80; 这两句怎么才能使用 用完查询语句后想将数据放进DataGridView控件中,发现并不会定义Columns,请大神们指教,谢谢. 解决方案 dgvEmployee.Columns.Add(""第一列"");dgvEmplo

新中新二代身份证阅读器ocx控件使用提示对象不支持怎么解决?

问题描述 新中新二代身份证阅读器ocx控件使用提示对象不支持怎么解决? 100C 项目需要在客户端浏览器中使用新中新二代身份证阅读器读取身份证信息,使用官方提供的ocx控件,并且在自己本机上可以读取,但是在客户机上使用时在调用控件的方法的时候提示对象不支持XXX方法图片说明官方提供的驱动什么的都装上了,好像还是不行,跪求解释....官方的demo也跑不通图片说明 解决方案 你机器上可以读取,那你的机器和客户机有什么区别吗??? 解决方案二: 都是window7 64位,都是IE9, 官方提供的控

c#wi-C#中如何在windowsmediaplayer 控件屏幕中添加文本呢,求大神指导

问题描述 C#中如何在windowsmediaplayer 控件屏幕中添加文本呢,求大神指导 C#中如何在windowsmediaplayer 控件屏幕中添加文本呢或者添加字幕呢?哪个属性是的?大神指导下,我是一年级菜鸟.

在控件容器中,单击自己做的控件,该控件只能获得焦点,不能被选中,为什么?

问题描述 在控件容器中,插入自己做的一个控件,再插入MicrosoftForms2.0TextBox,先单击MicrosoftForms2.0TextBox,MicrosoftForms2.0TextBox获得焦点和选中状态,再单击自己做的控件,却只能获得焦点,不能被选中,为什么? 解决方案 解决方案二:怎么加图片????????????????????????????????????/解决方案三:选中是控件边框有8个黑方块,有焦点是边框有短的斜线.不知道我描述的是否清楚.解决方案四:控件容器?

我是新手,请大家帮忙看看我要将从数据库中的数据放到控件label中

问题描述 请帮帮忙,如何将数据库中的字段phone显示在控件label1中?用c#,数据库为oraclelabel1.Text=我想将cmd中的phone字段的值显示在该控件中,请问怎么写啊?源代码如下:stringconnectstring="DataSource=testdb;user=test;password=test;";OracleConnectionconn=newOracleConnection(connectstring);try{conn.Open();Oracle