第8章 常用控件

按钮

单选按钮、普通按钮、复选按钮

void CButtonDlg::OnButton1() 
{
    // TODO: Add your control notification handler code here
    CString str = "";
    if(m_radio1.GetCheck() == 1)
        str += "年龄为大于30岁";
    else if(m_radio2.GetCheck() == 1)
        str += "年龄为15到30岁之间";
    else if(m_radio3.GetCheck() == 1)
        str += "年龄为小于15岁";
    else
        str += "年龄未知";
    str += "爱好包括:";
    if(m_check1.GetCheck() == 1)
        str += "聊天交友,";
    if(m_check2.GetCheck() == 1)
        str += "查阅资料,";
    if(m_check3.GetCheck() == 1)
        str += "打游戏,";
    if(m_check4.GetCheck() == 1)
        str += "进论坛。";
    m_button.SetWindowText("您已经按下确定按钮");
    AfxMessageBox(str);
}

滚动条

  • 对话框放置一个滚动条
  • 设置滚动条控制变量m_test,注意是控制变量,非value、int
  • 在函数OnInitDialog中对m_test初始化,在return true之前
    // TODO: Add extra initialization here
    m_test.SetScrollRange(0,100);//0-100范围
    m_test.SetScrollPos(10);//当前位置初始化为10
  • 对CTestDlg添加类向导,OnVScroll事件,添加消息响应函数:
void CTestDlg::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
{
    // TODO: Add your message handler code here and/or call default
    int n = m_test.GetScrollPos();
    if(pScrollBar == &m_test)
    switch(nSBCode)
    {
    case SB_THUMBTRACK:
        m_test.SetScrollPos(nPos); break;
    case SB_LINEDOWN:
        m_test.SetScrollPos(n + 1); break;
    case SB_LINEUP:
        m_test.SetScrollPos(n - 1); break;
    case SB_PAGEDOWN:
        m_test.SetScrollPos(n + 3); break;
    case SB_PAGEUP:
        m_test.SetScrollPos(n - 3); break;
    }

    CDialog::OnVScroll(nSBCode, nPos, pScrollBar);
}

静态文本控件

若需要改变静态文本的内容,添加控制性变量,设置name以示区别,调用SetWindowText进行改变。

列表框控件

  • 属性中single表示单选,multiple表示多选,extended表示能拖动多选
  • 为列表框建立控制型变量m_list,注意是控制性,非value型
  • 在CTestDlg::OnInitDialog中添加如下:
    // TODO: Add extra initialization here
    m_list.AddString("唱歌");
    m_list.AddString("绘画");
    m_list.AddString("篮球");
    m_list.AddString("足球");
    m_list.AddString("写作");
    m_list.InsertString(1,"看电影");
    m_list.InsertString(3,"上网");
    m_list.InsertString(0,"逛街");
  • 添加确定按钮消息响应函数:
void CTestDlg::OnOK() 
{
    // TODO: Add extra validation here
    CString message = "您的爱好有:";
    CString str;
    int num = m_list.GetSelCount();
    int m[10];
    for(int i=0;i<10;i++ )
        m[i] = -1;
    m_list.GetSelItems(num,m);
    for(i = 0;i < 10;i++)
    {
        if(m[i] != -1)
        {
            m_list.GetText(m[i],str);
            message += str;
        }
    }
    AfxMessageBox(message);

//  CDialog::OnOK();
}
  • 为列表框添加一个双击某个选项的消息响应函数
void CTestDlg::OnDblclkList1() 
{
    // TODO: Add your control notification handler code here
    AfxMessageBox("请进行单击选择");

}

列表视图

  • 属性中LVS_ICON表示大图标显示,LVS_SMALLICON表示小图标显示,还有列表显示和详细报表显示
  • 创建一个详细报表列表,添加控制性变量m_list
  • 在CTestDlg::OnInitDialog函数中编写代码如下:
    // TODO: Add extra initialization here
    m_list.SetBkColor(RGB(0,0,0));//背景颜色
    m_list.SetTextBkColor(RGB(255,0,0));//字体背景色
    m_list.SetTextColor(RGB(255,255,0));//字体颜色
    m_list.InsertColumn(0,"日期");
    m_list.InsertColumn(1,"天气");
    //获取列表宽度
    RECT rect;
    m_list.GetWindowRect(&rect);
    int wid = rect.right - rect.left;
    //为每列设置列宽
    m_list.SetColumnWidth(0,wid/4);
    m_list.SetColumnWidth(1,3*wid/4);
    m_list.SetExtendedStyle(LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT | LVS_EX_HEADERDRAGDROP);
    for(int i=0;i<7;i++)
    {
        CString str;
        str.Format("星期%d",i+1);
        m_list.InsertItem(0,"aa");
        m_list.SetItemText(0,0,str);
        m_list.SetItemText(0,1,(i%2==0)?"晴":"多云");
    }

树视图控件的构成

  • 创建一个树视图,属性中选择Styles标签,选择其中的has buttons、has lines和lines at root复选框。
  • 在资源编辑器中添加三个图标IDI_ICON1,2,3
  • CTestDlg类中添加数据成员CImageList m_imageList
class CTestDlg : public CDialog
{
// Construction
public:
    CImageList m_imageList;//++++++++++++++++++++++++++++
  • 在CTestDlg::OnInitDialog中添加代码如下:
    // TODO: Add extra initialization here
    HICON hIcon[3];         //图标数组
    int n;
    m_imageList.Create(32,32,0,16,16);
    hIcon[0] = AfxGetApp()->LoadIcon(IDI_ICON1);
    hIcon[1] = AfxGetApp()->LoadIcon(IDI_ICON2);
    hIcon[2] = AfxGetApp()->LoadIcon(IDI_ICON3);
    for(n = 0;n < 3;n++)
    {
        m_imageList.Add(hIcon[n]);
    }

    CTreeCtrl * pTree = (CTreeCtrl *)GetDlgItem(IDC_TREE1);
    pTree->SetImageList(&m_imageList,TVSIL_NORMAL);

    TV_INSERTSTRUCT tvinsert;
    tvinsert.hParent = NULL;
    tvinsert.hInsertAfter = TVI_LAST;
    tvinsert.item.mask = TVIF_IMAGE | TVIF_SELECTEDIMAGE| TVIF_TEXT;
    tvinsert.item.hItem = NULL;
    tvinsert.item.state = 0;
    tvinsert.item.stateMask = 0;
    tvinsert.item.cchTextMax = 6;
    tvinsert.item.iSelectedImage = 1;
    tvinsert.item.cChildren = 0;
    tvinsert.item.lParam = 0;
    //第一层
    tvinsert.item.pszText = "学校";
    tvinsert.item.iImage = 0;
    HTREEITEM hDad= pTree ->InsertItem(&tvinsert);
    //第二层
    tvinsert.hParent = hDad;
    tvinsert.item.pszText = "自动化学院";
    tvinsert.item.iImage = 1;
    HTREEITEM hDad21=pTree->InsertItem(&tvinsert);      //第二层两个项目
    tvinsert.item.pszText = "通信学院";
    HTREEITEM hDad22=pTree->InsertItem(&tvinsert);
    //第三层
    //第二层第一个项目的两个子项目
    tvinsert.hParent = hDad21;
    tvinsert.item.pszText = "电气工程专业";
    tvinsert.item.iImage = 2;
    pTree->InsertItem(&tvinsert);
    tvinsert.item.pszText = "自动化专业";
    pTree->InsertItem(&tvinsert);
    //第二层第二个项目的两个子项目
    tvinsert.hParent = hDad22;
    tvinsert.item.pszText = "通信工程";
    tvinsert.item.iImage = 2;
    pTree->InsertItem(&tvinsert);
    tvinsert.item.pszText = "电气信息";
    pTree->InsertItem(&tvinsert);

编辑框

  • 创建对话框应用程序,两个编辑框,一个按钮
  • 设置编辑框属性:多行,水平滚动、垂直滚动、需要返回,边界
  • 添加控制性变量m_edit1、m_edit2
  • 为按钮添加消息响应函数:
void CTestDlg::OnButton1() 
{
    // TODO: Add your control notification handler code here
    m_edit2.SetSel(0,-1);
    m_edit2.ReplaceSel("");     //清除编辑框2的内容
    m_edit1.SetSel(0,-1);   
    m_edit1.Copy();             //将编辑框1内的内容复制到剪贴板
    m_edit1.ReplaceSel("");     //清除编辑框1的内容
    m_edit2.Paste();            //将剪贴板内容粘贴到编辑框2中
}

组合框

  • 类型:简单类型没有三角符号、下拉和下拉列表有三角符号,下拉还可以在编辑框中输入。
  • 属性、数据中输入列表选项,一行一项,ctrl+enter换行
  • 建立消息响应函数

属性页

  • 创建对话框程序
  • 添加属性页控件IDC_TAB
  • 利用类向导,添加控制变量CTabCtrl m_tab
  • 利用资源管理器添加两个对话框资源dialog1、dialog2,设置其属性为child下层,取消title
  • 利用类向导为两个对话框添加类CDialog1、CDialog2
  • 在CTestDlg类的声明文件中包含头文件
#include "Dialog1.h"
#include "Dialog2.h"
  • 在CTestDlg类中添加两个成员变量
public:
    CTestDlg(CWnd* pParent = NULL); // standard constructor
    CDialog1 dlg1;//+++++++++++++++++++++++++++
    CDialog2 dlg2;//++++++++++++++++++++++++++++
  • 在CTestDlg::OnInitDialog中添加属性页控件的初始化语句
    // TODO: Add extra initialization here
    m_tab.InsertItem(0,"对话框1");
    m_tab.InsertItem(1,"对话框2");
    //创建两个以IDC_TAB为父窗口的属性页
    dlg1.Create(IDD_DIALOG1,GetDlgItem(IDC_TAB));
    dlg2.Create(IDD_DIALOG2,GetDlgItem(IDC_TAB));
    //显示区域
    RECT rect;
    m_tab.GetClientRect(&rect);
    rect.top += 30;
    rect.left += 5;
    rect.right -= 5;
    rect.bottom -= 5;
    dlg1.MoveWindow(&rect);
    dlg2.MoveWindow(&rect);
    dlg1.ShowWindow(TRUE);
    dlg2.ShowWindow(FALSE);
    m_tab.SetCurSel(0);
  • 为了响应切换属性页的消息,利用类向导添加TCN_SELCHANGE和TCN_SECHANGING消息,前者是切换回发出的消息,后者是切换中发出的消息
  • 利用类向导添加TCN_SELCHANGE,函数如下:
void CTestDlg::OnSelchangeTab(NMHDR* pNMHDR, LRESULT* pResult) 
{
    int num = m_tab.GetCurSel();
    if(num == 0)
    {
        dlg1.ShowWindow(TRUE);
        dlg2.ShowWindow(FALSE);
    }
    else
    {
        dlg1.ShowWindow(FALSE);
        dlg2.ShowWindow(TRUE);
    }

    *pResult = 0;
}

进度条

在使用过程中可以在对话框中添加一个进度条控件,然后创建一个指向该进度条的对象指针。在应用程序中可以利用类中的函数对进度条控件进行操作。进度条控件的使用一般需要一个时间定时来实现进度条的前进。

滑块

当利用鼠标拖动滑块控件时,可以添加消息响应函数来处理。

IP Address控件

在网络类应用程序中,经常需要对IP地址进行处理,而IP地址控件是一个四段型的标准IP地址的形式,用户可以以点分十进制形式输入IP地址。IP地址是一个32位的二进制数据,实际中常用的形式是点分十进制形式,例如119.255.33.44。

时间控件

用来接收时间的输入和输出。

应用实例

进度条、滑块操作
- 创建对话框程序
- 放入进度条、按钮、滑块、编辑框(只读)
- 在类向导中对进度条和滑块添加变量

CSliderCtrl m_SliderCtrl;
CProgressCtrl m_progressCtrl;
  • 添加单击按钮控件的消息映射,编写函数体如下:
void CTestDlg::OnButton1() 
{
    // TODO: Add your control notification handler code here
    m_progressCtrl.SetRange(0,100);//1-100
    for(int i=0;i<=100;i++)
    {
        m_progressCtrl.SetPos(i);
        Sleep(100);//100ms
    }
    AfxMessageBox("进度条到达终点");

}
  • 利用类向导,添加滑块的消息映射,需要注意的是,横向滑块移动的消息映射是WM_HSCROLL消息,而垂直的滑块的消息映射是WM_VSCROLL消息。
void CTestDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
{
    // TODO: Add your message handler code here and/or call default
    m_SliderCtrl.SetRange(0,100);
    CString str;
    str.Format("%d",m_SliderCtrl.GetPos());
    SetDlgItemText(IDC_EDIT1,str);

    CDialog::OnHScroll(nSBCode, nPos, pScrollBar);
}

时间控件应用实例

  • 创建一个对话框
  • 在资源编辑器中分别添加Date Time Picker控件和MonthCalendar
  • 利用类向导分别为两个控件添加变量CdateTimeCtrl m_date和CmonthCalCtrl m_time
  • 利用类向导添加再日历控件上选择日期时的消息映射,即添加消息MCN_SELECT的响应函数
void CTestDlg::OnSelectMonthcalendar1(NMHDR* pNMHDR, LRESULT* pResult) 
{
    // TODO: Add your control notification handler code here

    CString str;
    SYSTEMTIME time;
    m_time.GetCurSel(&time);                //得到选中的日期
    str.Format("%d%d%d 日  星期%d",time.wYear,time.wMonth,time.wDay, 
    time.wDayOfWeek);
    AfxMessageBox(str);                     //弹出消息框

    *pResult = 0;
}
  • 利用类向导为时间控件添加消息映射DTN_CLOSEUP
void CTestDlg::OnCloseupDatetimepicker1(NMHDR* pNMHDR, LRESULT* pResult) 
{
    // TODO: Add your control notification handler code here
    CString str;
    SYSTEMTIME time;                //结构体变量
    m_date.GetTime(&time);          //得到选中日期
    str.Format("%d%d%d 日  星期%d",time.wYear,time.wMonth,time.wDay, 
    time.wDayOfWeek);
    m_time.SetCurSel(&time);        //设置日期
    AfxMessageBox(str);             //弹出消息框

    *pResult = 0;
}
  • 在Release版本下运行程序,否则消息框时间混乱!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值