MFC: 孙鑫教程5笔记

一。 创建一个跟当前文本字体大小相符的插入符

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 }
View Code

 

五。改变字体

1 CFont font;

2 font.CreatePointFont(300, "华文行楷", NULL);

3 CFont *pOldFont = dc.SelectObject(&font);

4 

5 ......

6 

7 

8 dc.SelectObject(pOldFont);
View Code

 

其他:创建图形插入符, 模拟卡拉OK变色字体

感觉没什么意义

你可能感兴趣的:(mfc)