一。 创建一个跟当前文本字体大小相符的插入符
1. 在View里增加WM_CREATE消息响应函数
2. 创建DC和TEXTMETRIC:
CClientDC dc(this);
TEXTMETRIC tm;
3. 得到当前窗口的TEXTMETRIC: dc.GetTextMetric(&tm);
4. 创建插入符
CreateSolidCaret(tm.tmAveCharWidth/8, tm.tmHeight);
注意这里/8是一个经验值,经过试验得到8是最好的。。。
5. 显示插入符
ShowCaret();
二。在窗口某位置增加一个文本
1. 在View::OnDraw函数里增加一个CString
CString str("panda");
2. pDC->TextOut(50, 50, str);
50, 50是x, y坐标值
OnDraw函数是在重绘的时候调用的,所以在这个函数里写文本不会因为变动窗口位置或者大小而被擦除
这里第一步还可以在资源里的string table里增加一个CString,再str.LoadString(ID);
三。在一片网格中有些文字,文字上面就没有网格
通过路径程来实现
1. 先确定文字段的大小
CSize sz = pDC->GetTextExtent(str);
2. 开始画路径程
pDC->BeginPath();
3. 画一个矩形
pDC->Rectangle(50, 50, 50+sz.cx, 50+sz.cy);
4. 结束路径程
pDC->EndPath();
5. 选择路径程方式
pDC->SelectClipPath(RGN_DIFF);
四。实现字符输入
1. 在View的WM_LBUTTONDOWN消息响应函数里设置光标位置
SetCaretPos(point);
2. 对View的成员变量m_strLine清空
m_strLine.Empty();
3. 保存当前坐标值
m_ptOrigin = point;
4. 在View的WM_CHAR消息响应函数里如果nChar是回车(0x0d)
a) m_strLine清空
b) 改变m_ptOrigin坐标y值: m_ptOrigin.y += tm.tmHeight;
5. 如果nChar是回车(0x08)
这里将文字刷成背景色
a) 设置整串文字为背景色:COLORREF clr = dc.SelectTextColor(dc.GetBkColor());
这里SelectTextColor跟SelectObject类似,返回的是原来的TextColor
b) dc.TextOut(m_ptOrigin.x, m_ptOrigin.y, m_strLine);
c) 减少m_strLine最有边字符:m_strLine = m_strLine.Left(m_strLine.GetLength()-1);
d) 还原文字颜色:dc.SetTextColor(clr);
6. 否则如果是字符:m_strLine += nChar;
7. 改变光标点:
CSize sz = dc.GetTextExtent(m_strLine);
CPoint pt;
pt.x = m_ptOrigin.x + sz.cx;
pt.y = m_ptOrigin.y + sz.cy;
SetCaretPos(pt);
8. dc.TextOut(m_ptOrigin.x, m_ptOrgin.y, m_strLine);
1 void CTextView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) 2 { 3 // TODO: 在此添加消息处理程序代码和/或调用默认值 4 CClientDC dc(this); 5 6 TEXTMETRIC tm; 7 dc.GetTextMetrics(&tm); 8 if (0x0d == nChar) { 9 m_strLine.Empty(); 10 m_ptOrigin.y += tm.tmHeight; 11 } 12 else if (0x08 == nChar) { 13 COLORREF clr = dc.SetTextColor(dc.GetBkColor()); 14 dc.TextOutA(m_ptOrigin.x, m_ptOrigin.y, m_strLine); 15 m_strLine = m_strLine.Left(m_strLine.GetLength()-1); 16 dc.SetTextColor(clr); 17 } 18 else { 19 m_strLine += (wchar_t)nChar; 20 } 21 CSize sz = dc.GetTextExtent(m_strLine); 22 23 CPoint pt; 24 pt.x = m_ptOrigin.x + sz.cx; 25 pt.y = m_ptOrigin.y; 26 27 SetCaretPos(pt); 28 dc.TextOutA(m_ptOrigin.x, m_ptOrigin.y, m_strLine); 29 30 CView::OnChar(nChar, nRepCnt, nFlags); 31 }
五。改变字体
1 CFont font; 2 font.CreatePointFont(300, "华文行楷", NULL); 3 CFont *pOldFont = dc.SelectObject(&font); 4 5 ...... 6 7 8 dc.SelectObject(pOldFont);
其他:创建图形插入符, 模拟卡拉OK变色字体
感觉没什么意义