MFC-三个基本控件ProgressControl、ScrollBarControl以及SpinControl

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
}

本文主要是想说明MFC的一些基本功能,没有做太多详细的说明,比如控件绑定的变量名等并没有做说明!如有错误,请批评指正!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值