章 后 习 题
练习题 1 键盘字符输入,并使输入的文本居中
1、该程序的主要工作:
(1)处理Windows消息
(2)使用Visual C++ ClassWizard(类向导)
(3)读取来自键盘的键击
(4)设置显示文本的格式
(5)决定窗口的尺寸
(6)决定文本串的屏幕尺寸
2、用到的一个主要函数是字符消息处理框架函数
afx_msg void OnChar(UNIT nChar,UINT nRepCnt,UINT nFlags)
参数:nChar表示键盘码
nRepCnt表示按键的个数
nFlags表示字符消息标志
Windows操作系统是通过格式化的消息在应用程序中通信的,每个事件发生后,Windows就将它转化为一条消息,判断这条消息应该由哪个窗口来处理,然后将该消息发往该窗口,并交由该窗口的拥有程序去处理,这就是Windows的消息处理机制。
程序编写步骤:
(1)建一个单文档应用程序,名为:键盘输入
(2)为键盘数据建立存储
在文档类CMyDoc.h文件的public下写:
CString str; //定义字符串对象
在文档类CMyDoc.cpp的构造函数里写:
str=“ ”; //将字符串对象置为空
当用户键入每个键时,就把它们送到str中
(3)读取键击
当用户键入一个键时,Windows将会发送给我们一个WM_CHAR消息,把这个消息连到视图类(CMyView)中,并在函数OnChar()中加下列代码:
CMyView::OnChar(UINT nChar,UINT nRepCnt,UINT nFlags)
{ CMyDoc *pDoc=GetDocument(); //获取文档类首地址指针 ASSERT_VALID(pDoc); //测试指针 pDoc->str+=nChar; //读取键击 Invalidate(); //重绘视图,强制绘图 } |
(4)显示文本
Invalidate()函数通过调用OnDraw()函数,强制程序重绘视图,故在View.cpp里加: CMyView::OnDraw(CDC *pDC) { ——- pDC->TextOut(20,20,pDoc->str); //在文档窗口的x=20,y=20处显示敲入的信息 } |
(5)编译运行,键盘输入字符,便在窗口上显示出来。
说 明:
1、pDoc->str+=nChar; 相当于pDoc->str=pDoc->str+nChar;
2、Draw函数是视图显示函数
(5)将文本居中
CWnd派生出CView,再由CView派生出CCenteredView类,该类使文本居中。可使用CWnd的GetWindowRect()函数,得到客户区的尺寸。
CRect类用于容纳矩形的尺寸和大小,我们把CRect对象的指针传递到GetWindowRect()
函数,来获得视图的尺寸。在OnDraw()函数里加下列代码:
void CMyView::OnDraw(CDC* pDC) { CMyDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); //pDC->TextOut(20,20,pDoc->str);//此条语句是前面加的 CRect rect; // CRect类用于容纳矩形的尺寸和大小 GetWindowRect(&rect);//得到客户区的尺寸 int x=rect.Width()/2; //确定中心坐标x,y int y=rect.Height()/2; CSize size=pDC->GetTextExtent(pDoc->str);//查明显示的文本串尺寸 x-=size.cx/2; y-=size.cy/2; pDC->TextOut(x,y,pDoc->str); } |
(6)编译运行,键盘输入字符,便在窗口中间显示出来,如图1所示。
说 明:
使用CDC类(设备环境类)的GetTextExtent()函数来决定文本串将显示在客户区的尺寸。CSize类有2个重要的成员,cx和cy用于保留文本串的尺寸。
x,y表示窗口新的左上角坐标cx,cy表示窗口新的宽度和高度RECT结构:
typedef struct tayRECT { LONG left; //左上角x坐标 LONG top; //左上角y坐标 LONG right; //右下角x坐标 LONG bottom;//右下角y坐标 }RECT; //CRect类用于容纳矩形的尺寸和大小 SIZE结构://窗口大小 typedef struct tagSIZE { int cx; //当一个函数返回时的x范围 int cy; //当一个函数返回时的y范围 }SIZE; |
//定义颜色变量 在View.h的public里写: COLORREF m_pColor; 在View.cpp的构造函数里写: m_pColor=RGB(255,0,0); //红色 在刚加进去的pDC->TextOut(x,y,pDoc->str);语句的前面加: //显示红色的字体 pDC->SetTextColor(m_pColor); |
前面介绍了读取键盘的键击的编程过程,实际上,在我们创建单文档(或双文档)应用程序时,到第6步(最后一步)停住,在这个界面的最下方Base class处下拉,找到CEditView置好,再点Finish之后运行,在程序的文档窗口上,直接就能读取来自键盘的键击。
练习题2 向窗口中添加一个闪亮的插入符,插入符出现在文本末尾,指示下一个字符的位置;
当用户单击另一个窗口或别处时,会将焦点移向那个窗口,隐藏插入符,当鼠标回到本窗口
单击时,又获得焦点,显示插入符。
(1)建立一个单文档应用程序,名为:插入符
(2)在文档类CMyDoc.h里加(public下面):CString str;
(3)在文档类CMyDoc.cpp里的构造函数里加:str=“ ”; //置空
(4)向视图类CMyView里加映射消息OnChar()即:WM_CHAR读取键击,并加代码:
void CMyView::OnChar(UINT nChar,UINT nRepCnt,UINT nFlags) { CMyDoc *pDoc=GetDocument();//获得文档类指针 ASSERT_VALID(pDoc); //测试文档指针 pDoc->str+=nChar; Invalidate(); } |
(5)在视图类CMyView.h里加:(可在protected下面加)
//布尔类型对象,以了解是否已创建了该插入符,boolean变量也称boolean标志,有2个值:真和假。
boolean car;
(6)在视图类CMyView.cpp的构造函数中将car设为假:car=false;
(7)在视图类CMyvoid CMyView::OnDraw(CDC *pDC) 加代码:
{ ……………. |