上一课都是画画,这一课是文本编程。
先建立一个单文档的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);
}