MFC(文本编程,孙鑫C++第五讲笔记整理)

以下是第五讲的主要内容(文本输入输出,要先设置光标位置,然后再输出文本)

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.VCCString::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;


位图:

MFC(文本编程,孙鑫C++第五讲笔记整理)_第1张图片

 

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(文本编程,孙鑫C++第五讲笔记整理)_第2张图片

你可能感兴趣的:(C++,timer,测试,null,mfc,construction)