注意:其实只需要1、8两步就可以完成操作,其他的步骤没有起作用,写出来只是让大家明白创建的具体思路;
1、在CMainFrame的头文件中新建一个CProgressCtrl 的对象m_progress;
2、在CMainFrame的头文件中定义一个消息:
#define UM_PROGRESS WM_USER+1
3、在注释宏下声明消息响应函数原型:
afx_msg void OnProgress();
4、消息映射:
ON_MESSAGE(UM_PROGRESS,OnProgress)
5、消息响应函数的实现部分:
void CMainFrame::OnProgress()
{
CRect rect;//创建一个矩形区域
m_wndStatusBar.GetItemRect(2,&rect);//获取状态栏所设定状态栏所占的矩形区域
m_progress.Create(WS_CHILD|WS_VISIBLE|PBS_VERTICAL,rect,&m_wndStatusBar,123);//创建状态栏
m_progress.SetPos(50);//设定状态栏当前位置为50%
}
6、在oncreate中添加:
PostMessage(UM_PROGRESS);
7、当窗口尺寸变化的时候,进度栏的位置就回变化,所以只用以上的步骤还是没有完成进度栏的创建:
8、在CMainFrame中增加消息处理,WM_PAINT增加处理器并编辑,代码如下:
void CMainFrame::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
CRect rect;
m_wndStatusBar.GetItemRect(2,&rect);
if(!m_progress.m_hWnd)
m_progress.Create(WS_CHILD | WS_VISIBLE,rect,&m_wndStatusBar,123);
else
m_progress.MoveWindow(rect); //将进度栏移动到矩形区域中
m_progress.SetPos(50);
// Do not call CFrameWnd::OnPaint() for painting messages
}
注意:其实只需要1、8两步就可以完成操作,其他的步骤没有起作用,写出来只是让大家明白创建的具体思路;
8、让进度栏“动起来”
在OnTimer中添加代码:
m_wndStatusBar.SetPaneInfo(1,IDS_TIMER,SBPS_NORMAL,sz.cx);
m_wndStatusBar.SetPaneText(m_wndStatusBar.CommandToIndex(IDS_TIMER),str);//在状态栏面板上显示时间
m_progress.StepIt();
运行即可;
9、完成一个功能,当移动鼠标时,在第一个状态栏中显示鼠标的坐标值:
在view类中天剑WM_MOUSEMOVE,在OnMouseMove中添加代码如下:
void CStytleView::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CString str;
str.Format("x = %d,y = %d",point.x,point.y);//格式化鼠标的坐标
//((CMainFrame*)GetParent())->m_wndStatusBar.SetWindowText(str);//在最长的状态栏中显示str,方法一
//((CMainFrame*)GetParent())->SetMessageText(str); 方法二
//((CMainFrame*)GetParent())->GetMessageBar()->SetWindowText(str); 方法三
GetParent()->GetDescendantWindow(AFX_IDW_STATUS_BAR)->SetWindowText(str); //方法四
CView::OnMouseMove(nFlags, point);
}
10、添加启动画面
在工程-添加到工程-组建和控件-Visual C++ Components-splash screen-insert -确定-(可以修改类型或ID)-ok-编译-运行
在系统自动添加的类CSplashWnd中更改oncreate函数中的SetTimer(1, 3000, NULL)既可以改变启动画面显示的时间;