文本2

                                                  文本的基本操作

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);
}






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值