当前位置:文档之家› MFC第五讲

MFC第五讲

MFC第五讲
MFC第五讲

MFC(文本编程,孙鑫C++第五讲笔记整理)

分类:MFC2012-08-13 18:40 1610人阅读评论(1) 收藏举报以下是第五讲的主要内容(文本输入输出,要先设置光标位置,然后再输出文本)

1.CWnd::CreateSolidCaret创建插入符,ShowCaret()显示插入符。GetTextMetrics(),获得当前字体的一些信息。CWnd::CreateCaret()创建图象插入符

bitmap.LoadBitmap(IDB_BITMAP1);//此处的bitmap为成员变量!!!

CreateCaret(&bitmap);

ShowCaret();

TEXTMETRIC tm;//字体结构体

dc.GetTextMetrics(&tm);//

m_ptOrigin.y+=tm.tmHeight;//获得字体高度。

2.VC中CString::LoadString(ID号),比较方便。

3.路径层的概念:有两种方法创建路径层:

(1)

pDC->BeginPath();

pDC->Rectangle(50,50,50+sz.cx,50+sz.cy);

pDC->EndPath();

pDC->SelectClipPath(RGN_DIFF);

(2)

CSize sz=pDC->GetTextExtent(str);

CRgn rn;

rn.CreateRectRgn(0,50,sz.cx,sz.cy);

pDC->SelectClipRgn(&rn,RGN_DIFF);

路径层有什么作用?可以保护我们先前的文本或者图像不被后来画的覆盖。

4.在View上输入文字的步骤。

CFont font;//创建字体对象

font.CreatePointFont(300,"华文行楷",NULL);//设置

CFont *pOldFont=dc.SelectObject(&font);//将字体选择到DC中TEXTMETRIC tm;//创建字体信息对象

dc.GetTextMetrics(&tm);//获得当前字体信息

if(0x0d==nChar)//处理回车键

{

m_strLine.Empty();

m_ptOrigin.y+=tm.tmHeight;

}

else if(0x08==nChar)//处理退格键

{

COLORREF clr=dc.SetTextColor(dc.GetBkColor());

dc.TextOut(m_ptOrigin.x,m_ptOrigin.y,m_strLine);

m_strLine=m_strLine.Left(m_strLine.GetLength()-1);

dc.SetTextColor(clr);

}

else

{

m_strLine+=nChar;

}

CSize sz=dc.GetTextExtent(m_strLine); CPoint pt;//处理光标的位置

pt.x=m_ptOrigin.x+sz.cx;

pt.y=m_ptOrigin.y; SetCaretPos(pt);

dc.TextOut(m_ptOrigin.x,m_ptOrigin.y,m_strLine);//输出字体

dc.SelectObject(pOldFont);//将原先的字体选择回去。有了CEditView 和CRichEditView之后,就没有那么辛苦了。

5.模拟卡啦OK变色的步骤。

(1)设置定时器

(2)在定时器中加入代码

具体代码如下:(编完一个之后,注释掉前面的,继续编)

我这里把第五讲分成两个程序,把最后一个卡拉OK输出单独出来了,怕太混乱了。

CXXView:

1private:

2 CBitmap cbitmap;

3 CPoint m_orgpt;

4 CString cstring;

5 CPoint cppt;

位图:

OnDraw:

6void CMyTextView::OnDraw(CDC* pDC)

7{

8 CMyTextDoc* pDoc = GetDocument();

9 ASSERT_VALID(pDoc);

10 // TODO: add draw code for native data here

11

12 /*this->CreateSolidCaret(10,20);//创建一个光标

13 this->ShowCaret();*/ //显示光标,这两个函数都是CWnd的成员函数

14

15

16 /*TEXTMETRIC tm; //这个结构体可以获取字体的信息

17 pDC->GetTextMetrics(&tm);

18 this->CreateSolidCaret(tm.tmAveCharWidth/8,tm.tmHeight);//创建一个大小高度

比较正常的光标

19 this->ShowCaret();*/

20

21

22 /*cbitmap.LoadBitmap(BITMAPID);//cbitmap资源一般设置成为成员变量

23 this->CreateCaret(&cbitmap);//创建了一个位图光标,一闪一闪

24 this->ShowCaret();*/

25

26 /*

27 //CString cstring("大家好,欢迎一起学习MFC");

28 CString cstring="大家好,欢迎一起学习MFC";

29 pDC->TextOut(100,100,cstring);*/

30

31 /*CString cstring;

32 cstring.LoadString(IDS_MYBOLG);

33 pDC->TextOut(100,100,cstring);*/

34

35

36 /*CString cstring("Hello,欢迎大家一起学习MFC");

37 CSize cs=pDC->GetTextExtent(cstring);//区别跟TextMetric的不同,这里是根据字

符串来获取的

38 pDC->TextOut(100,100,cstring);

39 pDC->BeginPath();

40 pDC->Rectangle(100,100,cs.cx+100,cs.cy+100);//如果没有上下的XXPath,则显示

一被白色画刷填充的矩形

41 pDC->EndPath();

42

43

44 //SelectClipPath的参数,大家不妨多试几种,看看效果

45 //RGN_AND RGN_COPY RGN_DIFF RGN_OR RGN_XOR

46 pDC->SelectClipPath(RGN_DIFF);

47 for(int i=0;i<300;i+=10)//花了横竖很多线条,交叉着

48 {

49 pDC->MoveTo(i,0);

50 pDC->LineTo(i,300);

51

52 pDC->MoveTo(0,i);

53 pDC->LineTo(300,i);

54 }*/

55

56 TEXTMETRIC tm;

57 pDC->GetTextMetrics(&tm);

58

59 this->CreateSolidCaret(tm.tmAveCharWidth/8,tm.tmHeight);

60 this->ShowCaret();

61

62

63}

CXXView右键,添加一个WM_Char消息:

生成OnChar方法

64void CMyTextView::OnChar(UINT nChar, UINT

nRepCnt, UINT nFlags)

65{

66 // TODO: Add your message handler code here and/or call default

67

68 CClientDC ccdc(this);

69 TEXTMETRIC tm;

70 ccdc.GetTextMetrics(&tm);

71

72 CFont cfont;

73 cfont.CreatePointFont(130,"宋体",NULL);

74

75 CFont *pcf=ccdc.SelectObject(&cfont);

76

77 if(0x0D==nChar)//换行

78 {

79

80 cstring.Empty();//换行清空

81m_orgpt.y=m_orgpt.y+tm.tmHeight;//横坐标不变,纵坐标向下一个字符的高度

82 }

83 else if (0x08==nChar)//删除键

84 {

85

86 COLORREF bkcolor=ccdc.GetBkColor();//获取背景颜色

87 COLORREF oldcolor=ccdc.SetTextColor(bkcolor);//设置字体颜色为背景颜色,并且保留设置前的字体颜色

88 ccdc.TextOut(m_orgpt.x,m_orgpt.y,cstring);//用背景颜色输出文字

89cstring=cstring.Left(cstring.GetLength()-1);//去掉最后一个字符

90 ccdc.SetTextColor(oldcolor);//重新设置原来的字体颜色

91

92 }

93 else

94 {

95 cstring+=nChar;//插入字符

96 }

97

98 CSize cs=ccdc.GetTextExtent(cstring);//获取字体矩形的对象

99 CPoint cpt;

100cpt.x=m_orgpt.x+cs.cx;

101cpt.y=m_orgpt.y;

102 this->SetCaretPos(cpt);//重新设置光标的位置

103 ccdc.TextOut(m_orgpt.x,m_orgpt.y,cstring);//输出字符串

104

105 ccdc.SelectObject(pcf);

106

107 CView::OnChar(nChar, nRepCnt, nFlags);

108}

感觉还是不完美,比如删除,当删除一行之后,应该跳回到上一行的最后,这里都没有判断,请自行测试

下面是单独出来的卡拉OK显示

成员变量:

109private:

110 CString cstring;

111 int m_width;

构造函数:

112CJustTextView::CJustTextView()

113{

114 // TODO: add construction code here

115cstring="";

116m_width=0;

117}

OnDraw函数:

118void CJustTextView::OnDraw(CDC* pDC)

119{

120 CJustTextDoc* pDoc = GetDocument();

121 ASSERT_VALID(pDoc);

122 // TODO: add draw code for native data here

123

124cstring="hello,welcome to myblog,欢迎大家一起学习MFC";

125

126 pDC->TextOut(0,200,cstring);

127

128 this->SetTimer(1,50,NULL);

129

130

131

132

133}

CXXView右键,添加一个WM_TIMER消息:

自动成成OnTimer方法

134void CJustTextView::OnTimer(UINT nIDEvent)

135{

136 // TODO: Add your message handler code here and/or call default 137

138 CClientDC ccdc(this);

139 TEXTMETRIC tm;

140 ccdc.GetTextMetrics(&tm);

141

142 CSize cs=ccdc.GetTextExtent(cstring);

143 COLORREF oldcolor=ccdc.SetTextColor(RGB(255,0,0));

144 if(1==nIDEvent)

145 {

146 m_width+=5;

147

148 CRect crect;

149crect.left=0;

150crect.top=200;

151crect.right=m_width;

152crect.bottom=crect.top+tm.tmHeight;

153

154 ccdc.DrawText(cstring,&crect,DT_LEFT);

155

156crect.left=0;

157crect.top=150;

158crect.right=m_width;

159crect.bottom=crect.top+tm.tmHeight;

160

161 ccdc.DrawText(cstring,&crect,DT_RIGHT);

162

163 if(m_width>cs.cx)

164 {

165m_width=0;

166 ccdc.SetTextColor(RGB(0,255,0));

167 ccdc.TextOut(0,200,cstring);

168

169 COLORREF bkcolor=ccdc.GetBkColor();

170 ccdc.SetTextColor(bkcolor);

171 ccdc.TextOut(0,150,cstring);

172

173 }

174

175 }

176

177

178 CView::OnTimer(nIDEvent);

179}

效果图较多,这里不一一截图了:

相关主题
文本预览
相关文档 最新文档