2017.6.17 字符串输入

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wangxiaobei2017/article/details/73433541

我们要在屏幕上输出连续的字符串,首先要创建消息响应函数WM_ONCHAR,此函数是用来读取键盘输入的字符串。接下来添加变量 m_strLine 来保存输入的字符串,m_strLine 是属于CString类的。通过if语句 分别响应回车键 退格键和其他字符。

void CTEXTView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
    // TODO:  在此添加消息处理程序代码和/或调用默认值
    /**********************wjl****************************
    <键入字符串>
        1. 在OnChar下添加消息响应 就是响应键盘输入的字符
        2. 在键盘上按下回车键,字符串的输入就要换行(在Y方向上增加一个字符高度)
        3. 在键盘上按下退格键,删除一个字符,这里并不是直接删除,而是把文本设置成背景色,
           然后去掉最后一个字符,再显示出来,附上之前的颜色
        4. 在键盘上按下字符后,直接在原有字符串m_strLine 后面加上nChar 字符
        5. 最后要用TextOut 输出按键后的字符串
        6. 要让光标跟随字符的输入,让光标获取当前字符串的尺寸,从而重新显示光标

    ***********************wjl****************************/
    CClientDC dc(this);
    TEXTMETRIC tm;
    dc.GetTextMetrics(&tm);

    if (0x0d == nChar)  // 如果是按下回车键 清空之前的字符串
    {
        m_strLine.Empty();
        m_ptOrigin.y += tm.tmHeight; // 对回车键的处理 按下回车后光标跑到下一行
    }

    else if (0x08 == nChar)  // 按下退格键 消除一个字符
    {
        // 首先将文本设置成背景色(要保存之前的颜色 SetTextColor函数返回先前的颜色)
        COLORREF clr = dc.SetTextColor(dc.GetBkColor());
        dc.TextOutW(m_ptOrigin.x,m_ptOrigin.y,m_strLine);
        // 接下来 减少一个字符
        m_strLine = m_strLine.Left(m_strLine.GetLength()-1);

        dc.SetTextColor(clr); // 将文本颜色设置成之前的颜色
    }
    else  // 将字符加到之前的对象中
    {
        m_strLine = m_strLine+(char)nChar;
    }
    // 让光标随着字符移动
    CSize sz = dc.GetTextExtent(m_strLine); // 获得当前字符串的尺寸

    CPoint pt;
    pt.x = m_ptOrigin.x + sz.cx; 
    pt.y = m_ptOrigin.y;

    SetCaretPos(pt);     // 重新显示光标
    dc.TextOut(m_ptOrigin.x,m_ptOrigin.y,m_strLine);

    CView::OnChar(nChar, nRepCnt, nFlags);
}

我们想要插入符随着鼠标左键移动,首先创建消息响应函数WM_OnLButtonDown,用来捕获鼠标左键,SetCaretPos() 函数是光标的位置函数

void CTEXTView::OnLButtonDown(UINT nFlags, CPoint point)
{
    // TODO:  在此添加消息处理程序代码和/或调用默认值
    /**********************wjl****************************
    <鼠标左键响应>
        1. 按下鼠标左键,光标自动定位到鼠标处
    ***********************wjl****************************/

    SetCaretPos(point); // 让光标跟着鼠标左键走
    m_strLine.Empty();   // 将CString 里面的内容清空
    m_ptOrigin = point;  // 将鼠标左键按下的坐标赋给 m_ptOrigin 用来确定字符串的起始位置

    CView::OnLButtonDown(nFlags, point);
}

猜你喜欢

转载自blog.csdn.net/wangxiaobei2017/article/details/73433541