• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
longaotian
博客园    首页    新随笔    联系   管理    订阅  订阅

day3 – 子类化和控件的使用

  1. 按钮控件
    按钮控件包括命令按钮(Button)、单选按钮(Radio Button)和复选框(Check Box)等。
    按钮控件会向父窗口发送通知消息,最常用的通知消息莫过于BN_CLICKED和BN_DOUBLECLICKED了。用户在按钮上单击鼠标时会向父窗口发送BN_CLICKED消息,双击鼠标时发送BN_DOUBLECLICKED消息。

    命令按钮(Button)
    命令按钮是我们最熟悉也是最常用的一种按钮控件,用来响应用户的鼠标单击操作,进行相应的处理,它可以显示文本也可以嵌入位图。

    单选按钮(Radio Button)
    单选按钮使用时,一般是多个组成一组,组中每个单选按钮的选中状态具有互斥关系,即同组的单选按钮只能有一个被选中。
    单选按钮有选中和未选中两种状态,为选中状态时单选按钮中心会出现一个蓝点,以标识选中状态。

    初始化
    在OnInitDialog()中: (IDC_RADIO1为控件 ID)

((CButton *)GetDlgItem(IDC_RADIO1))->SetCheck(TRUE);//选上
((CButton *)GetDlgItem(IDC_RADIO1))->SetCheck(FALSE);//不选上

同理获取状态

UpdateData(TRUE);
((CButton *)GetDlgItem(IDC_RADIO1))->GetCheck();返回1表示选上,0表示没选上

图标(.ico格式)的效果:
1、引入Icon资源。
将后缀为.ico的图标资源添加进工程里,记录资源号,如IDI_ICON1。
2、将控件属性icon改为true。
3、给要添加图标的Button绑定控件变量
类型选择Control,名称可以取为m_BtnTest。
4、修改对话框的初始化函数OnInitDialog
在OnInitDialog函数中,添加如下代码:

HICON m_IconBtn = AfxGetApp()->LoadIcon(IDI_ICON1);//导入Icon资源,利用m_hIconBtn来存储句柄。
m_BtnTest.SetIcon(m_IconBtn);

图片(.bitmap格式)的效果:

1、引入Icon资源。
将后缀为.ico的图标资源添加进工程里,记录资源号,如IDI_ICON1。
2、将控件属性bitmap改为true。
3、给要添加图标的Button绑定控件变量
类型选择Control,名称可以取为m_BtnTest。
4、修改对话框的初始化函数OnInitDialog
在OnInitDialog函数中,添加如下代码:

HBITMAP hBmp = ::LoadBitmap(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_BITMAP1));
m_BtnTest.SetBitmap(hBmp);

复选框(Check Box)
一般的复选框也是有选中和未选中两种状态,选中时复选框内会增加一个“√”,而三态复选框(设置了BS_3STATE风格)有选中、未选中和不确定三种状态,不确定状态时复选框内出现一个灰色“√”。

复选框的四种获取操作:
一:

*int state =((CButton )GetDlgItem(IDC_CHECK1))->GetCheck();

注意:

1.GetDlgItem函数返回一个CWnd*的指针,而我们需要一个CButton类的指针,CButton派生于CWnd,因此可以用强制转换,否则VS2010会提示“不是“CWnd”的成员”

2.优先级的问题。(类型)强制转换运算符的优先级小于对象运算符->,因此要在->加上(),否则VS2010会提示 “不是“CWnd”的成员

当state == BST_UNCHECKED 时表示该复选框没有被选中;
当state == BST_CHECKED 时表示该复选框被选中;
当state == BST_INDETERMINATE 时表示不确定;

设置复选框状态的函数:

*((CButton )GetDlgItem(IDC_RADIO1))->SetCheck(BST_CHECKED);
SetCheck(BST_CHECKED)表示设置复选框为"选中"状态;
SetCheck(BST_UNCHECKED)表示设置复选框为"未选中"状态;
SetCheck(BST_INDETERMINATE)设置复选框为不确定状态;

二:

if (BST_UNCHECKED == IsDlgButtonChecked(IDC_CHECK1))
{
//IDC_CHECK1是CheckBox控件。
//check box 被选中执行相关动作
}

函数功能:
该函数可以确定某个按钮控制是否有选中标志,或者三态按钮控制是否为灰色的、选中的、或两者都不是。

返回值:
使用BS_AUTOCHECKBOX、BS_AUTORADIOBUTTON、BS_AUTO3STATE、BS_CHECKBOX、BS_RADIOBUTION或BS_3STATE样式创建的按钮的返回值可以是如下值之一:
BST_CHECKED:表示按钮被选中。
BST_INDETERMINATE:表示按钮是灰色的,即为不确定状态(只有具有BS_3STATE或BS_AUTO3STATE样式的按钮才使用该值)。
BST_UNCHECKED:表示该按钮未选中(unckecked)。如果该按钮用其他任何样式,那么返回值为零。

三:

复选框CheckBox控件添加一个value控件类型的BOOL值变量如:BOOL m_ocupy1;

UpdateData(TRUE);//从控件获得数据 获得输入数据后可以进行相应操作
int state = m_ocupy1;

四:

复选框CheckBox控件添加一个control控件类型的CButton值变量如:CButton m_m_chk1;

UpdateData(TRUE);//从控件获得数据 获得输入数据后可以进行相应操作
int state = m_chk1.GetCheck();

编辑框(Edit Control)
MFC为编辑框提供了CEdit类。编辑框的所有操作都封装到了CEdit类中。

一般如果我们要防止别人在编辑框中进行输入,可以设置编辑框的属性 Read Only。

初始化:

添加一个编辑框,ID设为IDC_MULTI_LINE_EDIT,
为编辑框IDC_MULTI_LINE_EDIT添加CEdit类型的控件变量m_editMultiLine。

// TODO: Add extra initialization here
m_editMultiLine.SetWindowText(_T("longaotian")); // 设置编辑框正文为"longaotian"
m_editMultiLine.SetSel(3, 5); // 选择起始索引为3,终止索引为5(不包括在选择范围内)的正文,即"go"
m_editMultiLine.ReplaceSel(_T("*longaotian.love*")); // 将选择的"go"替换为"*longaotian.love*"

组合框控件(Combo Box)

组合框其实就是把一个编辑框和一个列表框组合到了一起,分为三种:简易(Simple)组合框、下拉式(Dropdown)组合框和下拉列表式(Drop List)组合框。下面讲讲它们的区别。

简易组合框中的列表框是一直显示的

下拉式组合框默认不显示列表框,只有在点击了编辑框右侧的下拉箭头才会弹出列表框,列表框弹出

下拉列表式组合框的编辑框是不能编辑的,只能由用户在下拉列表框中选择了某项后,在编辑框中显示其文本。下拉列表式组合框

组合框被操作时会向父窗口发送通知消息,这些通知消息及其含义如下:

CBN_CLOSEUP:组合框的列表框组件被关闭,简易组合框不会发送该通知消息
CBN_DBLCLK:用户在某列表项上双击鼠标,只有简易组合框才会发送该通知消息
CBN_DROPDOWN:组合框的列表框组件下拉,简易式组合框不会发送该通知消息
CBN_EDITUPDATE:在编辑框准备显示改变了的正文时发送该消息,下拉列表式组合框不会发送该消息
CBN_EDITCHANGE:编辑框的内容被用户改变了,与CBN_EDITUPDATE不同,该消息是在编辑框显示的正文被刷新后才发出的,下拉列表式组合框不会发送该消息
CBN_ERRSPACE:组合框无法申请足够的内存来容纳列表项
CBN_SELENDCANCEL:表明用户的选择应该取消,当用户在列表框中选择了一项,然后又在组合框控件外单击鼠标时就会导致该消息的发送
CBN_SELENDOK:用户选择了一项,然后按了回车键或单击了下滚箭头,该消息表明用户确认了自己所作的选择
CBN_KILLFOCUS:组合框失去了输入焦点
CBN_SELCHANGE:用户通过单击或移动箭头键改变了列表的选择
CBN_SETFOCUS:组合框获得了输入焦点

示例:

1.创建一个基于对话框的MFC工程,名称设置为“Example25”。

2.在自动生成的对话框模板IDD_EXAMPLE25_DIALOG中,删除“TODO: Place dialog controls here.”静态文本控件、“OK”按钮和“Cancel”按钮。添加一个Combo Box控件,ID设置为IDC_WEB_COMBO,Type属性设为Drop List,为下拉列表式组合框,编辑框不允许用户输入,Sort属性设为False,以取消排序显示。再添加一个静态文本控件和一个编辑框,静态文本控件的Caption属性设为“您选择的网站:”,编辑框的ID设为IDC_SEL_WEB_EDIT,Read Only属性设为True。此时的对话框模板

3.为组合框IDC_WEB_COMBO添加 CComboBox 类型的控件变量 m_comboWeb。

4.在对话框初始化时,我们将站点名加入到组合框中,并默认选择第一项,那么需要修改CExample25Dlg::OnInitDialog()函数为:

BOOL CExample25Dlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();
	。。。

	// TODO: Add extra initialization here   
	// 为组合框控件的列表框添加列表项"鸡啄米"   
	m_comboWeb.AddString(_T("鸡啄米"));   
	// 为组合框控件的列表框添加列表项"百度"   
	m_comboWeb.AddString(_T("百度"));   
	// 在组合框控件的列表框中索引为1的位置插入列表项"新浪"   
	m_comboWeb.InsertString(1, _T("新浪"));   

	// 默认选择第一项   
	m_comboWeb.SetCurSel(0);   
	// 编辑框中默认显示第一项的文字"鸡啄米"   
	SetDlgItemText(IDC_SEL_WEB_EDIT, _T("鸡啄米"));   

	return TRUE;  // return TRUE  unless you set the focus to a control   
}

5.我们希望在组合框中选中的列表项改变时,将最新的选择项实时显示到编辑框中,那么这就要用到CBN_SELCHANGE通知消息。为列表框IDC_WEB_COMBO的通知消息CBN_SELCHANGE添加消息处理函数CExample25Dlg::OnCbnSelchangeWebCombo(),并修改如下:

void CExample25Dlg::OnCbnSelchangeWebCombo()
{
	// TODO: Add your control notification handler code here
	CString strWeb;
	int nSel;
	// 获取组合框控件的列表框中选中项的索引   
	nSel = m_comboWeb.GetCurSel();   
	// 根据选中项索引获取该项字符串   
	m_comboWeb.GetLBText(nSel, strWeb);   
	// 将组合框中选中的字符串显示到IDC_SEL_WEB_EDIT编辑框中   
	SetDlgItemText(IDC_SEL_WEB_EDIT, strWeb);   
}

6.运行程序,弹出结果对话框,在对话框的组合框中改变选择项时,编辑框中的显示会相应改变。效果图如下:

列表框控件(ListBox)
Listbox控件和List Control控件差不多,但List Control 控件更强大,可以画表格

示例:

1.创建一个基于对话框的MFC工程,名称设置为“Example24”。

2.在自动生成的对话框模板IDD_EXAMPLE24_DIALOG中,删除“TODO: Place dialog controls here.”静态文本控件、“OK”按钮和“Cancel”按钮。添加一个Listbox控件,ID设置为IDC_WEB_LIST,Sort属性设为False,以取消排序显示。再添加一个静态文本控件和一个编辑框,静态文本控件的Caption属性设为“您选择的站点:”,编辑框的ID设为IDC_SEL_WEB_EDIT,Read Only属性设为True。

3.为列表框IDC_WEB_LIST添加CListBox类型的控件变量m_listBox。

4.在对话框初始化时,我们将站点名加入到列表框中,那么需要修改CExample24Dlg::OnInitDialog()函数为:

BOOL CExample24Dlg::OnInitDialog()   
{   
    CDialogEx::OnInitDialog();   
  
   。。。
	// TODO: Add extra initialization here   
	m_listBox.AddString(_T("新浪"));        // 在列表框结尾添加字符串"新浪"   
	m_listBox.AddString(_T("鸡啄米"));      // 在列表框结尾添加字符串"鸡啄米"   
	m_listBox.AddString(_T("猫扑"));        // 在列表框结尾添加字符串"猫扑"   
	m_listBox.InsertString(2, _T("百度"));  // 在列表框中索引为2的位置插入字符串"百度"   

	return TRUE;  // return TRUE  unless you set the focus to a control   
}

5.我们希望在选中列表项改变时,将最新的选择项实时显示到编辑框中,那么这就要用到LBN_SELCHANGE通知消息。为列表框IDC_WEB_LIST的通知消息LBN_SELCHANGE添加消息处理函数CExample24Dlg::OnLbnSelchangeWebList(),并修改如下:

void CExample24Dlg::OnLbnSelchangeWebList()   
{   
    // TODO: Add your control notification handler code here   
    CString strText;   
    int nCurSel;   
       
    nCurSel = m_listBox.GetCurSel();           // 获取当前选中列表项   
    m_listBox.GetText(nCurSel, strText);       // 获取选中列表项的字符串   
    SetDlgItemText(IDC_SEL_WEB_EDIT, strText); // 将选中列表项的字符串显示到编辑框中   
}  

6.运行程序,弹出结果对话框,在对话框的列表框中用鼠标改变选中项时,编辑框中的显示会相应改变。

滑块控件(SliderControl)
示例:

1、加入一个Slider 控件IDC_SLIDER,一个Edit 控件IDC_EDIT(用于显示)拖入对话框内。设置Edit控件的Read Only属性为TRUE。分别右击添加变量,Slider的变量类别为Control,变量名:m_sliderc;Edit控件的变量类型为Value,变量名为m_valueofSlider。

2、在初始化函数OnInitDialog()中添加如下代码:

m_sliderc.SetRange( 0,100);//设置范围
m_sliderc.SetTicFreq(10);//设置显示刻度的间隔
m_sliderc.SetPos(10);//当前停留的位置
m_sliderc.SetLineSize(10);//一行的大小,对应键盘的方向键
UpdateData(TRUE);
m_valueofSlider=m_sliderc.GetPos();//获得滑块的位置
UpdateData(FALSE);

3、在类导向Classwizad中添加WM_HSCOLL消息,得到void CScrollBarDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)函数,在函数中添加如下代码:

void CScrollBarDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CSliderCtrl* slider=(CSliderCtrl*)pScrollBar;
if (slider=&m_sliderc)

{UpdateData(TRUE);
m_valueofSlider=m_sliderc.GetPos();
UpdateData(FALSE);
}

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

或者双击控件创建响应函数。

posted @ 2021-08-08 18:31  longaotian  阅读(108)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3