孙鑫视频教程第五课——关于文本编辑

                                                                                

         以下内容主要按照视频教程中的每一个知识点来进行总结,归纳,对每一个知识点中运用到的主要函数深入认识,以及指出在编程过程中本人认为比较容易出错或者忘记的知识点或者注意事项:

1.插入符在单文档中的插入:

           该功能在消息映射函数onCreate()中完成,运用到的主要函数为:

 BOOL CreateSolidCaret( int nWidth, int nHeight ) throw();

 CreateSolidCaret ()函数有两个参数,我们可以自定义两个参数的数值!在调用了这个函数之后,我们还需要调用函数:

 BOOL ShowCaret(           HWND hWnd );

             这样我们所创建的插入符才可以显示出来!

我们往往不能很准确地给我们所插入的插入符设置宽度和高度,所以我们需要根据当前字体的信息要确定插入符的大小,要获取当前字体的信息度量,我们需要用到函数:

BOOL GetTextMetrics( LPTEXTMETRIC lpMetrics ) const;

其参数为一个字体结构体的一个对象,形式如下 :

TEXTMETRIC tm;//声明一个字体结构体的对象 

dc.GetTextMetrics(&tm);//设备调用函数从而获得当前字体信息的度量!

下面是介绍如何创建图形插入符的,需要用到的函数为:

BOOL CreateCaret( HBITMAP pBitmap ) throw();

这个函数的参数为一个位图的地址,所以我们要先引入一个位图资源或者新建一个位图资源,注意:我们应该是在view类的构造函数中声明我们的位图资源,而不是在onCreate()函数中声明,如果在onCreate()函数中声明的话,我们的位图插入符就显示不出来,这是因为我们的将会被析构掉!

关于以上两个知识点的代码如下:

CreateSolidCaret(10, 20);
 ShowCaret();

 CClientDC dc(this);
 TEXTMETRIC tm;
 dc.GetTextMetrics(&tm);
 CreateSolidCaret(tm.tmAveCharWidth/8, tm.tmHeight);
 ShowCaret();

//CBitmap bitmap;//如果放在局部函数中,在析构的时候资源就无效,位图就看不见!
 bitmap.LoadBitmapW(IDB_BITMAP1);
 CreateCaret(&bitmap);//创建一个位图插入符!
 ShowCaret();

2.在单文档中输出文字:

如果我们在函数onCreate()中写我们的代码——想在单文档中输出文字!那样就达不到我们的预期目的,因为我们的onCreate()函数在onDraw()函数的调用之前调用,所以当调用onDraw()函数时,我们的窗口就会发生重绘,我们的文字就会被覆盖,显示不出来,所以我们的代码需要在onDraw()函数中写。

CDC *pDC;
 pDC = GetDC();
 //CString str("维新科学技术培训中心");
 CString str;
 str = "维新科学技术培训中心";
 CSize sz = pDC->GetTextExtent(str);//获取当前字体在屏幕上显示的高度和宽度!

 pDC->TextOutW(50, 50, str);
 str.LoadStringW(IDS_WEIXIN);//在资源中创建一个字符串!
 pDC->TextOutW(0, 200, str);

在这里要区分GetTextExtent(str)和GetTextMestrics(&tm)的区别,前者是获取当前字体在屏幕上显示的高度和其宽度,而后者是获取默认字体的信息度量!(这个一定要透彻理解,要不搞错就麻烦) 

3.路进程:这里主要用到三个函数:beginpath(),endpath(),selectclippath()

CDC *pDC;
 pDC = GetDC();

CString str = "维新科学技术培训中心";
CSize sz = dc.GetTextExtend(str);

pDC->BeginPath();//路进程的开始
 pDC->Rectangle(50, 50, 50+sz.cx, 50+sz.cy);//对str中的文字画路进程!
 pDC->EndPath();//路进程的结束
 pDC->SelectClipPath(RGN_DIFF);//对设备上下文选择当前路径作为剪切区域,通过使用指定模式合并新区域和任何现有剪切区域
 for (int i = 0; i < 300; i += 10)//画网格线,画这个网格线是为了显示出路进程的作用!
 {
  pDC->MoveTo(0, i);
  pDC->LineTo(300, i);
  pDC->MoveTo(i, 0);
  pDC->LineTo(i, 300);
 }

4.对插入符的移动和对键盘输入的响应,对退格键和回车键的处理:

a.对插入符的移动:需要添加一个消息映射函数:LButtonDown(),这个函数的效果就是插入符随着我们鼠标的移动而移动:

void CID051View::OnLButtonDown(UINT nFlags, CPoint point)
{
     SetCaretPos(point);//设置插入符的位置!随着鼠标的移动而移动!
    
    CView::OnLButtonDown(nFlags, point);
}

b.对键盘输入的响应:需要添加一个消息映射函数:onChar(),以及两个变量,分别是:CString  m_strLine, CPoint m_ptOrigin,在这个函数中包含着我们对退格键和回车键的处理函数:
 CClientDC dc(this);
 //CFont font;//创建字体
// font.CreatePointFont(200, TEXT("隶书"), 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.TextOutW(m_ptOrigin.x, m_ptOrigin.y, m_strLine);
     m_strLine = m_strLine.Left(m_strLine.GetLength() - 1);//对删除字符的处理:先获取str字符串的长度-1,再从左往右取字符!
     dc.SetTextColor(clr);//设置为原来的颜色!
 }
 else
 {
      m_strLine += (TCHAR)nChar;//将输入的字符加入到字符串中!
 }
  CSize sz = dc.GetTextExtent(m_strLine);
 CPoint pt;
 pt.x = m_ptOrigin.x + sz.cx;
 pt.y = m_ptOrigin.y;
 SetCaretPos(pt);//设置插入符的位置

 dc.TextOutW(m_ptOrigin.x, m_ptOrigin.y, m_strLine);
 dc.SelectObject(pOldFont);

注释部分为对在单文档中的字体的改变!没有这个不影响对退格键和回车键的处理!

5.卡啦OK的文字效果:

这里主要添加一个消息映射函数:onTimer(),在onCreate()函数中添加:SetTimer(1, 100, NULL);//设置一个定时器,还有函数DrawText()(注意与TextOut()函数的区别)每隔一定的时间就来一个函数响应,每一次的响应都输出一部分文字!重复对文字的输出和变色进行处理!需要注意的就是对矩形坐标的准确获取!一定要仔细分析才可以得出准确地坐标位置!

               m_nWidth += 5;//对输出字体的点数的累加!

 CClientDC dc(this);
 TEXTMETRIC tm;
 dc.GetTextMetrics(&tm);
 CRect rect;//创建一个矩形!
 rect.left = 0;
 rect.top = 200;
 rect.right = m_nWidth;
 rect.bottom = rect.top + tm.tmHeight;
 CString str;
 str.LoadStringW(IDS_WEIXIN);
 dc.SetTextColor(RGB(255, 0, 0));
 dc.DrawText(str, rect, DT_LEFT);

 rect.top = 150;
 rect.bottom = rect.top + tm.tmHeight;
 dc.DrawText(str, rect, DT_RIGHT);

 CSize sz = dc.GetTextExtent(str);
 if (m_nWidth > sz.cx)//判断输出的字体宽度是否已超出!
 {
  m_nWidth = 0;
  dc.SetTextColor(RGB(0, 255, 0));
  dc.TextOutW(0, 200, str);
  dc.TextOutW(0, 150, str);
 }

以上内容仅仅是本人在学习孙鑫老师视频教程的笔记,只是代表个人的一些思路和为了增强本人对其视频内容的熟悉,熟练对其知识点的运用,以为以后自己的复习做好准备!如有什么不对的地方又或者错误的知识点表达,希望各位网友可以提出,共同学习,共同进步!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值