Text文本类的部分操作
基本是基于WND::CDC的一些显示类的调用
本文的工程主要是描述一个文本编辑器的开发过程。
一、 文本编辑器的基本特征
l 需要一个光标用来指示当前输入字符
l 能处理文字输入(包括删除等基本字处理能力)
二、 设计光标
光标一开始就会存在,因此在初始化View类的时候就要将光标添加进去。
首先要创建一个光标对象,可以使用函数:CreateSolidCaret
Creates a solid rectangle for the system caret and claims ownership of the caret.
void CreateSolidCaret(
int nWidth,
int nHeight
);
而该函数需要2个参数nWidth,nHeight
nWidth
Specifies the width of the caret (in logical units). If this parameter is 0, the width is set to the system-defined window-border width.
nHeight
Specifies the height of the caret (in logical units). If this parameter is 0, the height is set to the system-defined window-border height.
而我们知道,我们所需要的光标最好能和当前要输入的字符的尺寸的高度是一致的,且成条形的(假设现在模仿WORD等经典字处理模式的特征)。
因此我们需要获取当前文字的一些属性才可以判断光标的宽高。
可以使用CDC::GetTextMetrics 用来获取一个当前字体的度量值。
Retrieves the metrics for the current font using the attribute device context.
BOOL GetTextMetrics(
LPTEXTMETRIC lpMetrics
) const;
lpMetrics :
Points to the TEXTMETRIC structure that receives the metrics.
因此需要先定义一个TEXTMETRIC的变量,然后利用它来传递字体的参数。
CClientDC dc(this);
TEXTMETRIC tm;
dc.GetTextMetrics(&tm);
在获取了参数之后就要把拥有当前参数传进光标对象并将其显示出来。
CreateSolidCaret(tm.tmAveCharWidth/8,tm.tmHeight); // tm.tmAveCharWidth/8除以8的目的在于能够以一个竖线的形状显示。这个8可以通过反复测试选择合适的值。
ShowCaret(); //有了对象还要调用其下这个方法才可以显示出来。
补充:bitmap.LoadBitmap(IDB_BITMAP1);
CreateCaret(&bitmap);
如果要使用位图来作为光标,那么需要换一下光标的内容,在ShowCaret()函数前输入以上两句。IDB_BITMAP1可以在添加资源中添加。
三、 处理文字输入
文字输入需要捕获键盘的输入信息,也就是识别每个不同的按键的值,应交由WM_CHAR(由WM_KEYDOWN,WM_KEYUP两个消息在 TranslateMessage(&msg);和
DispatchMessage(&msg);的共同作用下产生的)。因此应该在WM_CHAR消息下完成输入代码的处理。
添加文字现在采用一个字符串CString对象来保存所有光标前的值,然后将之前的值在窗体重绘后再次输出。
Error! Error! Error! Error! Error! Error! Error! Error! Error! Error! Error! Error!
操作环境:VS.NET2003 VC++7.0
WM_CHAR中捕获键盘按下字符。
UINT nChar;
CString m_strLine+=nChar; //+=操作符重载出错!
Error! Error! Error! Error! Error! Error! Error! Error! Error! Error! Error! Error!
代码下载:code_Text
posted on 2008-07-18 20:30 volnet(可以叫我大V) 阅读(672) 评论(1) 编辑 收藏 举报