以下是第五讲的主要内容(文本输入输出,要先设置光标位置,然后再输出文本)
1.CWnd::CreateSolidCaret创建插入符,ShowCaret()显示插入符。GetTextMetrics(),获得当前字体的一些信息。CWnd::CreateCaret()创建图象插入符
bitmap.LoadBitmap(IDB_BITMAP1);//此处的bitmap为成员变量!!!
CreateCaret(&bitmap);
ShowCaret();
TEXTMETRIC tm;//字体结构体
dc.GetTextMetrics(&tm);//
m_ptOrigin.y+=tm.tmHeight;//获得字体高度。
2.VC中CString::LoadString(ID号),比较方便。
3.路径层的概念:有两种方法创建路径层:
(1)
pDC->BeginPath();
pDC->Rectangle(50,50,50+sz.cx,50+sz.cy);
pDC->EndPath();
pDC->SelectClipPath(RGN_DIFF);
(2)
CSize sz=pDC->GetTextExtent(str);
CRgn rn;
rn.CreateRectRgn(0,50,sz.cx,sz.cy);
pDC->SelectClipRgn(&rn,RGN_DIFF);
路径层有什么作用?可以保护我们先前的文本或者图像不被后来画的覆盖。
4.在View上输入文字的步骤。
CFont font;//创建字体对象
font.CreatePointFont(300,"华文行楷",NULL);//设置
CFont *pOldFont=dc.SelectObject(&font);//将字体选择到DC中
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+=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);//输出字体
dc.SelectObject(pOldFont);//将原先的字体选择回去。有了CEditView和CRichEditView之后,就没有那么辛苦了。
5.模拟卡啦OK变色的步骤。
(1)设置定时器
(2)在定时器中加入代码
具体代码如下:(编完一个之后,注释掉前面的,继续编)
我这里把第五讲分成两个程序,把最后一个卡拉OK输出单独出来了,怕太混乱了。
CXXView:
private:
CBitmap cbitmap;
CPoint m_orgpt;
CString cstring;
CPoint cppt;
位图:
OnDraw:
void CMyTextView::OnDraw(CDC* pDC)
{
CMyTextDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
/*this->CreateSolidCaret(10,20);//创建一个光标
this->ShowCaret();*/ //显示光标,这两个函数都是CWnd的成员函数
/*TEXTMETRIC tm; //这个结构体可以获取字体的信息
pDC->GetTextMetrics(&tm);
this->CreateSolidCaret(tm.tmAveCharWidth/8,tm.tmHeight);//创建一个大小高度比较正常的光标
this->ShowCaret();*/
/*cbitmap.LoadBitmap(BITMAPID);//cbitmap资源一般设置成为成员变量
this->CreateCaret(&cbitmap);//创建了一个位图光标,一闪一闪
this->ShowCaret();*/
/*
//CString cstring("大家好,欢迎一起学习MFC");
CString cstring="大家好,欢迎一起学习MFC";
pDC->TextOut(100,100,cstring);*/
/*CString cstring;
cstring.LoadString(IDS_MYBOLG);
pDC->TextOut(100,100,cstring);*/
/*CString cstring("Hello,欢迎大家一起学习MFC");
CSize cs=pDC->GetTextExtent(cstring);//区别跟TextMetric的不同,这里是根据字符串来获取的
pDC->TextOut(100,100,cstring);
pDC->BeginPath();
pDC->Rectangle(100,100,cs.cx+100,cs.cy+100);//如果没有上下的XXPath,则显示一被白色画刷填充的矩形
pDC->EndPath();
//SelectClipPath的参数,大家不妨多试几种,看看效果
//RGN_AND RGN_COPY RGN_DIFF RGN_OR RGN_XOR
pDC->SelectClipPath(RGN_DIFF);
for(int i=0;i<300;i+=10)//花了横竖很多线条,交叉着
{
pDC->MoveTo(i,0);
pDC->LineTo(i,300);
pDC->MoveTo(0,i);
pDC->LineTo(300,i);
}*/
TEXTMETRIC tm;
pDC->GetTextMetrics(&tm);
this->CreateSolidCaret(tm.tmAveCharWidth/8,tm.tmHeight);
this->ShowCaret();
}
CXXView右键,添加一个WM_Char消息:
生成OnChar方法
void CMyTextView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: Add your message handler code here and/or call default
CClientDC ccdc(this);
TEXTMETRIC tm;
ccdc.GetTextMetrics(&tm);
CFont cfont;
cfont.CreatePointFont(130,"宋体",NULL);
CFont *pcf=ccdc.SelectObject(&cfont);
if(0x0D==nChar)//换行
{
cstring.Empty();//换行清空
m_orgpt.y=m_orgpt.y+tm.tmHeight;//横坐标不变,纵坐标向下一个字符的高度
}
else if (0x08==nChar)//删除键
{
COLORREF bkcolor=ccdc.GetBkColor();//获取背景颜色
COLORREF oldcolor=ccdc.SetTextColor(bkcolor);//设置字体颜色为背景颜色,并且保留设置前的字体颜色
ccdc.TextOut(m_orgpt.x,m_orgpt.y,cstring);//用背景颜色输出文字
cstring=cstring.Left(cstring.GetLength()-1);//去掉最后一个字符
ccdc.SetTextColor(oldcolor);//重新设置原来的字体颜色
}
else
{
cstring+=nChar;//插入字符
}
CSize cs=ccdc.GetTextExtent(cstring);//获取字体矩形的对象
CPoint cpt;
cpt.x=m_orgpt.x+cs.cx;
cpt.y=m_orgpt.y;
this->SetCaretPos(cpt);//重新设置光标的位置
ccdc.TextOut(m_orgpt.x,m_orgpt.y,cstring);//输出字符串
ccdc.SelectObject(pcf);
CView::OnChar(nChar, nRepCnt, nFlags);
}
感觉还是不完美,比如删除,当删除一行之后,应该跳回到上一行的最后,这里都没有判断,请自行测试
下面是单独出来的卡拉OK显示
成员变量:
private:
CString cstring;
int m_width;
构造函数:
CJustTextView::CJustTextView()
{
// TODO: add construction code here
cstring="";
m_width=0;
}
OnDraw函数:
void CJustTextView::OnDraw(CDC* pDC)
{
CJustTextDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
cstring="hello,welcome to myblog,欢迎大家一起学习MFC";
pDC->TextOut(0,200,cstring);
this->SetTimer(1,50,NULL);
}
CXXView右键,添加一个WM_TIMER消息:
自动成成OnTimer方法
void CJustTextView::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
CClientDC ccdc(this);
TEXTMETRIC tm;
ccdc.GetTextMetrics(&tm);
CSize cs=ccdc.GetTextExtent(cstring);
COLORREF oldcolor=ccdc.SetTextColor(RGB(255,0,0));
if(1==nIDEvent)
{
m_width+=5;
CRect crect;
crect.left=0;
crect.top=200;
crect.right=m_width;
crect.bottom=crect.top+tm.tmHeight;
ccdc.DrawText(cstring,&crect,DT_LEFT);
crect.left=0;
crect.top=150;
crect.right=m_width;
crect.bottom=crect.top+tm.tmHeight;
ccdc.DrawText(cstring,&crect,DT_RIGHT);
if(m_width>cs.cx)
{
m_width=0;
ccdc.SetTextColor(RGB(0,255,0));
ccdc.TextOut(0,200,cstring);
COLORREF bkcolor=ccdc.GetBkColor();
ccdc.SetTextColor(bkcolor);
ccdc.TextOut(0,150,cstring);
}
}
CView::OnTimer(nIDEvent);
}
效果图较多,这里不一一截图了:
分享到:
相关推荐
第五课:文本编程 第六课:菜单的工作原理及编写应用 第七课:对话框用户界面程序的编写 第八课:对话框第二部分 第九课:如何修改MFC AppWizard向导生成的框架程序的外观和大小 第十课:图形的绘制,如何使用自定义画笔...
C++学习教程,适合刚入门的朋友,零基础的也可以看这个,我就是学习完这套资源后才学会这个编程,并让我爱上了编程
孙鑫c++视频总结,入门学习,包括算法,数据结构,编译原理
孙鑫C++教程(全20讲)PPT讲义,如果下载了视频,讲义也不可少哦
孙鑫C++教程(全20讲)PPT讲义
自学孙鑫的MFC深入详解,自行编写的MFC文本编程。适合初学MFC的同学参考。
Windows编程知识,VC++面向对象的编程思想,MFC编程,涵盖了软件开发中的绝大部分应用,以及在以后开发中可能出现的问题,由孙鑫老师一一帮你剖析。 5、讲解深刻 在一些重难点知识以及属于操作系统内核编程方面...
孙鑫C++教程(全20讲)PPT讲义-11-20.rar
孙鑫pdf文档,入门C++的好帮手,MFC类库,vc6.0,虽然版本比较老,但是在很多地方使用得仍然比较多。参考性大
孙鑫C++教程(全20讲)PPT讲义.ppt
孙鑫C++视频教程配套讲义,教程B站上有,Windows运行原理方面讲解十分详细,年代有点久远但仍然可以学到很多东西。
C++编程小游戏,讲述c++MFC编程的内容,具体可借鉴孙鑫的MFC视频!
利用vs2015,对孙鑫mfc进行了代码编写 时间,能力原理,有些部分没有进行优化
孙鑫 VC++ 深入详解书中源码
该资源由内附孙鑫讲解的vc++编程1-20课的PPT讲解和详细实现代码,另附c++入门基础的课程,是每位c++编程爱好者必学的课程资源c++编程进阶的必经之路。
C++学习资料,孙鑫老师的教课内容深入浅出,特别适合初学者。
C++最好的软件教程课件
C++笔记 适合MFC初学者 自己看孙鑫MFC深入详解的视频的时候边看边写的 ~~~
学习完孙鑫老师的文本编程之后,添加了能删除上一行的程序 跟文本编辑功能类似。即:可以一直删除到没有文字
孙鑫老师c++教程,比较全面,系统的c++教程视频。