1、1.创建对话框的应用程序 使用 ApWizard创建应用程序框架首 先 , 创 建 一 个 对 话 框 应 用 程 序 , 其 工 程 文 件 名 为 :ch1.dsp。具体步骤如下:( ) 启动 VisualC+6.0, 在 File菜单中选择 new菜单项 ;( 2) 在 new对话框 的 Project页中选择 MFCApWizard( xe)选 项 , 在 Projctnam框 中 输 入 : ch1, 并 在 Loctn框中指定希望的目录路径 , 编译系统生成的各种文件将会存放在该目录下,然后点击 OK按钮( 3) MFCApWizard-Step1中选择 Dialogbsed选项
2、, MFCApWizard-Ste2到 MFCAWzrd-Step4中取默认选项 ;( 4) 进入 VC对话框设计界面后 , 选中 TOD: 在这里设置对 话 控 制 。 静 态 框 并 按 del键 删 除 该 框 , 选 中 取 消 按 钮并 按 del键 删 除 该 按 钮 ; (5) 将 确 认 按 钮 拖 曳 到 对 话 框的下方中间。 生成的对话框设计窗口(如图 1-所示 ) 。图 1-2向类中添加系统消息响应函数Windows应 用 程 序 的 采 用 事 件 触 发 、 消 息 驱 动 机 制 和 大 量 的消息响应函数构成了应用程序的主体 。 本示例需要用到两个消息响应函数
3、OnCtlor()和 OnTimer(), 前者响应窗口消息 : WM_CTLR, 后 者 响 应 窗 口 消 息 : WM_TIER。 关 于 这两个函数的功能和用法暂且略过 , 留待后面小节再叙 。 这里先介绍响应函数加载的方法。 在 Ch1Dlg类中添加 OnCtlor()函数的操作方法如下:( ) 打开类向导 ( MFasWizad) 窗口 , 选择 MesagMps页; ( 2) 选 择 工 程 、 类 和 对 象 标 识 。 在 MesagMps页 的Project、 Clasnme、 ObjectIds框中分别选择: h1、 Ch1Dlg、 Ch1Dlg;( 3) 添 加 响 应
4、 函 数 。 在 MesaMps页 的 Mesag框 中选中并双击窗口消息 : W_CTLOR, 此时 , 消息 W_CTLOR的 响 应 函 数 OnCtlor()被 添 加 到 类 向 导 底 部 MembrFunctios框中。注意 , 添加 OnTimer()函数的过程与上述过程相似 , 只是第( 3)步选择 WM_IER消息,而不是 WM_CTLOR。添加完毕后,按 OK按钮退出类向导。回到项目工作区 , 在项 目 工 作 区 窗 口 展 开 Ch1Dlg类 , 可 以 看 到 类 中 添 加 了OnCtlor()和 OnTimer()两个消息响应函数。1.2静态框控件静态框控件与
5、CStaic类静态框的功能是通过 MF类库中的 CStaic类实现的。静态框可以用来显示文本 、 位图或图元文件等 。 示例 ch1中的日历框和时钟框就是通过静态控件实现的 , 为此 , 下面将围绕示例介绍静态控件使用方法。 首先在对话框中添加一个显示内容为 “ 当前时间 ” 的静态框 ,步骤如下:( 1) 添加静态框 。 参考图 1-, 用鼠标器单击右边控件工具栏 中 静 态 控 件 ( StaicText) 按 钮 , 通 过 鼠 标 在 对 话 框 左边偏上的位置上拖曳出一个静态框 , 调整静态框到合适的大小; ( 2) 打 开 静 态 控 件 属 性 对 话 框 。 右 击 该 静 态
6、 框 , 从 弹 出 菜单 中 选 择 属 性 ( Propetis) 菜 单 项 , 弹 出 属 性 ( TextPropetis)对话框;( 3) 更改静态框中文本内容 。 在属性对话框中选择 Genral页,将 Caption框的内容修改为: 当前时间:( 4) 单击属性对话框右上角的关闭按钮 , 关闭属性对话框 。接着添加一个显示内容为 “ 0:0” 的时钟静态框:( 1) 重复上面 ( 1) 、 ( 2) 两步操作 , 在 “ 当前时间 : ” 静态框下方添加一个新的静态框; ( 2) 更 改 静 态 控 件 标 识 符 和 文 本 内 容 。 在 属 性 对 话 框 中 选择 Ge
7、nral页,将 ID框的标识符IDC_STAIC改 为 : C_STAIC1, 将 Caption框 的 内 容 修 改为: 0:0;( 3)设置文本对齐方式。在属性对话框中选择 Styles页 ,从 Aligntex列表框中选择 Centr选项、在多选框中选中 Vicaly选项;( 4) 设置边框样式 。 在属性对话框中选择 ExtendStyles页,选中 Staicedg项;( 5) 单击属性对话框右上角的关闭按钮 , 关闭属性对话框 。最后,按上述方法在对话框的右侧添加一个日历静态框 , 其属性参数设置如下: ( 1) 在 属 性 对 话 框 中 选 择 Genral页 , 将 ID框
8、 的 标 识 符IDC_STAIC改为: IDC_STAIC2,将 aption框的内容修改为:n204年 03月 n12日 n星期五其中 “ n” 表示换行,而插入空格是为了调整日期显示的位置; ( 2) 在 属 性 对 话 框 中 选 择 Styles页 , 从 Aligntex列 表框中选择 Left选项;( 3) 在属性对话框中选择 ExtendStyles页 , 选中 Modalframe项。 对话框界面设计(如图 1-2所示 ) 。图 1-22更改静态框文本内容程序运行时,用户无法通过键盘输入更改静态框的内容 。 如需要动态地变更静态框的内容 , 可通过编程来实现 。 为此需要 在
9、 Ch3_1Dlg类 中 添 加 两 个 分 别 与 IDC_STAIC1、ID_STAI2静态控件相关成员变量,操作如下:( 1) 在 View菜单中选择 ClasWizard菜单项 , 打开类向导( MFClasWizard)窗口,并选择 MembrVaibles页 ;( 2)添加成员变量 m_Staic1。在 页 的ContrlIds框 中 选 择 标 识 符 IDC_STAIC1, 并 点 击 AdVaibe 按 钮 , 弹 出 添 加 成 员 变 量 ( AdMembrrls) 对话框 , 在成员变量名 ( Membrvaiblsna)框 内 输 入 : m_Staic1, 并 在
10、种 类 ( Catgoy) 、 变 量 类 型( Varibleyp) 框内依次输入或选择 : nrl、 CStaic。按 OK按钮,退出添加成员变量对话框;( 3)添加成员变量 m_Staic2。在 MembrVaibles页 的ContrlIds框 中 选 择 标 识 符 IDC_STAIC2, 并 点 击 AdVaibe 按 钮 , 弹 出 添 加 成 员 变 量 ( AdMembrrls) 对话框 , 在成员变量名 ( Membrvaiblsna)框 内 输 入 : m_Staic2, 并 在 种 类 ( Ctgoy) 、 变 量 类 型( Varibleyp) 框内依次输入或选择 :
11、 nrl、 CStaic。按 OK按钮,退出添加成员变量对话框;( 4)按 按钮,退出类向导( MFClasWizard)窗口 。在项目管理区中双 击 Ch1Dlg类 , 这时程序代码窗 口 Ch1Dlg类的头文件中,可以看到如下代码: /DialogDatAFX_TA(Ch1Dlg)enumID=I_HIALOG;CStaic_Staic2;/由类向导自动插入CStaicm_Staic1;/AFXDTA其中插入了 CStaic类型的成员变量 m_Staic1, 该变量为静态控件对象 , 它通过标识符 IDCTAIC与图 -2中所示的时钟静态框对应 , 而 m_Staic2则通过标识 符 ID
12、C_STAIC2与日历框对应。 在 项 目 管 理 区 中 展 开 Ch3_1Dlg类 , 双 击 OnIitDalog()函数,代码编辑窗口出现该函数 的代码,在该函数的结尾部分加上如下代码: BOLCh1Dlg:OnIitDalog()CDialog:OnIitDalog()/TOD:AdextraintaliztonherCStringstr=_T(“10:10“);m_ac1.SeWindowext(sr/更改时钟框的内容retunTRUE;/runTRUEunlesyousethfocsoactol重 新 编 译 链 接 该 程 序 , 执 行 后 时 钟 框 显 示 的 内 容 为
13、 :10:10。3如何获取当前时间为 了 使 该 静 态 框 能 正 确 显 示 当 前 时 间 , 必 须 要 解 决 两 个 问题 , 首先是如何获取当前系统时间 , 其次是如何才能不断及时 地 刷 新 时 钟 框 的 时 间 。 在 MFC应 用 程 序 中 , 不 但 可 以 调用 WindowsAPI函数 , 也可以使用 语言运行库函数 time_tme(_t*imer);和 structm*loca(consiimer);要及时地刷新时钟框,需要有相应事件来触 发 。 为 此 , 可 以 通 过 加 载 系 统 定 时 器 消 息 WM_TIER的 响应函数 OnTimer()来实
14、现,用户可以通过 Setimr()函数设定定时值 , 这样当定时时间一到 , 函数 OnT就会自动响应。 我 们 已 经 在 Ch1Dlg类 中 加 载 了 OnTimer()函 数 , 在 项 目管理工作区中展开 Ch1Dlg类 , 双击 , 将程序代码区的光标移到该函数,加入如下代码:voidCh1Dlg:OnTimer(UINTnDEvent)/TOD:Adyourmesaghndlercodehrand/orcaldefaulttim_ime;*;inthour,1,minsec;yeamndaywkCStrings;17=“日 ,一 “二 ,“三 四 “,五 “六“;time(/获取
15、当前时间值存入 m_tie=loca(/转换为 t结构类型hurt-mhourmin=_in;sect-msechour1=hour%12;/24小时制转换 成 12小时制year=t-m_year+190;mononday=t-m_day;wekws.Format(“%02d:%02d“,hourmin,sec);/将当前时钟送到 IDC_STAIC1静态框显示m_Staic1.SetWindowext(s);s.For(“%4年 %2d月 n%2d日 n星期 “,yeamon,day);s+=1wk/将当前日历送到 IDC_STAIC2静态框显示m_Staic2.SetWindowext(
16、s);eTr(0,5NUL);/重置定时器CDialog:OnTimer(nIDEvent);为 了 启 动 系 统 定 时 器 , 须 在 Ch1Dlg类 的 初 始 化 函 数OnIitDalog()中加入 SetTimr()函数 , 插入的位置如下 :/TO:AdexranalztionherCStringstr=_T(“10:10“);m_ac1.SeWindowText(sr/更改时钟框的内容SetTir(0,5NUL);/重置定时器runRUE;/retunTRUEunlesyousethfocstoactol编译、运行后如下图4设置静态框字符和背景的颜色静态控件框字符和背景一般使
17、用系统默认的颜色,但也 可以改变默认设置 , 选择用户所需的色彩 。 为了改变控件的颜色 , 一般需要在控件的父窗口 ( 通常是对话框 ) 中添加一个窗口响应函数 OnCtlor()。当控件需要重画时,OnCtlor()函数会被自动调用 , 此函数专门用于更改窗口 、 字符、字符背景颜色或窗口底色。现在 , 通过本示例介绍该函数的使用方法 。 回到项目工作区 ,在 项 目 工 作 区 窗 口 展 开 Ch1Dlg类 , 双 击 响 应 函 数OnCtlor()。代码窗口的光标被移到 OnCtlor()处 ,为了改变静态控件 IDC_STAIC1字符和背景的颜色 , 只需在该函数中加入如下代码即
18、可实现:HBRUSCh1Dlg:OnCtlor(CD*pC,Wnd*pWnd,UINTnCtlor)HBRUShbr=CDialog:OnCtlor(pDC,pWnd,nCtlo);/TOD:ChangeyatributesoftheDCherHBRUSm_brus;/定义画刷句柄switch(nCtlo)caseCTLOR_STAIC:/改 变 静 态 控 件 字 符 的 和 背景颜色 /判断当前重画的控件是否为 IDC_STAICif(pWnd-m_hWnd=m_Staic1.mhWnd|2_)pDC-SetBkMode(TRANSPRENT);/设置透明模式TxClrGB(25,0);设
19、 置 字 符为黄色 m_brush=CreatSolidBrush(RGB0,25);/创建蓝色画刷 retunm_brush;/用蓝色画刷重画控件底色break;/TOD:Returnadiferntbrushifthedfaultisnotdesirdunhb;运行程序,时钟框和日历框出现了蓝底黄字(如图 1-3所示 ) 。图 1-31.3按钮控件按钮控件与 CButon类按钮控件是 Windows应用程序中常用的控件 , 用户通过单击按钮产生一个事件,从而该按钮的响应函数被激励运行 , 完成预定的功能。 现 在 我 们 为 Ch1Dlg类 添 加 一 个 按 钮 控 件 , 按 钮 标
20、题 : 更改 步骤如下: ( 1) 添 加 按 钮 。 用 鼠 标 器 单 击 右 边 控 件 工 具 栏 中 按 钮 控 件( Buton) 按钮 , 通过鼠标在时钟框的下方拖曳出一个按钮 ,调整按钮到合适的大小; ( 2) 打 开 按 钮 控 件 属 性 对 话 框 。 右 击 该 按 钮 , 从 弹 出 菜 单中 选 择 属 性 ( Propetis) 菜 单 项 , 弹 出 属 性 ( TextPropetis)对话框;( 3) 更改按钮文本内容 。 在属性对话框中选择 Genral页 ,ID框的标识符 IDC_BUTON1保持不变 , 将 Captio框的内容修改为:更改; ( 4)
21、 单击属性对话框右上角的关闭按钮 , 关闭属性对话框 ;( 5) 右击 确认 按钮 , 从弹出菜单中选择属性 ( Propetis)菜单项,弹出属性( TextPropetis)对话框;( 6) 在属性对话框中选择 Gnal页 , ID框的标识符 IDOK保持不变,将 Caption框的内容修改为:返回;( 7) 单击属性对话框右上角的关闭按钮 , 关闭属性对话框 。最后的设计界面(如图 1-4所示 ) 。图 1-42按钮响应函数可以方便地为 Ch1Dlg类添加按钮的响应函数。操作如下 :( 1) 参 阅 图 -4, 双 击 更 改 按 钮 , 弹 出 AdMembrFunctio对话框;(
22、2) 在 AdMembrFunctio对 话 框 中 输 入 成 员 函 数 名 :OnButon1;( 3)按 OK按钮,退出 AdMembrFunctio对话框。下面将通过该按钮实现如下功能: 程 序 以 两 种 方 式 显 示 当 前 时 间 , 一 种 是 24小 时 制 , 蓝 底 黄字 ; 另 一 种 是 12小 时 制 , 黄 底 蓝 字 。 要 求 通 过 单 击 更 改 按钮能在两种显示方式之间切换。为此,程序设计如下: ( 1) 在 Ch1Dlg类 的 头 文 件 中 增 加 一 个 整 型 的 成 员 变 量flag,当 fa=0时,以第一种方式显示;当 flag=1时
23、, 以第二种方式显示。变量 flag插入位置如下所示:clasCh1Dlg:pubicCDlog /Implentaionrotcd:inflag;插入的变量HICONm_hIcon( 2) 成 员 变 量 flag为 局 部 变 量 , 在 未 赋 初 值 之 前 , 其 值为一随机数。因此需要在对话框初 始 化 函 数 OnIitDalog()中 添 加 一 句 : flag=0; 即 初 始 化为第一种显示方式。插入的位置如下 所示: BOLCh1Dlg:OnIitDalog()CDialog:OnIitDalog()/TOD:AdextraintaliztonherCStringstr
24、=_T(“10:10“);m_ac1.SeWindowText(sr插入的代码flag=0;/以第一种方式显示时钟SetTimr(,50NUL);runRUE;/retunTRUEunlesyousethfocstoacntol( 3) 由于静态框字符和底色参数的设置由变量 flag的值而决定,所以对更改颜色的响应函 数 OnCtlor()的 代 码 要 作 适 当 修 改 , 修 改 后 的 代 码 如 下所示: HBRUSCh1Dlg:OnCtlor(CD*pC,Wnd*pWnd,UINTnCtlor)HBRUShbr=CDialog:OnCtlor(pDC,pWnd,nCtlo);/TO
25、D:ChangeyatributesoftheDCherHBRUSm_brus;switch(nCtlo)caseCTLOR_STAIC:if(pWnd-mhWnd=m_Staic1.m_hWnd|_ 2)pDC-SetBkMode(TRANSPRENT);if(lag=0)/flag=0,设置黄字、蓝底pDC-SetTxColr(RGB25,25,0);修改后的代码 m_brush=CreatSolidBrush(RGB0,25);els/flag!=0,设置蓝字、黄底pDC-SetTxColr(RGB0,25);m_brush=raeSidush(RGB,25,0);retunm_brus
26、h;/重画控件底色的刷子break;/TOD:Returnadiferntbrushifthedfaultisnotdesirdrunhb;对 OnTimer()函数也要作相应的改动 , 使之能根据变量 flag的值按不同的时制显示当前时间。修改方法如下所示: 将 OnTimer()函数中下列语句s.Foat“ 02d: 02d: 02d“,hour,minsec);/按 24小时制格式化字符串 更改为:if(lag=0)s.Formt(“ 2d: 02d: 02d“,hour,minsec);/按 24小时制格式化字符串elss.Format(“ 02d: 02d: 02d“,hour1,m
27、in,ec);/按 12小时制格式化字符串if(hour=)s+=“PM;els+“AM;( 4) 颜色与时制的切换通过单击按钮 IDC_BUTON1来实现 ,因此需在其响应函数 OnButon1()中加入切换功能的代码,这个切换是通过控制变量 flag的值实现的。添加的代码如下所示:voidCh1D:OnButon1()/TOD:Adyourcntrolntifcationhadlercodeherif(lag=0)flag=1;/如 果 是 蓝 底 黄 字 , 则 切 换 到黄字蓝底 elsflag=0;/否 则 切 换 到 蓝 底 黄 字添加的代码 m_Staic1.Invalidte(ru);/要求重画时钟框2 要求重画日历框将 修 改 后 的 程 序 重 新 编 译 链 接 , 启 动 运 行 , 结 果 如 图 1-5、图 1-6所示。图 1-5图 1-6