MFC状态栏的创建与添加进度条

1.首先要创建状态栏

  MFC中创建状态栏是用数组来分隔格子的.所以要先弄个数组

下面在自己继承的CWnd类.cpp文件中定义一个静态数组indicators

static UINT indicators[]=
{
    IDS_STRING104,
    IDS_PROGRESS,
    IDS_STRING105,
    IDS_STRING106
};

这里面的值,可以自己定义,也可以在字符资源中定义

MFC教程是让在字符串资源文件中定义

 

 

下面来创建状态栏了,在MyWnd的WM_CREATE消息中创建,

即OnCreate()函数中

m_statusBar是在类的.h文件中定义的成员变量

CStatusBar m_statusBar;

//创建状态栏
    m_statusBar.CreateEx(this);
    m_statusBar.SetIndicators(indicators, sizeof(indicators) / sizeof(UINT));//用静态数组来分隔状态栏
    m_statusBar.SetPaneInfo(0, IDS_STRING104, SBPS_STRETCH, 0);//设置第一格子填充剩余的空间
    m_statusBar.SetPaneInfo(1,IDS_PROGRESS, SBPS_NORMAL, 100);//设置第二格子的宽度,为添加进度条的宽度

这样就创建好了状态栏了.

 

2.添加进度条到状态栏中

 要想把进度条放到状态栏中,首先要获取状态栏中要放置的格子区域大小,

我要放在第二个格子中,所以就要获取状态栏第二个格子的区域大小.

用状态栏的成员函数GetItemRect()可以获取指定格子的区域

CRect rect;
m_statusBar.GetItemRect(1, &rect);

为了防止窗口大小改变这区域也要相应的改变,所以我把创建进度条放在了WM_SIZE消息中,即OnSize()函数中

m_progressState为类的成员变量,定义在类的.h文件中

CProgressCtrl m_progressState;

void MyWnd::OnSize(UINT nType, int cx, int cy)
{
    CFrameWnd::OnSize(nType, cx, cy);

    // TODO: 在此处添加消息处理程序代码
    CRect rect;
    m_statusBar.GetItemRect(1, &rect);//获取第二个格子的区域大小
    if (m_progressState.m_hWnd)  //判断进度条是否创建了,没创建就创建,创建了就移动到第二个格子的位置
    {
        m_progressState.MoveWindow(rect);//移动进度条
    }
    else
    {
        m_progressState.Create(WS_CHILD | WS_VISIBLE | PBS_SMOOTH, rect, &m_statusBar, 123);//创建进度条,位置就是状态栏的第二格子,父窗口为状态栏
        m_progressState.SetRange(0, 100);//设置进度条的取值范围
        m_progressState.SetPos(50);  //设置进度条的当前位置
    }
}

书上说的是放在WM_PAINT消息中.也可以,看自己的心情呀,反正都一样.

3.效果展示

 

posted @ 2021-06-04 20:42  初吻给了烟灬  阅读(920)  评论(0编辑  收藏  举报