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

来源:互联网 发布:网络喷子都是穷人 编辑:程序博客网 时间:2024/06/16 04:41

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的一些基本功能,没有做太多详细的说明,比如控件绑定的变量名等并没有做说明!如有错误,请批评指正!

1 0