您好,欢迎访问三七文档
当前位置:首页 > 办公文档 > 述职报告 > (已读)第九章在窗体上写字
第九章在窗体上写字从前面的例程中我们看到,要在视窗式的应用程序中显示文字可用静态文本、编辑框和弹出消息框等方法。另外的一种方法是直接在窗口面版上写字,用这种方法还可以自由设置字体、大小和颜色。在窗体上写字实际上是“画”字,需要先创建一个可以“画”的对象——CPaintDC对象。本章要点1用CFont类和创建字体2如何在窗体上写字?3单选按钮组的用法4利用列表框进行选择9.1CFont类简介要设置字体需要创建一个CFont类对象,然后利用它的CreateFont()函数来设置当前字体。CreateFont()有14个参数,下面我们用代码加注释的方法简要介绍,详情可查阅MSDN连机帮助文档,参看MFC库手册。CFontmyFont;//创建一个字体对象myFont.CreateFont(16,//1.字体高度。0,//2.=0表示保持纵横比0,0,//3.4.角度400,//5.线的宽度,400为正常FALSE,FALSE,0,//6.7.8.斜体,下划线,删除线(否)ANSI_CHARSET,//9.字符集OUT_DEFAULT_PRECIS,//10.精度CLIP_DEFAULT_PRECIS,//11.DEFAULT_QUALITY,//12.质量DEFAULT_PITCH|FF_SWISS,//13.强度和家族Arial//14.字体名称);这14个参数中第一个和最后一个最重要。第一个表示字体高度,它决定了字符的大小,数值16表示字符举行的高为16个点,字体大小与你在本文中看到的差不多。而第二个参数=0表示保持纵横比,这就字体的宽度了。最后一个字体名称用字符串表示,你的机器上有些什么字体好用,你打开记事本程序就可以查到。9.2MyFont.exe程序的界面和功能本例程我们设计一个应用程序可以不同大小和颜色的字体来显示用户任意输入的字符串。图chap09-01当你在下面的编辑框中输入一行文字后,窗口内会同时显示两行文本。你可以用左边的单选按钮选择字体大小,文本大小会立即改变。你可以在左下角的列表框中选择文本的颜色,但要点击[设置]按钮后才生效。输入文字后的界面如图02。图chap09-029.3设计MyFont程序的界面按照图1和参考下列属性表设计界面。控件标题ID其它属性编辑框-IDC_DATA_EDIT按钮设置IDC_SET_BUTTON按钮EXITID_EXIT_BUTTONStyles:默认按钮组框SizeIDC_STATIC单选按钮组8,16,24...IDC_SIZE_RADIO0IDC_SIZE_RADIO1...列表框-IDC_COLOR_LIST选择方式=simple;Border选中主对话框MyFontIDD_MYFONT_DIALOG9.4编写在窗体上写字的代码给编辑框引进CString类的变量m_DataEdit。为了在窗体上显示一行提示语,我们在OnPaint()函数中用默认字体来写字。CPaintDCdc(this);//参看:《深入编程内幕——Visual+C++》第41页UpdateData(TRUE);//Allowdrawontothepanaldc.SetBkMode(TRANSPARENT);dc.TextOut(100,10,请输入一行文本,Inputatextplease.);语句1创建一个绘画的设备环境变量(对象)dc。语句2用TRUE允许更新。语句3设置北京模式为透明的。语句4用函数TextOut()输出文字,起始位置在坐标(100,0)处,窗口的左上角为坐标原点(0,0)。下面紧接着创建新字体并用编辑框的输入信息来画字,代码如下:dc.TextOut(100,60,m_DataEdit);CFontmyFont;myFont.CreateFont(16,0,0,0,400,FALSE,FALSE,0,ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH|FF_SWISS,Arial);//UsenewFont,storeoldfontCFont*pOldFont=dc.SelectObject(&myFont);dc.TextOut(100,120,m_DataEdit);dc.SelectObject(pOldFont);//以上两段参看语句dc.TextOut(...)的前一语句的功能是,创建一个CFont对象pOldFont来寄存老字体,函数SelectObject()的功能是设置由参数指定的字体为当前字体。你立马就会明白,后一语句的功能就是恢复老字体为当前字体了。为了让编辑框的输入能够写出来,就必须在编辑框有输入时让窗口重新画一遍。这需要给编辑框添加消息映射EN_CHANGE,在自动生成的OnChangeDataEdit()函数中加入语句:Invalidate();它会调用OnPaint()函数重画窗口。给[EXIT]按钮写好退出代码,保存、编译、连接和运行,输入文字已经能够显示了。9.5设计单选按钮组和列表框单选按钮组的功能是:点击某个按钮就改变字体的大小重画窗体。为此,需要把这六个单选按钮归并为一组。方法是把第一个按钮IDC_SIZE_RADIO0设置为组属性,就是选中Group选项。但是,其他几个单选按钮的组属性必须为“不选中”。图chap09-03这样,这组控件就是一个整体,选择某一个,就返回它的索引号,按钮IDC_SIZE_RADIO0的索引号是0,下一个是1,2...等。我们只要给第一个按钮IDC_SIZE_RADIO0设置变量m_Size,它就代表这个组。现在来修改代码,把ONPaint()函数中创建字体的语句中的“字体高度”修改一下就行:myFont.CreateFont(8+8*m_Size,0,0,0,400,我们设定每个单选按钮相隔8点,因为第一个按钮的索引号是0,所以H的值是8,下一个是24,...。为了在点击某个单选按钮时发出消息要求窗体重画,需要给每个单选按钮引进BN_ONCLICK事件,给响应函数添加要求重画的代码Invalidate()。例如,按钮IDC_SIZE_RADIO0的函数为:,voidCMyFontDlg::OnSizeRadio1(){//TODO:AddyourcontrolnotificationhandlercodehereInvalidate();}操作时,你只要双击改按钮,就弹处确认对话框,当你[确定]后,就添加了响应函数并定位到那里可,可立即输入代码了。现在再编译和运行,观看改变字体大小的效果。编写列表框选择颜色的代码设计时列表框的“选择方式”必须是单一选择,即simple,因为我们只能使用一种颜色啊。对列表框的、选择结果也是通过返回的索引号来识别的。在列表框中显示的项不能在设计时给定,需要在初始化函数OnInitDialog()中用代码来实现:m_Size=0;UpdateData(TRUE);m_Color_List.AddString(黑色);m_Color_List.AddString(红色);m_Color_List.AddString(绿色);m_Color_List.AddString(蓝色);在OnPaint()函数中需要增加设置颜色的语句。设置文本颜色用dc.SetTextColor(RGB(255,0,0))函数,其中参数RGB(255,0,0)是颜色类型RGB的构造函数,数值表示红色。一般格式是RGB(red,green,blue),取值0~255。为了列表框的成员函数来返回用户选择的索引号,需要引进列表框控件型变量m_Color_List,于是用m_Color_List.GetCaretIndex()就获得了索引号,根据索引号设置颜色,代码如下:switch(m_Color_List.GetCaretIndex()){case0:dc.SetTextColor(RGB(0,0,0));break;case1:dc.SetTextColor(RGB(255,0,0));break;case3:dc.SetTextColor(RGB(0,255,0));break;case2:dc.SetTextColor(RGB(0,0,255));break;default:dc.SetTextColor(RGB(0,0,0));break;}这些代码都要在语句dc.TextOut(100,120,m_DataEdit);之前。最后,要让[设置]按钮使用颜色生效,还要加入能够重画的语句Invalidate()。重新编译和运行后,就可以用不同的颜色和大小的字体来写字了。9.6附录OnPaint()函数全文为了方便读者使用,下面把OnPaint()函数全部复制下来,着色部分是我们自己的代码。voidCMyFontDlg::OnPaint(){if(IsIconic()){CPaintDCdc(this);//devicecontextforpaintingSendMessage(WM_ICONERASEBKGND,(WPARAM)dc.GetSafeHdc(),0);//CentericoninclientrectangleintcxIcon=GetSystemMetrics(SM_CXICON);intcyIcon=GetSystemMetrics(SM_CYICON);CRectrect;GetClientRect(&rect);intx=(rect.Width()-cxIcon+1)/2;inty=(rect.Height()-cyIcon+1)/2;//Drawtheicondc.DrawIcon(x,y,m_hIcon);}else{//MycodestartfromhereCPaintDCdc(this);//UpdateData(TRUE);//Allowdrawontothepanaldc.SetBkMode(TRANSPARENT);dc.TextOut(100,10,请输入一行文本,Inputatextplease.);dc.TextOut(100,60,m_DataEdit);//CreateanewfontCFontmyFont;myFont.CreateFont(16+8*m_Size,0,0,0,400,FALSE,FALSE,0,ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH|FF_SWISS,Arial);//UsenewFont,storeoldfomtCFont*pOldFont=dc.SelectObject(&myFont);//Settextcolorswitch(m_Color_List.GetCaretIndex()){case0:dc.SetTextColor(RGB(0,0,0));break;case1:dc.SetTextColor(RGB(255,0,0));break;case3:dc.SetTextColor(RGB(0,255,0));break;case2:dc.SetTextColor(RGB(0,0,255));break;default:dc.SetTextColor(RGB(0,0,0));break;}dc.TextOut(100,120,m_DataEdit);//RestoreoldFontdc.SelectObject(pOldFont);//MycodeendCDialog::OnPaint();}}练习和思考1单选按钮组没有一个是被选择的,这不符合常规。如何修改使得显示第一个按钮是选中状态?2设计一个弹出对话框,其中有一个列表框提供4-5种字体(含两种汉字字体)。利用它来改变主窗口显示的字体(FaceFont)。
本文标题:(已读)第九章在窗体上写字
链接地址:https://www.777doc.com/doc-3113039 .html