5.1插入符
文本编辑窗口中有一条闪烁的竖线,称为插入符。
5.1.1创建文本插入符
要用到CWnd类CreateSolidCaret()。
void CreateSolidCaret( int nWidth, int nHeight );
第一个参数表示插入符的宽度,第二个参数表示插入符的高度。为0表示系统定义的值。
由于窗口客户区的鼠标和键盘的操作都在视类窗口上进行,因此在视类窗口上插入文本插入符。
插入符的创建在窗口创建之后,CTextView类没有WM_CREATE消息响应函数OnCreate(),所以要手动添加WM_CREATE消息映射函数OnCreate。
int CTextView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
CreateSolidCaret(20,100);
ShowCaret();
// TODO: Add your specialized creation code here
return 0;
}
调用ShowCaret()函数显示文本插入符。
怎么调整插入符字体的大小?
调用CDC类GetTextMetrics成员函数可以得到设备描述表中当前字体的度量信息。
BOOL GetTextMetrics( LPTEXTMETRIC lpMetrics ) const;
参数是TEXTMETRIC结构体的指针。里面有填充的字体的相关信息。
typedef struct tagTEXTMETRIC { // tm
LONG tmHeight; //字体高度
LONG tmAscent; //基线上的高度
LONG tmDescent; //基线下的高度
LONG tmInternalLeading;
LONG tmExternalLeading;
LONG tmAveCharWidth; //字体平均宽度
LONG tmMaxCharWidth; //字体最大宽度
LONG tmWeight;
LONG tmOverhang;
LONG tmDigitizedAspectX;
LONG tmDigitizedAspectY;
BCHAR tmFirstChar;
BCHAR tmLastChar;
BCHAR tmDefaultChar;
BCHAR tmBreakChar;
BYTE tmItalic;
BYTE tmUnderlined;
BYTE tmStruckOut;
BYTE tmPitchAndFamily;
BYTE tmCharSet;
} TEXTMETRIC;
int CTextView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
CClientDC dc(this);
TEXTMETRIC tm;
dc.GetTextMetrics(&tm);
CreateSolidCaret(tm.tmAveCharWidth/8,tm.tmHeight);
ShowCaret();
// TODO: Add your specialized creation code here
return 0;
}
5.1.2创建图形插入符
利用CWnd类CreateCaret函数来实现。
void CreateCaret( CBitmap* pBitmap );
参数是一个CBitmap指针类型,因此首先构造一个CBitmap对象,然后CBitmap的成员函数来初始化位图对象后,才能使用这个位图对象。
可以新建一个位图资源,也可以导入一个已有的位图资源。
导入一个位图资源:Insert->Resource->Import
这里新建了一个位图资源IDB_BITMAP1(NEW)。
int CTextView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
CBitmap bitmap;
bitmap.LoadBitmap(IDB_BITMAP1);
CreateCaret(&bitmap);
ShowCaret();
// TODO: Add your specialized creation code here
return 0;
}
运行出来并不会有图形插入符,这是因为bitmap变量是一个局部变量,因此需要将其改为类的成员变量,访问权限为private。