文本的基本操作
4——字符的输入功能:
完成字符的输入的功能,用到WM_CHAR消息。
一个问题,比如,输入 a,b,c 时,窗口当中就应该显示abc,但是每按一个按键,都 会有一个
WM_CHAR的消息。我们利用TextOut()函数进行输出,这中需要来指定X,Y 的坐标,就是每次的
输出都需要知道下一个字母的输出位置,这种方式不易实现。
可以用这种方式,每次的输入字符都存储在一个字符串当中,输出a,再输入b 时,将ab 组合成一个字符串,进而
输出c 时,再将abc组合成一个字符串,每次的输出都从原点位置进行输出。
i:::: 需要一个字符串存储输入的字符
添加一个字符串的变量,所以应该在View类中有一个CString类的成员变量
m_strLine
ii::::再次输出时,应该的插入符之后进行输出
捕获这个消息可以用鼠标左键,所以要在View类中添加这个消息
WM_LBUTTONDOWN(),并且有基处理函数
void CTestView::OnLButtonDown(UINT nFlags, CPoint point)
设置插入符的位置的函数为SetCaretPos()
CWnd::SetCaretPos
static void PASCAL SetCaretPos( POINT point );这个函数的功能为在当前任务所属的窗口中来移动插入符
它的参数为指定插入符的坐标。iii::::: 当鼠标再次点击另一个位置时,申请的字符串里边的字符应当清空。
CString::Empty
void Empty();
它的作用是使CString类的一个对象成为空串,并且适当的释放内存。
IV::::::要用TextOut()进行输出,那么就需要把插入符的坐标值保存起来。
在类中添加一个CPoint类的对象,m_ptOrigin
所以在点击左键的函数中为:
void CTestView::OnLButtonDown(UINT nFlags, CPoint point)
{
SetCaretPos(point);//指定位置
m_strLine.Empty();//清空
m_ptOrigin=point;//保存坐标
CView::OnLButtonDown(nFlags, point);
}5——处理回车
i::::::::输入回车,用TextOut()输出时,坐标值发生了变化
也就是说要改变坐标值
要计算坐标,回车之后,横坐标位置没有发生变化,
而(新)纵坐标=当前设备描述表当中字体高度+原先输入的纵坐标。
即: m_ptOrigin.y+=tm.tmHeight;
这里需要用到得到字体高度的函数GetTextMetrics(……);
ii:::::::回车后,换到新的一行,那么原先的行当中,的字符串清空
Empty();
6——回格键
问题:删除字符时,要把删除的抹掉怎么弄?
采用方法:1)、窗口重绘,擦除。2)、将文本颜色设为背景色,再恢复原色,再次输出(其中要保存先前的颜色)
第二种方法
i: 要获取背景色,用GetBkColor()函数。
CDC::GetBkColor
COLORREF GetBkColor( ) const;
Return Value
An RGB color value.
它的功能返回当前的背景色,为RGB型ii:设置文本颜色
函数SetTextColor()
CDC::SetTextColor
virtual COLORREF SetTextColor( COLORREF crColor );
其参数类型和上面的返回值类型相同。iii:输出时,应该减少一个字符,用到CString类中的函数
CString::Left
CString Left( int nCount ) const;
参数为字符串中字符的数量,函数的作用为返回一个CString类一个对象,它包含了字符串的一定范围
IV: 插入符随着输入面移动,可以用SetCaretPos来移动 ,但要确定其位置
可知,实际上是根据文字在屏幕上显示的宽度,来确定的插入符的位置。
那么要获取字符串在屏幕上所显示的宽度。用到GetTextExtent();
void CTestView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: Add your message handler code here and/or call default
CClientDC dc(this);
CFont font;
font.CreatePointFont(100,"楷体",NULL);
CFont *pOldfont=dc.SelectObject(&font);
TEXTMETRIC tm;
dc.GetTextMetrics(&tm);
if(0x0d==nChar)
{
m_strLine.Empty();
m_ptOrigin.y+=tm.tmHeight;
}
else if (0x08==nChar)
{
COLORREF clr=dc.SetTextColor(dc.GetBkColor());
dc.TextOut(m_ptOrigin.x,m_ptOrigin.y,m_strLine);
m_strLine=m_strLine.Left(m_strLine.GetLength()-1);
}
else
{
m_strLine+=nChar;
}
CSize st = dc.GetTextExtent(m_strLine);
CPoint pio;
pio.x=m_ptOrigin.x+st.cx;
pio.y=m_ptOrigin.y;
SetCaretPos(pio);
dc.TextOut(m_ptOrigin.x,m_ptOrigin.y,m_strLine);
dc.SelectObject(pOldfont);
CView::OnChar(nChar, nRepCnt, nFlags);
}
2408

被折叠的 条评论
为什么被折叠?



