文字编辑方面 内容比较杂 我觉得就是现用现学无需过于深入 所以只把相应代码贴下加以说明
首先要创建插入符
需要这CWnd的两个成员函数CreateSolidCaret和ShowCaret
CClientDC dc(this);
TEXTMETRIC tm;
dc.GetTextMetrics(&tm); //这里是获取字体信息 为了让插入符与字体大小一致
CreateSolidCaret(tm.tmAveCharWidth/8,tm.tmHeight);
另外若创建位图插入符 可如下操作
bitmap.LoadBitmapW(IDB_BITMAP1);
CreateCaret(&bitmap);
ShowCaret();
让插入符移动到着鼠标左键点击位置首先当然是添加一个左键响应函数 然后在里面加入如下函数
SetCaretPos(point);
恩 顾名思义 不多说了
然后我们在OnDraw成员函数上添加重绘代码了
CString str("I am the best");
//str="hello";
pDC->TextOutW(50,50,str);
//想得到当前DC中字体的信息,可以用GetTextMetrics,一般用得多的是取得字体高度。
//GetTextExtent得到给定字符串的尺寸:高和宽,对具体的文字是准确的输出占用的尺寸。
CSize sz=pDC->GetTextExtent(str);
str.LoadStringW(IDS_MY);
pDC->TextOutW(0,250,str);
//路径程
pDC->BeginPath();
pDC->Rectangle(50,50,50+sz.cx,50+sz.cy);
pDC->EndPath();
pDC->SelectClipPath(RGN_DIFF); //用于路径程与其他区域进行交互
//画网格
for(int i=0;i<300;i+=30)
{
pDC->MoveTo(0,i);
pDC->LineTo(300,i);
pDC->MoveTo(i,0);
pDC->LineTo(i,300);
}
下面是实现输入文字 换行 退格等功能
void C文本编辑View::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
CClientDC dc(this);
CFont font;
font.CreatePointFont(300,L"幼圆",NULL); //改变字体
CFont *pOld=dc.SelectObject(&font);
TEXTMETRIC tm;
dc.GetTextMetrics(&tm);
//回车
if(0x0d==nChar)
{
m_string.Empty(); //清空字符串
m_point.y+=tm.tmHeight;
}
//退格
else if(0x08==nChar)
{
COLORREF clr=dc.SetTextColor(dc.GetBkColor()); //设置文本背景色
dc.TextOutW(m_point.x,m_point.y,m_string);
m_string=m_string.Left(m_string.GetLength()-1); //去掉一个字符
dc.SetTextColor(clr);
}
else
{
//接收字符
m_string+=(TCHAR)nChar;
}
dc.TextOutW(m_point.x,m_point.y,m_string);
//获取字符串宽度 使插入符右移
CSize sz=dc.GetText(m_string);
CPoint pt;
pt.x=m_point.x+sz.cx;
pt.y=m_point.y+sz.cy;
SetCaretPos(pt);
dc.SelectObject(&pOld);
CView::OnChar(nChar, nRepCnt, nFlags);
}
下面是 做文字的一些动态效果 这个靠想象力了 也不多说
主要就是 SetTimer和DrawText的应用
void C文本编辑View::OnTimer(UINT_PTR nIDEvent)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
m_width+=5;
CClientDC dc(this);
TEXTMETRIC tm;
dc.GetTextMetrics(&tm);
CRect rect;
rect.left=0;
rect.top=250;
rect.right=m_width;
rect.bottom=rect.top+tm.tmHeight;
dc.SetTextColor(RGB(255,0,0));
CString str;
str.LoadStringW(IDS_MY);
dc.DrawText(str,rect,DT_LEFT);
rect.top=100;
rect.bottom=rect.top+tm.tmHeight;
dc.DrawText(str,rect,DT_RIGHT);
CSize sz=dc.GetTextExtent(str);
if(m_width>sz.cx)
{
m_width=0;
dc.SetTextColor(RGB(0,255,0));
dc.TextOutW(0,250,str);
}
CView::OnTimer(nIDEvent);
}