VC深入浅出学习笔记(三)

上一课都是画画,这一课是文本编程。
先建立一个单文档的MFC程序。
①创建插入符号
 WM_CREATE
CClientDC dc(this);
 CreateSolidCaret(int nWidth,int nHeight);
ShowCaret();
注:调节Caret高度,有两个类似的函数
TEXTMETRICS tm;
dc.GetTextMetrics(&tm);
CSize sz=dc.GetTextExtent()GetTextMetrics:获取当前字体的信息
GetTextExtent:获取特定的字符串在屏幕上所占的宽度和高度
http://www.cnblogs.com/sqzxcv/archive/2010/01/02/1638043.html
 
这里用GetTextMetrics。 CreateSolidCaret(tm.tmWidth/8,tm.tmHeight);
另外还有重载CreateSolidCaret(*bitmap);
我们可以CBitmap bitmap;bitmap.LoadBitmapW(ID);图的ID在资源里。
②插入符号跟随鼠标。
WM_LBOTTONDOWN
SetCaretPos(point);
③输入响应(wm_char)
建立私有变量,并在鼠标左键消息时,记录和初始化。
此处实现一个较弱的wm_char的功能,按行输出,回车则重新记录位置和string
m_strLine.Empty();
 m_ptOrigin=point;
在此之前先设置字体
	CClientDC dc(this);
	CFont font;
	font.CreatePointFont(300,_T("华文行楷"),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 oldcolor=dc.SetTextColor(dc.GetBkColor());
		dc.TextOutW(m_ptOrigin.x,m_ptOrigin.y,m_strLine);
		m_strLine=m_strLine.Left(m_strLine.GetLength()-1);
		dc.SetTextColor(oldcolor);
	}
	else
	{
		m_strLine += (wchar_t)nChar;
	}


之后把str输出,并设置好caret的位置,还原字体
 CSize size=dc.GetTextExtent(m_strLine);

 CPoint point;
 point.x=m_ptOrigin.x+size.cx;
 point.y=m_ptOrigin.y;
 SetCaretPos(point);
 dc.TextOutW(m_ptOrigin.x,m_ptOrigin.y,m_strLine);

 dc.SelectObject(poldfont);


③在on_draw的时候就输出一些文字
和上一课类似,TextOutW输出,不用考虑caret
CString可以通过LoadString 初始化。
pDC->BeginPath();// 路径层
pDC->Rectangle();
pDC->EndPath();
pDC->SelectClipPath(int mode); 可以选择操作区域(与或非)//好像没解释的太清楚
可以把一个区域保护下来。
void CTextView::OnDraw(CDC* pDC)
{

.....

CString str;
 str="shalk is here";
  pDC->TextOutW(50,50,str);

 CSize size=pDC->GetTextExtent(str);

 str.LoadStringW(IDS_XIAO);
 pDC->TextOutW(0,200,str);

 pDC->BeginPath();
 pDC->Rectangle(50,50,50+size.cx,50+size.cy);
 pDC->EndPath();


 //CPen pen(PS_SOLID,1,RGB(255,0,0));
 //CPen *oldpen=pDC->SelectObject(&pen);
 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);
 }

....

}



 ④卡拉OK的颜色字体渐变效果。
先把文字显示出来,然后从左到右,文字颜色逐渐变化。
在On_timer中 矩形区域宽度逐渐变大。不断的drawtext 到头了,再停止,或者重复。
 
 m_nWidth+=5;
 TEXTMETRIC tm;
 CClientDC dc(this);
 dc.GetTextMetrics(&tm);
 CRect rect;
 rect.left=0;
 rect.top =200;
 rect.right=m_nWidth;
 rect.bottom=200+tm.tmHeight;

 dc.SetTextColor(RGB(255,0,0));
 CString str;
 str.LoadStringW(ID);
 dc.DrawText(str,rect,DT_LEFT);

  CSize sz=dc.GetTextExtent(str);
 if(m_nWidth>sz.cx)
 {
  m_nWidth=0;
  dc.SetTextColor(RGB(0,255,0));
  dc.TextOutW(0,200,str);
 }



 
 
posted @ 2011-12-16 10:13  程序员杰诺斯  阅读(92)  评论(0编辑  收藏  举报