| 域名空间 下载中心 社区论坛 信息公告 MY小屋 |
![]() |
联系我们 设为首页 加入收藏 |
|
首页 | 新闻资讯 | 编程开发 | 网页设计 | 图形图象 | 网络媒体 | 网站模板 | 数 据 库 | 投稿 论坛 | 操作系统 | 系统优化 | 网络安全 | 黑客技术 | 硬件学堂 | 硬件报价 | 服 务 器 | 地图 专题 | 应用软件 | 聊天通讯 | Q Q 专栏 | 建站经验 | 在线工具 | 站长Club | 注 册 表 | 旧版 社会 | 游戏娱乐 | 设计欣赏 | 疑难解答 | 社区论坛 | 韩国素材 | 素材图库 | 广告服务 | 服务 |
| 新版上线![旧版] | |||||
注:打开慢时请稍等
『VC++技术内幕』学习笔记(10)http://www.iyit.net 日期:2006-5-23 11:50:15 来源:本站整理转载 点击: |
大家好,雷神由于出差在外,所以笔记今天才写出抱歉。不知道大家有没有做上篇提到的计算器,计算器对雷神来说可是经典的程序,学VB先搞了计算器,学VC也搞了个计算器,前不久在学扩展CBUTTON类时也是用计算器程序,为什么?按钮多呗,雷神最终做出了一个圆形按钮,液晶显示的计算器,感觉真的不错。学编程就是要编写代码,代码写的多少和编程水平是成正比的。 由对话框编辑器和Class Wizard生成的对话框可以很轻松的不需编写很多的代码而获得很多的功能,但如果我们想对对话框进一步的改进则需要手工编程了。 我们以上一篇的电脑体育彩票选号小程序为例进行一系列的改进工作。 改进一:截获退出控制权 当我们的光标不在选号按钮上时(例如在文本框内),当按下回车(Enter)键则回退出程序的运行,还有当你按下ESC键时也会退出。为什么?因为当用户按下回车键时Windows就会自动查找“输入焦点”在哪个按钮上,如果所有的按钮都没有获得输入焦点,Windows会自动的寻找程序资源指定的默认按钮,如果对话框没有默认按钮,系统会调用OnOK函数。ESC键也会触发对OnCancel函数的调用,从而导致控制从对话框中退出。如果我们想截获退出控制权该如何做呢?用哑函数,就是将按下Enter和ESC后的处理函数写成空函数。 步骤1、由于我们的对话框没有OK和CANCEL按钮,我们只能手工添加代码。在guessDlg.h文件的类声名重载:virtual void OnOK()和virtual void OnCancel();两个虚函数。 class CGuessDlg : public CDialog { ....... // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CGuessDlg) protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support virtual void OnOK(); virtual void OnCancel(); //}}AFX_VIRTUAL ....... }; 步骤2、在guessDlg.cpp文件加入两个哑函数OnOK和OnCancel。 void CGuessDlg::OnOK () { } void CGuessDlg::OnCancel() { } 好了在编译运行,按ESC和在文本框内点一下鼠标,按下回车(Enter)键,上一篇的问题不存在了,程序不会退出,彻底退不出了,只能通过任务管理器退了,这可不行,我们还需要继续改进。 步骤3、添加一个按钮,叫退出。加入这个按钮的消息控制函数如下: void CGuessDlg::OnButton2() { CDialog::OnOK(); } 这回可以了,我们已经掌握了对话框退出控制权。 改进二:改变对话框的外观 我们可以改变对话框的背景颜色,或对话框中的控件颜色以使得程序界面不至于千篇一律,如何做呢?每个控件和对话框在显示之前回发送WM_CTLCOLOR消息,如果派生对话框类对WM_CTLCOLOR消息进行了映射,就可以设定文本的前景色和背景色。同时还可以为控件或对话框的非文本区域选择一个刷子。 WM_CTLCOLOR消息对应的函数为OnCtlColor,OnCtlColor函数的原型为:afx_msg HBRUSH OnCtlColor( CDC* pDC, CWnd* pWnd, UINT nCtlColor );其中参数pDC是:一个指向设备环境的指针。pWnd:指定特定的控件。nCtlColor:指明控件类型。 可以有以下类型: CTLCOLOR_BTN button control CTLCOLOR_DLG dialog box CTLCOLOR_EDIT edit control CTLCOLOR_LISTBOX list box CTLCOLOR_MSGBOX message box CTLCOLOR_SCROLLBAR scroll bar CTLCOLOR_STATIC static text, frame, or rectangle 现在为了突出显示文本框的显示号码,我们将文本框的文字背景设为黄色。 步骤1、添加一个成员变量 HBRUSH m_hBrush; 步骤2、用Class Wizard为CGuessDlg加入WM_CTLCOLOR消息,并编辑OnCtlColor函数: HBRUSH CGuessDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { if(nCtlColor==CTLCOLOR_EDIT){ pDC->SetBkColor (RGB(255,255,0));//EDIT控件文字背景为黄色 return m_hBrush; } return CDialog::OnCtlColor (pDC,pWnd,nCtlColor); } 编译运行,怎么样,文本框内的文字均变为黄底了。关于对话框的外观我们将在以后再说。 改进三、增加进度条。 程序在随机产生号码时没有任何提示,我们不知道程序是否在运行,怎么办?我们增加一个进度条控件,用来观察程序的运行状况。 步骤1、在对话框编辑器中增加一个进度条控件(Progress),并在CGuessDlg为进度条增加一个成员变量。int m_nProgress; 步骤2、将CGuessDlg::OnButton1()用下面代码替换。 void CGuessDlg::OnButton1() { m_nProgress=0;//初始进度条为0 CProgressCtrl *pProg=(CProgressCtrl*)GetDlgItem(IDC_PROGRESS1); pProg->SetRange (0,70);//设定进度条范围为0-70 int temp,pnum[35],num[7]; //临时变量,临时数组 for(int i=0;i<35;i++) //赋值,以作选号用 pnum[i]=i+1; //***选号过程:***// for(i=0;i<7;i++) { srand( (unsigned)time( NULL ) ); //srand(3); temp=rand(); //取随机种子数 temp=temp%36+1; //取小于35的数组元素 while(pnum[temp]==0)//如果是已被选过的元素,重选 { srand( (unsigned)time( NULL ) ); temp=rand(); temp=temp%36+1; } m_nProgress+=10;//进度加10 num[i]=temp; //选定一个号码 pnum[temp]=0; //给该元素置0,表示已被选过 UpdateData(TRUE);//刷新 pProg->SetPos (m_nProgress); } /*** 在选完号码后,应该为它们排一下序:***/ //排序部分无变化省略。 } 编译运行它,好了,有了进度显示我们可以知道程序的运行情况了。 在这篇笔记中我们通过对上一篇所写的小程序的改进,掌握了一些改进对话框的方法,不用书上的例子是想给大家多个例子参考,不过书上的例子一定要掌握。好了关于模式对话框我们已经掌握,下一篇我们将继续学习无模式对话框。 未完待续 编辑:黑鹰 [发送给好友] [打印本页] [关闭窗口] [返回顶部] 上一篇:『VC++技术内幕』学习笔记(9) 下一篇:关于DAO数据库编程的几点经验 转载请注明来源:www.iyit.net 特别声明: 本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作者。文章版权归文章原始作者所有。对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转载的文章有版权问题请联系编辑人员,我们尽快予以更正。 |
| 最新更新 | 热点排行 | 推荐新闻 | |||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||
| 友情链接 | ||||||
| 设置首 页 - 版权声明 - 广告服务 - 关于我们 - 联系我们 - 友情连接 |
| |||||||