首页 考试吧论坛 Exam8视线 考试商城 网络课程 模拟考试 考友录 实用文档 求职招聘 论文下载 | ||
2012中考 | 2012高考 | 2012考研 | 考研培训 | 在职研 | 自学考试 | 成人高考 | 法律硕士 | MBA考试 MPA考试 | 中科院 |
||
四六级 | 职称英语 | 商务英语 | 公共英语 | 托福 | 托业 | 雅思 | 专四专八 | 口译笔译 | 博思 GRE GMAT | 新概念英语 | 成人英语三级 | 申硕英语 | 攻硕英语 | 职称日语 | 日语学习 | 零起点法语 | 零起点德语 | 零起点韩语 |
||
计算机等级考试 | 软件水平考试 | 职称计算机 | 微软认证 | 思科认证 | Oracle认证 | Linux认证 华为认证 | Java认证 |
||
公务员 | 报关员 | 银行从业资格 | 证券从业资格 | 期货从业资格 | 司法考试 | 法律顾问 | 导游资格 报检员 | 教师资格 | 社会工作者 | 外销员 | 国际商务师 | 跟单员 | 单证员 | 物流师 | 价格鉴证师 人力资源 | 管理咨询师 | 秘书资格 | 心理咨询师 | 出版专业资格 | 广告师职业水平 | 驾驶员 网络编辑 | 公共营养师 | 国际货运代理人 | 保险从业资格 | 电子商务师 | 普通话 | 企业培训师 营销师 |
||
卫生资格 | 执业医师 | 执业药师 | 执业护士 | ||
会计从业资格考试(会计证) | 经济师 | 会计职称 | 注册会计师 | 审计师 | 注册税务师 注册资产评估师 | 高级会计师 | ACCA | 统计师 | 精算师 | 理财规划师 | 国际内审师 |
||
一级建造师 | 二级建造师 | 造价工程师 | 造价员 | 咨询工程师 | 监理工程师 | 安全工程师 质量工程师 | 物业管理师 | 招标师 | 结构工程师 | 建筑师 | 房地产估价师 | 土地估价师 | 岩土师 设备监理师 | 房地产经纪人 | 投资项目管理师 | 土地登记代理人 | 环境影响评价师 | 环保工程师 城市规划师 | 公路监理师 | 公路造价师 | 安全评价师 | 电气工程师 | 注册测绘师 | 注册计量师 化工工程师 | 材料员 |
||
缤纷校园 | 实用文档 | 英语学习 | 作文大全 | 求职招聘 | 论文下载 | 访谈 | 游戏 |
9.5创建进度条
MFC中,有一个CProgressCtrl的类,如果要创建一个进度条,首先需要创建一个CProgressCtrl类的对象,然后调用Create成员函数来创建。MSDN中给出了一个相关的实例程序。
1 CProgressCtrl myCtrl;
2 // Create a smooth child progress control.
3 myCtrl.Create(WS_CHILD|WS_VISIBLE|PBS_SMOOTH, CRect(10,10,200,30),
4 pParentWnd, 1);
如何要在状态栏中创建一个进度条?
状态栏属于框架类,在状态栏中创建进度条,首先同样需要获取创建的区域。这之前需要String表中添加进度条的字串。然后将字串ID添加到:
1 static UINT indicators[] =
2 {
3 ID_SEPARATOR, // status line indicator
4 ID_INDICATOR_CAPS,
5 ID_INDICATOR_NUM,
6 ID_INDICATOR_SCRL,
7 IDS_PROGRESS,//用来显示进度条区域
8 };
为了获取进度条所处于的区域,可以调用GetItemRect函数。
void GetItemRect(index,LPRECT lprect) const;其中第一个参数为状态栏中网格的在indicators[]中的索引号。由于OnCreate函数实际上是响应的WM_ OnCreate函数,只有在这个函数完成之后才能获取到状态栏的矩形区域。因此需要在此处添加一个消息响应函数,等窗口创建完成之后,发送生成进度条消息。
MFC的每个标准消息都有一个消息编号,要创新一个新的消息,首先要创建消息编号。
1、 在Frame的头文件中添加一个消息标识宏#define UM_PROGRESS WM_USER+1;
2、 按照标准消息的格式和流程,分别在头文件和源文件中添加消息映射。
头文件
1 //{{AFX_MSG(CMainFrame)
2 afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
3 afx_msg void OnTimer(UINT nIDEvent);
4 afx_msg void OnPaint();
5 afx_msg void OnProgress();//消息
6 //}}AFX_MSG
源文件
1 //{{AFX_MSG_MAP(CMainFrame)
2 ON_WM_CREATE()
3 ON_WM_TIMER()
4 ON_WM_PAINT()
5 ON_MESSAGE(UM_PROGRESS,OnProgress) //消息
6 //}}AFX_MSG_MAP
3、 在源文件中添加消息响应函数
1 void CMainFrame::OnProgress()
2 {
3 CRect rect;
4 m_wndStatusBar.GetItemRect(5,&rect);
5 m_cpc.Create(WS_CHILD|WS_VISIBLE|PBS_SMOOTH,rect,&m_wndStatusBar,123);
6 m_cpc.SetPos(50);
7 }
4、 在源文件的OnCreate函数中添加PostMessage(UM_PROGRESS);
这样便可以在状态栏动态创建一个进度条。这里有个一SendMessage函数和PostMessage函数的区别说明。
1、 SendMessage:直接把消息发送给消息响应函数,等消息响应函数处理完之后再返回。
2、 PostMessage:把消息发送到消息队列,然后立即返回。
由于OnProgress函数需要在OnCreate执行完之后再响应,因此此处采用PostMessage函数来发送该消息。
创建进度条完成之后,显示正常,但是如果此时拉动窗口,改变大小,会发现进度条的位置不正确了,为了保证进度条的位置正确,需要添加OnPaint函数。
01 void CMainFrame::OnPaint()
02 {
03 CPaintDC dc(this); // device conText for painting
04 // TODO: Add your message handler code here
05 CRect rect;
06 m_wndStatusBar.GetItemRect(5,&rect);
07 if(!m_cpc.m_hWnd)
08 {
09 m_cpc.Create(WS_CHILD|WS_VISIBLE|PBS_SMOOTH,rect,&m_wndStatusBar,123);
10 }
11 else
12 {
13 m_cpc.MoveWindow(rect);
14 }
15 m_cpc.SetPos(50);
16 // Do not call CFrameWnd::OnPaint() for painting messages
17 }
因此WM_PAINT消息是自动执行的,这样就不需要在OnCreate函数中再添加PostMessage函数来发送消息了。
完成进度条的创建之后,可以再OnTimer函数中添加代码,实现进度条的动态效果,代码就不贴上来了,都是调用相关函数来实现。
9.6在状态栏上显示鼠标
在View类上添加WM_MOUEOVER函数
1 void CStyleView::OnMouseMove(UINT nFlags, CPoint point)
2 {
3 // TODO: Add your message handler code here and/or call default
4 CString str;
5 str.Format("x=%d y=%d",point.x,point.y);
6 ((CMainFrame*)GetParent())->m_wndStatusBar.SetWindowText(str);
7 CView::OnMouseMove(nFlags, point);
8 }
这之前需要在View类中引入Frame类的头文件,并将Frame类的m_wndStatusBar设置为public。
相关推荐:
北京 | 天津 | 上海 | 江苏 | 山东 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
广东 | 河北 | 湖南 | 广西 | 河南 |
海南 | 湖北 | 四川 | 重庆 | 云南 |
贵州 | 西藏 | 新疆 | 陕西 | 山西 |
宁夏 | 甘肃 | 青海 | 辽宁 | 吉林 |
黑龙江 | 内蒙古 |