Prograssing

来源:互联网 发布:八面玲珑 知乎 编辑:程序博客网 时间:2024/06/06 00:20

在状态行中显示进度条

这段代码可以在状态行中的任意地方建立一个进度条

1.从View菜单中选择Resource   Symbols,加入一个新的ID(在本例中假设为
  ID_INDICATOR_PROGRESS_PANE),让计算机为该ID赋值也许是较好的选择.  

2.   在MainFrm.cpp中寻找indicators数组,然后在该数组中加入上面新增加的ID,
  请将它放在其它ID的后面,这将使以后的进度条出现在状态行的最右边,如果你
不想   让进度条出现在最右边,你也可以将ID放置在其它你想出现的地方.  

3.   打开资源文件中的字符串表,然后插入一个新字符串.你可以通过Insert菜单
  来加入一个新字符表,或者在字符串表上单击右键也可以完成该工作.  

4.   该字符串的字符为新增的ID,后面的消息,请加入适当的空格.(加入的空格
  至少要比建立的进度条要大)  

现在我们已经建立了一个空的长方形,接下来我们要在这里面放入一个进度条.  

1.   在MainFrm.h中声明一个公共变量,类型为CProgressCtrl(假设为m_progress)  

2.   在MainFrm.h中声明一个保护变量,类型为BOOL(假设为m_bCreated)  

3.   在MainFrm.cpp的OnCreate()函数中,将m_bCreated初始化为FALSE:  

m_bCreated   =   FALSE;

4.   现在当我们需要使用进度条时,我们先检查一下是否已经建立,如果还没有,
那么   我们需要建立一个:  

CMainFrame::OnSomeLongProcess()
{
RECT   MyRect;
//   substitute   4   with   the   zero-based   index   of   your   status   bar   pane.  
//   For   example,   if   you   put   your   pane   first   in   the   indicators   array,  
//   you抎   put   0,   second   you抎   put   1,   etc.
m_wndStatusBar.GetItemRect(4,   &MyRect);    

if   (m_bCreated   ==   FALSE)
{
//Create   the   progress   control
m_Progress.Create(WS_VISIBLE|WS_CHILD,   MyRect,   &wndStatusBar,   1);  

m_Progress.SetRange(0,100);   //Set   the   range   to   between   0   and   100
m_Progress.SetStep(1);   //   Set   the   step   amount
m_bCreated   =   TRUE;
}

//   Now   we抣l   simulate   a   long   process:
for   (int   I   =   0;   I   <100;   I++)   {   Sleep(20);   m_Progress.StepIt();   }   }  
如果窗口在建立进度条之后,改变了大小,那么进度条并不会被重新调整位置,所
以   我们必须在WM_SIZE事件中加入自己的代码来调整该进度条的位置:  

void   CMainFrame::OnSize(UINT   nType,   int   cx,   int   cy)  
{
CMDIFrameWnd::OnSize(nType,   cx,   cy);
RECT   rc;
m_wndStatusBar.GetItemRect(4,   &rc);

//   Reposition   the   progress   control   correctly!
m_Progress.SetWindowPos(&wndTop,   rc.left,   rc.top,   rc.right   -   rc.left,
rc.bottom   -   rc.top,   0);  

}

这就是状态行中实现进度条的方法,虽然看上去很长,但事实上它非常简单.