通行证: 用户 密码 域名空间  下载中心 社区论坛 信息公告 MY小屋
联系我们
设为首页
加入收藏

 

QQ,ASP,PHP,JSP,XML,SQL,.Net,编程 程序 网页图象 建站经验 私服
首页 | 新闻资讯 | 编程开发 | 网页设计 | 图形图象 | 网络媒体 | 网站模板 | 数 据 库 | 投稿
论坛 | 操作系统 | 系统优化 | 网络安全 | 黑客技术 | 硬件学堂 | 硬件报价 | 服 务 器 | 地图
专题 | 应用软件 | 聊天通讯 | Q Q 专栏 | 建站经验 | 在线工具 | 站长Club | 注 册 表 | 旧版
社会 | 游戏娱乐 | 设计欣赏 | 疑难解答 | 社区论坛 | 韩国素材 | 素材图库 | 广告服务 | 服务
当前位置:首页>>编程开发>>VC编程>>正文 新版上线![旧版]
注:打开慢时请稍等

『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
特别声明: 本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作者。文章版权归文章原始作者所有。对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转载的文章有版权问题请联系编辑人员,我们尽快予以更正。

 相关文章
用VC++自制王码五笔输入法安装包  在VC++项目中为MDI主框架窗口添加位图 VC++编程实现对火焰的计算机动态仿真
VC下ADO开发实践之一 VC制作具有声音效果的动画桌面精灵 VC中如何等比例缩放图像
在VC中调用DirectShow全屏播放视频 『VC++技术内幕』学习笔记(9) 『VC++技术内幕』学习笔记(7)
『VC++技术内幕』学习笔记(6) 『VC++技术内幕』学习笔记(5) 『VC++技术内幕』学习笔记(4)
『VC++技术内幕』学习笔记(3) 『VC++技术内幕』学习笔记(2) 『VC++技术内幕』学习笔记(1)
『VC++技术内幕』学习笔记(目录) 如何利用VC的Remote Debug功能 如何把VC++代码转换成VB代码?
VC编程实现IE风格的界面 在VC中如何将数据导入Word中 VC++实现拨号上网程序详解
VC一点通:实现文件夹的缩略图显示 VC下TabCtrl的控制问题解决办法 VC高级学习:编程本质论
最新更新 热点排行 推荐新闻
用VC++自制王码五笔输入法安装包 
在线资源指导
实用组件介绍
如何以最佳方式购买组件
ActiveX和OCX组件资源
用VC++自制王码五笔输入法安装包 
在线资源指导
实用组件介绍
如何以最佳方式购买组件
ActiveX和OCX组件资源
建立安装程序
收 集 文 件
理解各种打包类型
打包应用程序
向应用程序增加基于HTML的帮助
VC++实现对远程计算机屏幕的监视
用VC++6.0的Sockets API实现一个聊天室
多线程技术在VC++串口通信程序中的应用
用VC++制作一个简单的局域网消息发送工
用VC 6.0实现串行通信的三种方法
优秀公益广告作品欣赏(8)
java数据类型转换
Windows XP专业版IIS连接数的更改
新开放QQ免费挂级网站
优秀公益广告作品欣赏(7)
免费在QQ上看在线电影电视听音乐
WEB服务器配置全攻略(三)
QQ珊瑚虫外挂4.0版本发布!
免费把QQ炫铃设为本机QQ的系统提示音
Office2007简体中文版浮出水面 美图抢
微软将在华推分期付款,充值卡PC 可低价
 AMD处理器AM2测试 风扇竟运行7分钟
exeplorer.exe错误的问题的总结、解决
ASP.NET 2.0 中的异步页功能应用
硬盘坏道修复及数据恢复宝典
免费登录搜索引擎入口大全
搜索引擎注册九大秘法
小心摄像头成为黑客偷窥你的眼睛
内存混插常见问题和解决方法
Office2007简体中文版浮出水面 美图抢
 友情链接
设置首 页 - 版权声明 - 广告服务 - 关于我们 - 联系我们 - 友情连接
Copyrights © 2004-2006 iYiT.Net All Rights Reserved.
网站合作、广告联系QQ:147007642、466949678
易特网络技术 点击这里给我发消息