最直接的办法就是:
//------ 窗口改变是重绘进度条.
// 到此可见,其实就一个OnPaint()就可以了,什么PostMessage(),自定义消息,实现自定义消息函数都可以不要了.
void CMainFrame::OnPaint()
{CPaintDC dc(this); // device context for painting// TODO: Add your message handler code hereCRect rect;m_wndStatusBar.GetItemRect(2,&rect);if(m_progress.m_hWnd==NULL) //先判断,如果进度条没创建就创建{m_progress.Create(WS_CHILD|WS_VISIBLE,rect,&m_wndStatusBar,123);m_progress.SetPos(50);}else m_progress.MoveWindow(rect); // Do not call CFrameWnd::OnPaint() for painting messages
}
//------------------- 以下为学习过程.
1.进度栏类:CProgressCtrl是有CWnd派生而来,因此进度条也是窗口
2.CProgressCtrl m_progress; //定义进度栏成员3.在OnCreate()中创建:
m_progress.Create(WS_CHILD|WS_VISIBLE,CRect(100,100,200,120),this,123);//默认是水平的
m_progress.SetPos(50);//进度条的位置
4.把进度栏放置到状态栏中的进度栏处,实际是覆盖在其上:
1)先获得状态栏中的进度栏的矩形大小,用状态栏的成员函数CStatusBar::GetItemRect()
2)调用OnCreate(),其中父窗口要改为状态栏
CRect rect;
m_wndStatusBar.GetItemRect(2,&rect);
m_progress.Create(WS_CHILD|WS_VISIBLE,rect,&m_wndStatusBar,123);
m_progress.SetPos(50);
上述代码中的rect其实没有真正得到状态栏的矩形值,是因为在OnCreate中状态栏的初始化工作,即对窗口的摆放还没有完成.
所以不能获得其真正的矩形位置.
解决办法:让OnCrete()函数完全执行完成后在执行上述代码,把上述代码写成一个用户自定义的消息函数OnProgress(),
在OnCreate()中Post一个自定义的消息UM_PROGRESS即PostMessage(UM_PROGRESS),并把该消息按照
消息映射的规则与OnProgress()关联: ON_MESSAGE(UM_PROGRESS,OnProgress).
注1:#define UM_PROGRESS WM_USER+1
注2:不能用SendMessage(UM_PROGRESS),因为SendMessage()不能立即返回到OnCreate()中.
具体代码:
在头文件MainFrm.h
#define UM_PROGRESS WM_USER +1
CProgressCtrl m_progress; //定义进度栏成员
afx_msg void OnProgress(); //在头文件中申明消息响应函数
在MainFrm.cpp中:
先在OnCreate()中PostMessage(UM_PROGRESS);
然后实现:
<