untitled-42.txt

来自「mfc 教程」· 文本 代码 · 共 33 行

TXT
33
字号
C。ateGrayCaret函数与CreatesolidCaret功能基本相同,不同处在于它创建灰色插人符而不是
实体黑色插人符。插入符尺寸以逻辑单位表示,因此如果您在创建插入符之前更改了映象
模式,您指定的尺寸也将相应地变换。
    上面已经提到,移动括人符是您的 工作。    CWnd:: SetC。tPos重新定位插人符,它接受包
含新建光标位置的x和y客户区坐标的CPoint对象。如果您使用固定调距字体,在一串文
本中确定插人符的位置相当直接,可以用字符宽度乘以字符位置来计算字符申中新的X偏
移量。如果字体是按比例调距的,就必须多做些工作。   MFC的  CDC:: GetTextExtent和  CDC::
GetTabbedTexiE。tent函数使应用程序可以以逻辑单位确定所用的按比例调距字体的字符串
的宽度。(如果字符串包含制表符,就使用GetTabbedTextExtent。)给定一个字符的位置n,就
可以调用GetTextExtent或GetTahbedTextExtent来找到前n个字符的累积宽度,进而计算出相
应插人符的位置。如果字符串“Hello,world”显示的位置由名为point的CPoint对象指定,dc
是设备描述表对象,下面的语句将插人符放在了“W。rid”中的“W”和“。”之间:
      CSize size= dc.GetTextExtent(T(”Hello,J), 8);
      SetCaretPos(CPo。nt(po。nt.x+ s。ie.ex, po。nt.y》;
GetTextExtent返回一个CSize对象,它的ex和cy成员反映出字符串的宽度和高度。
    如果您正在使用比例均衡字体,而且也没有字符偏移量可供使用时,插入符定位就会更
麻烦一些,在编写处理鼠标左键单击而重新定位括人符的onLButtonD0wn处理程序时,您就
会遇到这种情况。假设您应用程序有一个名为m.nCu。ntPos的变量,它指示当前字符的位
置,该位置就是字符串中下一个输人字符插人的地方。这很容易在左箭头或右箭头键按下
时,计算出新的插人符位置:只要减少或增加。nCurrentPos值并用新的字符位置调用 Get-
TextExtent或GetTabbedTextExtent来计算新的偏移量即可。但是如果鼠标左键在字符串中任
意位置单击,将怎么办呢?这时鼠标单击和nL-nCurrentPos就没关系了,因此您必须使用光
标位置和字符串起点的水平差值倒推出字符位置,然后计算出最终的插人符位置。这样就
会不可避免地涉及一些迭代计算,因为既没有 Windows API函数也没有 MFC类成员函数可
以接受字符串和像素的偏移量而返回此偏置处的字符。幸好,自己编写这些函数并不很难。
在下一节中将给您介绍。
3.3w盼***BM用程序
    现在我们把所有学过的知识用来开发一个示例应用程序,该程序键盘输人的文本,在窗
口中显示它,并允许用户执行一些简单的编辑工作包括用箭头键和鼠标来移动插人符。为
便于教学,我们将滚动显示程序接收的键盘消息以及伴随这些消息的参数,正像Charles
Petzold的《Programming Windows》中的 KEYLOOK程序那样。除提供了一个可以实践的鼠标键
盘处理教程以外,VISllalKB程序还说明了一些处理按比例对齐文本的技巧。VISllalKB还提

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?