MFC原创教程:2.0 Text

创建Text MFC应用程序(单文档);

1:首先是创建系统插字符。
添加WM_CREATE消息。添加代码如下:
int CTextView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
 if (CView::OnCreate(lpCreateStruct) == -1)
  return -1;

 // TODO:  在此添加您专用的创建代码
 CClientDC dc(this);
 TEXTMETRIC tm;  //
字体信息的结构体
 dc.GetTextMetrics(&tm); //该函数把程序当前的字体信息,存放到TEXTMETRIC
 CreateSolidCaret(tm.tmAveCharWidth/8,tm.tmHeight); //初始化插字符是隐藏的
 ShowCaret(); //所以要让它显示

 return 0;
}

2:然后在窗口输出文字。代码写在 CTextView::OnDraw中(//发生重绘时,被应用程序框架调用,使内容始终显示)。
void CTextView::OnDraw(CDC* pDC)  //2010版本中的参数是CDC* /*pDC*/,把注释去掉即可。

代码如下:
 CTextDoc* pDoc = GetDocument();
 ASSERT_VALID(pDoc);
 if (!pDoc)
  return;

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

 CString str;
 str="
乡巴佬学MFC";
 pDC->TextOut(50,50,str);
}
强化后如下:

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

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

 CString str;
 str="
乡巴佬学MFC";
 pDC->TextOut(50,50,str); //输出文字。数字参数表左上角坐标

 CSize sz=pDC->GetTextExtent(str); //获取字符串的显示的长度信息。
 pDC->BeginPath(); //路径开始
 pDC->Rectangle(50,50,50+sz.cx,50+sz.cy); //绘制一个矩形环绕在str字符串。参数是左上右下两个坐标。
 pDC->EndPath();  //路径结束

 pDC->SelectClipPath(RGN_DIFF); //个人理解:BeginPath~EndPath划为当前路径。RGN_DIFF参数:除去当前路径,成为新的剪切区域。RGN_AND :当前路径和当前区域的交集
 for(int i=0;i<300;i+=10)
 {
  pDC->MoveTo(0,i);
  pDC->LineTo(300,i); //
画横线
  pDC->MoveTo(0,i);
  pDC->LineTo(i,300); //
画椭圆网  
 }
}

3
:让插入符出现在鼠标左键点击的地方。
view类添加WM_LBUTTONDOWN消息,添加代码如下:
void CTextView::OnLButtonDown(UINT nFlags, CPoint point)
{
 // TODO:
在此添加消息处理程序代码和/或调用默认值
 SetCaretPos(point);  //将插入符移动到指定的坐标上

 CView::OnLButtonDown(nFlags, point);
}

4:插入CString私有变量(m_strLine),并在构造函数中初始化为""。//输出到屏幕用的
     插入CPoint 私有变量(m_ptOrigin),并在构造函数中初始化为0。 //记录插入符坐标

5:添加WM_CHAR消息。 // 按下键盘时,系统会发送一条WM_CHAR消息
代码如下:
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;
  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+=(char)nChar;
//nChar是UNIT类型的,而m_strline是CString类型的,需强制转换
 }

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

6:让字体颜色像MV字幕那样变化(先是黑色,然后文字从左到右变成红色)。实现原理:一条路是黑色的,有条卷起来的红地毯在最左边,让它慢慢往右边铺过去,看上去就是颜色在慢慢变化了。

:插入int私有变量m_nWidth,并在构造函数中初始化为0; //作为矩形宽度的变量
      
添加String Table资源,空白处双击,ID为:IDS_TEXT ,标题为:会改变颜色的字符串,慢慢变红;
:添加WM_TIMER消息。 //定时器   
:在OnCreate函数中添加代码:SetTimer(1,100,NULL);  //(在其它地方添加这个代码也行),让定时器生效。参数(定时器编号,时间毫秒,NULL表示执行定时器里面的代码)
四:代码如下:
void CTextView::OnTimer(UINT_PTR nIDEvent)
{
 // TODO:
在此添加消息处理程序代码和/或调用默认值
 m_nWidth+=5; //矩形宽度变化的幅度

 CClientDC dc(this);
 TEXTMETRIC tm;
 dc.GetTextMetrics(&tm);
 CRect rect;
 rect.left=50; 
 rect.top=50;
 rect.right=m_nWidth; 
//右下角横坐标

 rect.bottom=rect.top+tm.tmHeight;
//右下角纵坐标

 dc.SetTextColor(RGB(255,0,0));
 CString str;
 str.LoadStringW(IDS_TEXT);
 dc.DrawText(str,rect,DT_LEFT);
//参数(字符串,矩形结构,绘制选项这里是从左往右)

 CView::OnTimer(nIDEvent);
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值