MFC中三个最基本的控件的介绍,它们分别是:ProgressControl、ScrollBarControl以及SpinControl。
1.ProgressControl
实现的功能如下所示:
关键代码如下:
开始按钮对应的代码如下所示:
void CProgressDemoDlg::OnBnClickedBtnStart()
{
m_progress.SetPos(0);
SetTimer(1, 100, nullptr);
GetDlgItem(IDC_BTN_START)->EnableWindow(FALSE);
/*int nMax, nMin, nPos;
m_progress.GetRange(nMin, nMax);
for (; nMin<nMax; ++nMin)
{
m_progress.SetPos(nMin);
Sleep(100);
}*/
}
为了避免界面被卡死的情况,我们还需要添加一个定时器timer,通过类向导添加WM_TIMER消息即可。
void CProgressDemoDlg::OnTimer(UINT_PTR nIDEvent)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
int nMax, nMin, nPos;
m_progress.GetRange(nMin, nMax);
nPos = m_progress.GetPos();
++nPos;
if (nPos > nMax)
{
KillTimer(1);
//nPos = 0;
GetDlgItem(IDC_BTN_START)->EnableWindow();
}
m_progress.SetPos(nPos);
CDialogEx::OnTimer(nIDEvent);
}
2.ScrollBarContro
实现的功能如下所示:
这个控件实现起来稍微有一些麻烦,主要代码如下所示:
通过类向导添加WM_HSCROLL消息,代码如下:
void CScrollBarDemoDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
SCROLLINFO scrollinfo = { 0 };
scrollinfo.cbSize = sizeof(SCROLLINFO);
scrollinfo.fMask = SIF_ALL;
pScrollBar->GetScrollInfo(&scrollinfo);
int nNewPos = scrollinfo.nPos;
switch (nSBCode)
{
case SB_THUMBTRACK: // 用户拖动滚动条
nNewPos = nPos;
break;
case SB_LINELEFT: // 左边的按钮
nNewPos -= 1;
break;
case SB_LINERIGHT: // 右边的按钮
nNewPos += 1;
break;
case SB_PAGELEFT: // 按页数向左边滚动
nNewPos -= scrollinfo.nPage;
break;
case SB_PAGERIGHT: // 按页数向右边滚动
nNewPos += scrollinfo.nPage;
break;
default:
break;
}
scrollinfo.nPos = nNewPos;
pScrollBar->SetScrollInfo(&scrollinfo);
if (nNewPos > scrollinfo.nMax)
{
nNewPos = scrollinfo.nMax;
}
if (nNewPos < scrollinfo.nMin)
{
nNewPos = scrollinfo.nMin;
}
CString str;
str.Format(L"滚动条当前的位置是:%d", nNewPos);
GetDlgItem(IDC_POS)->SetWindowTextW(str);
CDialogEx::OnHScroll(nSBCode, nPos, pScrollBar);
}
只有这个还不够,我们必须要在初始化对话框函数中添加如下代码:
BOOL CScrollBarDemoDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// 将“关于...”菜单项添加到系统菜单中。
// IDM_ABOUTBOX 必须在系统命令范围内。
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
BOOL bNameValid;
CString strAboutMenu;
bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
ASSERT(bNameValid);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// 设置此对话框的图标。 当应用程序主窗口不是对话框时,框架将自动
// 执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标
// TODO: 在此添加额外的初始化代码
SCROLLINFO scrollinfo = { 0 };
scrollinfo.cbSize = sizeof(SCROLLINFO);
scrollinfo.fMask = SIF_RANGE | SIF_PAGE;
scrollinfo.nMax = 109;
scrollinfo.nMin = 0;
scrollinfo.nPage = 10;
m_scrollbar.SetScrollInfo(&scrollinfo);
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
// TODO: 在此添加额外的初始化代码
SCROLLINFO scrollinfo = { 0 };
scrollinfo.cbSize = sizeof(SCROLLINFO);
scrollinfo.fMask = SIF_RANGE | SIF_PAGE;
scrollinfo.nMax = 109;
scrollinfo.nMin = 0;
scrollinfo.nPage = 10;
m_scrollbar.SetScrollInfo(&scrollinfo);
这一段代码是我们需要添加的。
3.SpinControl
实现的功能如下所示:
这个基本上不需要什么代码,大概步骤是:
先拖放一个EditControl,然后再拖放一个SpinControl,注意,一定要是这个顺序,因为SpinControl是按照Z顺序来绑定的。如果我们想再放一个这样的功能,那么还是按照前面的顺序拖放即可。
关键的几行代码,在初始化对话框函数中添加如下代码:
BOOL CSpinDemoDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// 将“关于...”菜单项添加到系统菜单中。
// IDM_ABOUTBOX 必须在系统命令范围内。
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
BOOL bNameValid;
CString strAboutMenu;
bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
ASSERT(bNameValid);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// 设置此对话框的图标。 当应用程序主窗口不是对话框时,框架将自动
// 执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标
// TODO: 在此添加额外的初始化代码
CSpinButtonCtrl *pSpinDec = (CSpinButtonCtrl*)GetDlgItem(IDC_SPIN_DEC);
pSpinDec->SetRange32(0, 100);
CSpinButtonCtrl *pSpinHex = (CSpinButtonCtrl*)GetDlgItem(IDC_SPIN_HEX);
pSpinHex->SetRange32(0, 500);
pSpinHex->SetBase(16);
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}