?? untitled-47.txt
字號(hào):
。ptTextorigin保存字符串左上角的坐標(biāo)。如果鼠標(biāo)在字符串的最右端以外被單擊了,Get-
NearestP0s將返回一個(gè)等于字符串長度的整數(shù):
CClientDC dc(this);
nit nLen。 In-strlnPutText.GetLength();
if(point.x>=(。ptTextorigin.x+
(dc.GetTextExtent(In--strlnputText, nLen》.ex》
return nLen;
結(jié)果如何?如果鼠標(biāo)在文本矩形內(nèi)被單擊,但是是在最右邊字符的右邊,插人符就會(huì)移到字
符串的結(jié)尾處。
如果GetNearestPos跳過 return "fan語句,我們就知道在文本框中被單擊的光標(biāo)位置處
于字符串左端和右端之間。GetNearestPos接下來將初始化3個(gè)變量并執(zhí)行while循環(huán),反復(fù)
調(diào)用GetTextExtent直到nPrevChar和nNextChar保存的值剛好包括單擊發(fā)生處的x坐標(biāo)值:
while(nNextChar< po。nt.x)
工個(gè)十;
rPrrrChrr= flNflfltChfll;
+N+XtChXX= PtTt0ligil.工十
(dc.GetTextExtent(In-StrloputText.Left(。),。》.ex;
Z
在退出循環(huán)后,i中保存單擊發(fā)生處右邊字符位置,i-1則保存左邊字符的位置。查找字符
位置比較簡單,只要確定point.x靠nNextChar近還是靠nPrevChar近,并返回i或i-1即可。
用如下一行語句就可實(shí)現(xiàn):
return((po。nt.x-nPrevChar)<(nNextChar-po。nt.x))?。-1: i;
這樣,給定窗口客戶區(qū)中的任意點(diǎn),GetNearestP0s就可以返回字符串rn-strlnputText中相
匹配的字符位置。這種處理過程效率不太高,這是因?yàn)榫嚯x點(diǎn)的右邊越遠(yuǎn),調(diào)用GetText-
Extent的次數(shù)也越多。(while循環(huán)從字符串最左端字符開始每次向右移動(dòng)一個(gè)字符,直到找
到單擊發(fā)生處右邊的字符為止。)通過使用二分法可以使GetNearestPos的執(zhí)行效率提高:首
先從字符串的中點(diǎn)開始將字符串分成具有相同字符數(shù)的兩段,再對左邊或右邊未檢索過的
字符串重復(fù)相同的工作,直到找到這樣的一個(gè)點(diǎn),在它左邊和右邊的字符數(shù)為0,這個(gè)位置
就是單擊發(fā)生的地方。在128個(gè)字符長的字符串中,用此方法不超過8次調(diào)用GetTextExtent
即可確定字符位置。而GetNearestPos中使用的笨辦法卻需要127次調(diào)用。
3.3.2輸入及編輯文本
處理輸人和編輯文本的方法在 CMainwindow:: onChar實(shí)現(xiàn)。 onChar的處理策略歸結(jié)
如下:
1.將消息返回給屏幕。
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -