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);//设置第二格子的宽度,为添加进度条的宽度
这样就创建好了状态栏了.
要想把进度条放到状态栏中,首先要获取状态栏中要放置的格子区域大小,
我要放在第二个格子中,所以就要获取状态栏第二个格子的区域大小.
用状态栏的成员函数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消息中.也可以,看自己的心情呀,反正都一样.
原文:https://www.cnblogs.com/greenleaf1976/p/14851278.html