当前位置: 代码迷 >> 综合 >> 孙鑫VC++深入详解:Lesson9 Part6---在状态栏中添加进度条
  详细解决方案

孙鑫VC++深入详解:Lesson9 Part6---在状态栏中添加进度条

热度:94   发布时间:2024-01-19 15:13:39.0

最直接的办法就是:

//------ 窗口改变是重绘进度条. 
// 到此可见,其实就一个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);
然后实现:
<