码迷,mamicode.com
首页 > Windows程序 > 详细

Windows-文本编程基本技术

时间:2016-04-29 15:28:36      阅读:305      评论:0      收藏:0      [点我收藏+]

标签:

Windows-文本编程基本技术
这里介绍一些MFC文本编程的简单技术点。
一.插入符
(1).创建文本插入符

#if 1
    //创建插入符, 参数:宽,高
    CreateSolidCaret(20, 100);
    //必须显示出来,默认是隐藏的
    ShowCaret();
#endif

(2).创建图形插入符

#if 1
    //创建图形插入符,根据图片的ID加载
    m_Bitmap.LoadBitmap(IDR_MAINFRAME);
    CreateCaret(&m_Bitmap);
    ShowCaret(); 
#endif

(3).显示插入符

    //插入符默认是隐藏的,我们需要显式的显示它
    ShowCaret(); 

(4).设置插入符的位置

    //设置插入符的位置为左键按下的位置
    SetCaretPos(point);

(5).得到设备描述表中的字体信息,显示合适的插入符大小

    TEXTMETRIC tm;//文本信息的结构体变量
    dc.GetTextMetrics(&tm);//获得设备描述表中文本的信息
    //宽度根据经验值一般要 / 8
    CreateSolidCaret(tm.tmAveCharWidth / 8, tm.tmHeight);//根据字体的大小,创建合适的插入符
    ShowCaret();//显示插入符

(6).字体的相关信息
技术分享

tm结构体的相关信息
技术分享
二.窗口重绘
在MFC中窗口重新绘制的时候,对应的视图对象会接收到WM_PAINT消息,在类的OnDraw函数中可以进行相应的逻辑处理。
下面是一个在屏幕上显示字符串的例子:

void CTextView::OnDraw(CDC* pDC)
{
    CTextDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    if (!pDoc)
        return;

    // TODO:  在此处为本机数据添加绘制代码

    #if 1
        //构造字符串
        CString str("Hello Wolrd");
        //显示在50 50位置处
        pDC->TextOut(50, 50, str);
    #endif
}

三.CString类的简单使用
CString类是MFC中的字符串类,可以用于在MFC框架中方便的操作字符串,而不用像C中哪样需要对指针进行麻烦的操作,但是我们也必须有这些函数的实现思想,试想下怎么用C的思想来实现CString中某些函数。
下面是常用的两个实例:

(1).加载字符串

#if 1
    //在OnDraw函数中测试,这个函数会提供pDc这个设备描述表指针的参数
    //构造字符串
    CString str("Hello Wolrd");
    //显示在50 50位置处
    pDC->TextOut(50, 50, str);//直接显示在屏幕上

    str.LoadString(IDS_HELLO_WORLD);//通过MFC中的资源ID来加载字符串

    pDC->TextOut(0, 200, str);
#endif

(2).删除字符串中的一个字符

    CString Left(int nCount)//返回左边的nCount个字符构成的字符串  
    m_strLine = m_strLine.Left(m_strLine.GetLength() - 1);//等价于去掉最后一个字符

四.MFC中路径层的使用
(1).路径层其实就是规定了一段文本显示的边界,在边界内的可以显示,在路径层之外的不能显示。

实例:

    //开启路径层
    pDC->BeginPath();
    //在路径层中画出一个矩形
    pDC->Rectangle(50, 50, 50 + sz.cx, 50 + sz.cy);
    //关闭路径层
    pDC->EndPath();

(2).得到字符串的高度和宽度 GetTextExtent

    CSize GetTextExtent(LPCTSTR lpszString, int nCount  ) const; 

我们需要区分这个函数和得到字体的信息的函数

    BOOL GetTextMetrics(LPTEXTMETRIC lpMetrics) const;

的区别。
这个只能得到字符串的高度和宽度信息,而上面的函数是得到设备描述表中当前字体的详细信息,例如具体一个字体的高度,宽度,平均高度等等这些详细信息。需要清楚这两个函数的使用情况,不能乱用。

(3).剪切区域
剪切区域实质就是绘图区域,一般是在屏幕的客户区,也就是我们操作的区域。
设置剪切区域和路径层的互操作

    //设置路径层和剪切区域进行互操作
    pDC->SelectClipPath(RGN_DIFF);

五.字符输入
我们在视图类中输入字符的时候,会接收到WM_CHAR消息,在相应的回调函数OnChar()中可以对键盘消息进行处理,其中我们需要对回车和删除这两个字符进行特别的处理。
下面是一个实例:

void CTextView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
    // TODO:  在此添加消息处理程序代码和或调用默认值
    CClientDC dc(this); 

    //得到字体的详细信息
    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);//等价于去掉最后一个字符

        dc.SetTextColor(clr);
    }
    //其他键直接增加字符
    else
    {
        m_strLine += static_cast<char>(nChar);
    } 

    //输出在屏幕上
    dc.TextOut(m_ptOrigin.x, m_ptOrigin.y, m_strLine); 

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

六.设置字体
在MFC中我们可以使用CFont这个类来对字体进行相应的选择。
下面是一个实例:

    CFont font;
    //创建具体的字体类型
    font.CreatePointFont(300, L"华文行楷", nullptr);
    //选入设备描述表中
    CFont* pOldFont = dc.SelectObject(&font);
    //记得要恢复设备描述表中之前的字体信息
    dc.SelectObject(&font);

七.定时器
在MFC中我们也可以像硬件一样设置定时器来形成界面上的一种特效
我们需要使用SetTimer来设置定时器,这个定时器结束的时候会发送WM_TIMER消息,我们需要在应用程序中捕获这个消息,在OnTimer回调函数中处理。

    //定时器ID,定时时间ms,回调函数置为空,会把WM_TIMER消息防盗消息队列中
    SetTimer(1, 100, nullptr);

定时器的处理函数

void CTextView::OnTimer(UINT_PTR nIDEvent)
{
    // TODO:  在此添加消息处理程序代码和/或调用默认值 
    CView::OnTimer(nIDEvent);
}

八.附上一张ASCII表
技术分享

九.总结
这里只是介绍了一些文本编程的基本技术,更多的技术还需要我们在实际项目中去发现。
这是自己总结的导图,方便大家总结
技术分享
下面把资源共享给大家:https://yunpan.cn/cPYM8uu5XuZJH 访问密码 8eb9

Windows-文本编程基本技术

标签:

原文地址:http://blog.csdn.net/qq_22075977/article/details/51276482

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!