常用的文本处理程序有word,记事本、IDE集成开发环境等,它们都可以文本的编辑,鼠标点击之处都有一条闪烁的竖线,这个竖线就是插入符(Caret)。该插入符用于提示用户输入文字,下面就演示插入符的应用实例。
接口函数
在Cwindow成员中有一个Caret Methods,在这个Caret Methods中介绍了插入符的创建和使用,其接口函数如下:
//方法1:Creates a solid rectangle for the system caret.
BOOL CreateSolidCaret(int nWidth,int nHeight) throw();
//方法2:Creates a gray rectangle for the system caret.
BOOL CreateGrayCaret(int nWidth,int nHeight) throw();
//方法3:Creates a new shape for the system caret.
BOOL CreateCaret(HBITMAP pBitmap) throw();
//Hides the system caret.
BOOL HideCaret( ) throw();
//Displays the system caret.
BOOL ShowCaret( ) throw();
插入符需要在窗口上显示,在单文档工程中有两个窗口,一个是框架类窗口和视类窗口,我们应该在视类窗口上进行操作,当创建了视类窗口后,就可以创建和显示插入符了。我们需要手动添加WM_CREATE消息响应函数,具体代码如下:
int CMFC_TestView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
CreateGrayCaret(3,20);//创建
ShowCaret();//显示
return 0;
}
图1 插入符运行效果
为了插入符能够跟随文本字体大小而发生变化,我们需要获得设备描述表中字体结构。在CDC类中有个GetTextMertics成员函数可以得到设备描述表中字体信息,其函数声明如下:
BOOL GetTextMetrics(LPTEXTMETRIC lpMetrics) const;
其中,入参是TEXTMETRIC结构的指针,该结构包含了字体基本信息,但是常见有用信息就只有几个,具体结构体如下:
typedef struct tagTEXTMETRIC {
LONG tmHeight;
LONG tmAscent;
LONG tmDescent;
LONG tmInternalLeading;
LONG tmExternalLeading;
LONG tmAveCharWidth;
LONG tmMaxCharWidth;
LONG tmWeight;
LONG tmOverhang;
LONG tmDigitizedAspectX;
LONG tmDigitizedAspectY;
TCHAR tmFirstChar;
TCHAR tmLastChar;
TCHAR tmDefaultChar;
TCHAR tmBreakChar;
BYTE tmItalic;
BYTE tmUnderlined;
BYTE tmStruckOut;
BYTE tmPitchAndFamily;
BYTE tmCharSet;
} TEXTMETRIC;
其中tmHeight是字符高度,tmHeight = tmAscent + tmDescent, tmAveCharWidth是平均宽度,因为每个字符宽度都不同,只有一个平均宽度,如图2是字体信息的部分示意图。