reated,该变量用来标志CProgressCtrl控件是否成功进行创建。
6、在源文件MainFrm.cpp的OnCreate()函数中,初始化m_bCreated 为 FALSE,如下所示:
m_bCreated = FALSE;
7、模拟一个耗时过程函数OnSomeLongProcess()来演示状态条中的进程状态格。这里简单地采用睡眠函数来模拟一个耗时过程。函数代码见
程序1。
void CMainFrame::OnSomeLongProcess()
{
RECT MyRect;
// substitute 1 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(1, &MyRect);
if (m_bCreated == FALSE)
{
//Create the progress control
m_Progress.Create(WS_VISIBLE|WS_CHILD, MyRect, &m_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''ll simulate a long process:
for (int I = 0; I <100; I++)
{
Sleep(20);
m_Progress.StepIt();
}
}
8、状态条中的进程状态格创建成功后,如果应用
程序主窗口尺寸发生变化,则进程状态格的大小不会自动适应主窗口的变化,因此需要重载主窗口的OnSize()函数。通过 ClassWizard在主窗口中增加WM_SIZE消息映射函数,如图3所示。
(图注ZHUANG-3) 图3 利用ClassWizard在CmainFrame中增加WM_SIZE消息映射函数
具体的源代码见
程序2。
void CMainFrame::OnSize(UINT nType, int cx, int cy)
{
CFrameWnd::OnSize(nType, cx, cy);
// TODO: Add your message handler code here
if(m_bCreated == TRUE){
RECT rc;
m_wndStatusBar.GetItemRect(1, &rc);
// Reposition the progress control correctly!
m_Progress.SetWindowPos(&wndTop, rc.left, rc.top, rc.right -
rc.left,
rc.bottom - rc.top, SWP_SHOWWINDOW);
}
}
9、打开资源编辑器,在“查看”菜单下增加"Test"菜单命令,ID设为ID_TEST。然后利用ClassWizard增加一条消息映射函数OnTest(),代码如下:
void CMainFrame::OnTest()
{
// TODO: Add your command
handler code here
OnSomeLongProcess();
在完成所有上述步骤后,编译并运行
程序。选择“查看”菜单下的"Test"菜单命令就会看到状态条中的进程状态格的进程显示情况,如图4所示。
(图注ZHUANG-4) 图4 状态条中的进程状态格的进程显示
上面我们用一个简单的睡眠函数模拟了耗时过程中状态条的进程状态格的显示情况。在实际应用中我们只需将源码中的OnSomeLongProcess()函数替换成相应的耗时过程函数即可。
(作者地址:武汉华中理工大学电子科学与技术系 430074 收稿日期:1999.5.28)