📄 untitled-47.txt
字号:
。ptTextorigin保存字符串左上角的坐标。如果鼠标在字符串的最右端以外被单击了,Get-
NearestP0s将返回一个等于字符串长度的整数:
CClientDC dc(this);
nit nLen。 In-strlnPutText.GetLength();
if(point.x>=(。ptTextorigin.x+
(dc.GetTextExtent(In--strlnputText, nLen》.ex》
return nLen;
结果如何?如果鼠标在文本矩形内被单击,但是是在最右边字符的右边,插人符就会移到字
符串的结尾处。
如果GetNearestPos跳过 return "fan语句,我们就知道在文本框中被单击的光标位置处
于字符串左端和右端之间。GetNearestPos接下来将初始化3个变量并执行while循环,反复
调用GetTextExtent直到nPrevChar和nNextChar保存的值刚好包括单击发生处的x坐标值:
while(nNextChar< po。nt.x)
工个十;
rPrrrChrr= flNflfltChfll;
+N+XtChXX= PtTt0ligil.工十
(dc.GetTextExtent(In-StrloputText.Left(。),。》.ex;
Z
在退出循环后,i中保存单击发生处右边字符位置,i-1则保存左边字符的位置。查找字符
位置比较简单,只要确定point.x靠nNextChar近还是靠nPrevChar近,并返回i或i-1即可。
用如下一行语句就可实现:
return((po。nt.x-nPrevChar)<(nNextChar-po。nt.x))?。-1: i;
这样,给定窗口客户区中的任意点,GetNearestP0s就可以返回字符串rn-strlnputText中相
匹配的字符位置。这种处理过程效率不太高,这是因为距离点的右边越远,调用GetText-
Extent的次数也越多。(while循环从字符串最左端字符开始每次向右移动一个字符,直到找
到单击发生处右边的字符为止。)通过使用二分法可以使GetNearestPos的执行效率提高:首
先从字符串的中点开始将字符串分成具有相同字符数的两段,再对左边或右边未检索过的
字符串重复相同的工作,直到找到这样的一个点,在它左边和右边的字符数为0,这个位置
就是单击发生的地方。在128个字符长的字符串中,用此方法不超过8次调用GetTextExtent
即可确定字符位置。而GetNearestPos中使用的笨办法却需要127次调用。
3.3.2输入及编辑文本
处理输人和编辑文本的方法在 CMainwindow:: onChar实现。 onChar的处理策略归结
如下:
1.将消息返回给屏幕。
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -