文章目录

  • 按钮控件
    • 命令按钮(Button)
    • 单选按钮(Radio Button)
    • 复选框(Check Box)
  • 编辑框(Edit Control)
  • 组合框控件(Combo Box)
  • 列表框控件(ListBox)
  • 滑块控件(SliderControl)
  • 进度条 (ProgressControl)
  • 数值调节按钮(SpinControl)
  • 滚动条控件(Scroll Bar)
  • 标签控件(TabControl)
  • 列表视图控件(Listcontrol)

按钮控件

按钮控件包括命令按钮(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("鸡啄米博客/software"));  // 设置编辑框正文为“鸡啄米博客.com”   m_editMultiLine.SetSel(3, 5);                            // 选择起始索引为3,终止索引为5(不包括在选择范围内)的正文,即“博客”   m_editMultiLine.ReplaceSel(_T("\r\nwww.jizhuomi.com"));  // 将选择的“博客”替换为“\r\nwww.jizhuomi.com”

https://blog.csdn.net/ZXY115019/article/details/79899659
https://zhidao.baidu.com/question/12235802.html


组合框控件(Combo Box)

http://www.jizhuomi.com/software/189.html

组合框其实就是把一个编辑框和一个列表框组合到了一起,分为三种:简易(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 控件更强大,可以画表格

http://www.jizhuomi.com/software/186.html

示例:

  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
}
  1. 我们希望在选中列表项改变时,将最新的选择项实时显示到编辑框中,那么这就要用到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); // 将选中列表项的字符串显示到编辑框中
}
  1. 运行程序,弹出结果对话框,在对话框的列表框中用鼠标改变选中项时,编辑框中的显示会相应改变。效果图如下:

效果图:



滑块控件(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);
}

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



进度条 (ProgressControl)

https://blog.csdn.net/qq_18297675/article/details/50982883

效果如图:

1、首先在初始化对话框中设置进度条的范围和初始位置:

CProgressCtrl* pProg = (CProgressCtrl*)GetDlgItem(IDC_PROGRESS);pProg->SetRange(0, 100);pProg->SetPos(0);//也可关联控件变量

2、然后在确定按钮中设置定时器:

    //设置定时器SetTimer(1, 100, nullptr);//当开始的时候,按钮不可用CButton* pBtn = (CButton*)GetDlgItem(IDC_BUTTON1);pBtn->EnableWindow(FALSE);

3、然后在定时器函数设置进度条的实时位置:

void CMFCTESTDlg::OnTimer(UINT_PTR nIDEvent)
{// TODO: 在此添加消息处理程序代码和/或调用默认值int iPos = 0;iPos = m_prog.GetPos();//获取当前进度条位置iPos += 1;m_prog.SetPos(iPos); CString s1,s2;s1 = _T("%");s2.Format(_T("%d"), iPos);SetDlgItemText(IDC_STATIC_DISPLAY, s1 + s2);if (iPos == 100)//当达到100的时候就关闭定时器,并且事按钮可用,位置设为0{KillTimer(1);m_prog.SetPos(0);CButton* pBtn = (CButton*)GetDlgItem(IDC_BUTTON1);pBtn->EnableWindow(TRUE);}CDialogEx::OnTimer(nIDEvent);
}

数值调节按钮(SpinControl)

SpinControl控件一般是和其他控件绑定使用的。如:

示例:
1、新建一个MFC基于对话框的应用程序,工程命名为 Spinctrl,在界面中添加一个编辑框控件和一个Spin Control,编辑框添加值变量 CString m_editNum1;
Spin Control添加控件变量 CSpinButtonCtrl m_Spin;

2、在初始化函数中绑定着两个控件:

int itemp = _wtoi(m_editNum1);
m_Spin.SetBuddy(GetDlgItem(itemp));
m_Spin.SetRange(0,100);

3、为控件 Spin Control添加消息响应事件:

void CSpinctrlDlg::OnDeltaposSpin1(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMUPDOWN pNMUpDown = reinterpret_cast<LPNMUPDOWN>(pNMHDR);
// TODO: 在此添加控件通知处理程序代码
UpdateData(true);
CString ss;
if(pNMUpDown->iDelta == -1) // 如果此值为-1 , 说明点击了Spin的往下的箭头
{
double a;
a=wcstod(m_editNum1,NULL)-1;
ss.Format(_T("%.1f"),a);
}
else if(pNMUpDown->iDelta == 1) // 如果此值为1, 说明点击了Spin的往上的箭头
{
double a;
a=wcstod(m_editNum1,NULL)+1;
ss.Format(_T("%.1f"),a);
}
m_editNum1=ss;
UpdateData(false);
*pResult = 0;
}

滚动条控件(Scroll Bar)

https://www.cnblogs.com/mupiaomiao/p/6255761.html

滚动条大家也很熟悉了,Windows窗口中很多都有滚动条。前面讲的列表框和组合框设置了相应属性后,如果列表项显示不下也会出现滚动条。滚动条分为水平滚动条(Horizontal Scroll Bar)和垂直滚动条(Vertical Scroll Bar)两种。滚动条中有一个滚动块,用于标识滚动条当前滚动的位置。我们可以拖动滚动条,也可以用鼠标点击滚动条某一位置使滚动块移动。

从滚动条的创建形式来分,有标准滚动条和滚动条控件两种。像列表框和组合框设置了WS_HSCROLL或WS_VSCROLL风格以后出现的滚动条,不是一个独立的窗口,而是这些窗口的一部分,这就是标准滚动条。而滚动条控件是一个独立的窗口,它可以获得焦点,响应某些操作。

示例:

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

2、在自动生成的对话框模板IDD_MFCSCROLLBARDEMO_DIALOG中,删除"TODO:Place dialog controls here."静态文本控件、“OK”按钮和“Cancel”按钮。添加一个Horizontal Scroll Bar控件,ID设置为IDC_HORI_SCROLLBAR。再添加一个静态文本框和一个编辑框,静态文本控件的Caption属性设为“滚动块当前位置:”,编辑框的ID设为IDC_HSCROLL_EDIT,Read Only属性设为True。此时的对话框模板如下图:


3、为滚动条IDC_HORI_SCROLLBAR添加CScrollBar类型的控件变量m_horiScrollbar。

4、在对话框初始化时,我们需要设置滚动条的滚动范围和初始位置,并在编辑框中显示初始位置,那么需要修改CMFCScrollBarDemoDlg::OnInitDialog()函数为:

BOOL CMFCScrollBarDemoDlg::OnInitDialog()
{CDialogEx::OnInitDialog();// 将“关于...”菜单项添加到系统菜单中。// TODO: 在此添加额外的初始化代码// 设置水平滚动条的滚动范围为1到100m_horiScrollbar.SetScrollRange(1, 100);// 设置水平滚动条的初始位置为20m_horiScrollbar.SetScrollPos(20);// 在编辑框中显示20SetDlgItemInt(IDC_HSCROLL_EDIT, 20);return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

5、现在滚动条还不能正常滚动,并且编辑框中数字也不随滚动改变。根据上面所讲,我们可以重载CMFCScrollBarDemoDlg类的OnHScroll函数。具体操作为,在CMFCScrollBarDemoDlg类的属性页面的工具栏上点击“Message”按钮,找到WM_HSCROLL消息,添加响应函数就可以了。OnHScroll函数重写后如下:

void CMFCScrollBarDemoDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{// TODO: 在此添加消息处理程序代码和/或调用默认值// 获取水平滚动条当前位置int pos = m_horiScrollbar.GetScrollPos();switch (nSBCode){// 如果向左滚动一列,则pos减1case SB_LINELEFT:pos -= 1;break;// 如果向右滚动一列,则pos加1case SB_LINERIGHT:pos += 1;break;// 如果向左滚动一页,则pos减10case SB_PAGELEFT:pos -= 10;break;// 如果向右滚动一页,则pos加10case SB_PAGERIGHT:pos += 10;break;// 如果滚动到最左端,则pos为1case SB_LEFT:pos = 1;break;// 如果滚动到最右端,则pos为100case SB_RIGHT:pos = 100;break;// 如果拖动滚动块到指定位置,则pos赋值为nPos的值case SB_THUMBPOSITION:pos = nPos;break;// 下面的m_horiScrollbar.SetScrollPos(pos);执行时// 会第二次进入此函数,最终确定滚动块位置,并且会// 直接到default分支,所以在此处设置编辑框中显示数值default:SetDlgItemInt(IDC_HSCROLL_EDIT, pos);return;}// 设置滚动块位置m_horiScrollbar.SetScrollPos(pos);CDialogEx::OnHScroll(nSBCode, nPos, pScrollBar);
}

6、编译运行程序,弹出结果对话框,可以自己拖动滚动块看是否能正常滚动,并且编辑框中也能显示正确的数值。效果如下:
 
至于垂直滚动条,其实与水平滚动条类似,这里就不必多说了,想必大家能办到。



标签控件(TabControl)


一: 在主对话框中添加Tab Control控件,如上图所示,右键控件添加ctrl类变量m_tab。

二: 在资源视图下增加两个对话框,分别修改其属性,将Border改为None,Style改为child,并分别添加类 CDIALOG1、CDIALOG2

在主对话框CXXXDlg.h中包含上述两个对话框的头文件,并在主对话框的类中添加:

CDIALOG1 m_page1;
CDIALOG2 m_page2;

四: 在主对话框初始化代码中添加:

void CTabTreeDlg::OnTabCtrInit()
{//为Tab Control增加两个页面  方法一m_tab.InsertItem(0, _T("测试1"));  m_tab.InsertItem(1, _T("测试2"));  //为Tab Control增加两个页面  方法二//m_tab.InsertItem(0, "测试1",0));  //m_tab.InsertItem(1, "测试2",1);  //创建两个对话框  这里最好不要这样,因为其实创建的是非模态对话框,后面如果要传参的话不行//m_page1.Create(IDD_DIALOG1, &m_tab);  //m_page2.Create(IDD_DIALOG2, &m_tab);  //最好改成这样m_page1.Create(IDD_DIALOG1, this);  m_page2.Create(IDD_DIALOG2, this);  //设定在Tab内显示的范围  CRect tabRect;  //可以定义到头文件里m_tab.GetClientRect(tabRect);  tabRect.left += 1;   tabRect.right -= 1;   tabRect.top += 22;   tabRect.bottom -= 1;//显示初始页面   方法一m_page1.MoveWindow(&tabRect);  m_page2.MoveWindow(&tabRect);   m_page1.ShowWindow(SW_SHOW); m_page2.ShowWindow(SW_HIDE); //显示初始页面   方法二  (下面也一样有两种)
//m_page1.SetWindowPos(NULL,tabRect.left, tabRect.top, tabRect.Width(), tabRect.Height(), SWP_SHOWWINDOW);
//m_page2.SetWindowPos(NULL,tabRect.left, tabRect.top, tabRect.Width(), tabRect.Height(), SWP_HIDEWINDOW);
}

五: 双击主对话框的TabControl控件进入消息编辑界面,添加:

void CTabTreeDlg::OnTabCtlSelect()
{switch(m_tab.GetCurSel()){case 0:m_page1.ShowWindow(SW_SHOW); m_page2.ShowWindow(SW_HIDE); break;case 1:m_page1.ShowWindow(SW_HIDE); m_page2.ShowWindow(SW_SHOW); break;default:break;}
}

最后效果:



列表视图控件(Listcontrol)

示例:

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

  2. 在自动生成的对话框模板IDD_EXAMPLE29_DIALOG中,删除“TODO: Place dialog controls here.”静态文本控件、“OK”按钮和“Cancel”按钮。添加一个List Control控件,ID设置为IDC_PROGRAM_LANG_LIST,View属性设为Report,即为报表风格,Single Selection属性设为True。再添加一个静态文本控件和一个编辑框,静态文本控件的Caption属性设为“选择的语言:”,编辑框的ID设为IDC_LANG_SEL_EDIT,Read Only属性设为True。此时的对话框模板如下图:

  3. 为列表视图控件IDC_PROGRAM_LANG_LIST添加CListCtrl类型的控件变量m_programLangList。

  4. 在对话框初始化时,我们将编程语言排行榜加入到列表视图控件中,那么需要修改 CExample29Dlg::OnInitDialog()函数为:

BOOL CExample29Dlg::OnInitDialog()
{   CDialogEx::OnInitDialog();   // TODO: Add extra initialization here   CRect rect;   // 获取编程语言列表视图控件的位置和大小   m_programLangList.GetClientRect(&rect);   // 为列表视图控件添加全行选中和栅格风格   m_programLangList.SetExtendedStyle(m_programLangList.GetExtendedStyle() | LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);   // 为列表视图控件添加三列   m_programLangList.InsertColumn(0, _T("语言"), LVCFMT_CENTER, rect.Width()/3, 0);   m_programLangList.InsertColumn(1, _T("2012.02排名"), LVCFMT_CENTER, rect.Width()/3, 1);   m_programLangList.InsertColumn(2, _T("2011.02排名"), LVCFMT_CENTER, rect.Width()/3, 2);   // 在列表视图控件中插入列表项,并设置列表子项文本   m_programLangList.InsertItem(0, _T("Java"));   m_programLangList.SetItemText(0, 1, _T("1"));   m_programLangList.SetItemText(0, 2, _T("1"));   m_programLangList.InsertItem(1, _T("C"));   m_programLangList.SetItemText(1, 1, _T("2"));   m_programLangList.SetItemText(1, 2, _T("2"));   m_programLangList.InsertItem(2, _T("C#"));   m_programLangList.SetItemText(2, 1, _T("3"));   m_programLangList.SetItemText(2, 2, _T("6"));   m_programLangList.InsertItem(3, _T("C++"));   m_programLangList.SetItemText(3, 1, _T("4"));   m_programLangList.SetItemText(3, 2, _T("3"));   return TRUE;  // return TRUE  unless you set the focus to a control
}

5、我们希望在选中列表项改变时,将最新的选择项实时显示到编辑框中,那么可以使用NM_CLICK通知消息。为列表框IDC_PROGRAM_LANG_LIST的通知消息NM_CLICK添加消息处理函数CExample29Dlg::OnNMClickProgramLangList,并修改如下:

void CExample29Dlg::OnNMClickProgramLangList(NMHDR *pNMHDR, LRESULT *pResult)
{   LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);   // TODO: Add your control notification handler code here   *pResult = 0;   CString strLangName;    // 选择语言的名称字符串   NMLISTVIEW *pNMListView = (NMLISTVIEW*)pNMHDR;   if (-1 != pNMListView->iItem)        // 如果iItem不是-1,就说明有列表项被选择   {   // 获取被选择列表项第一个子项的文本   strLangName = m_programLangList.GetItemText(pNMListView->iItem, 0);   // 将选择的语言显示与编辑框中   SetDlgItemText(IDC_LANG_SEL_EDIT, strLangName);   }
}
  1. 运行程序,弹出结果对话框,在对话框的列表框中用鼠标改变选中项时,编辑框中的显示会相应改变。效果图如下:

    数据插入:
m_ListCtrl.InsertColumn(0,"名称",LVCFMT_LEFT,50); //插入列m_ListCtrl.InsertColumn(1,"备注",LVCFMT_LEFT,50);//直接插入:int nRow=m_ListCtrl.InsertItem(0, "VC++");        //插入行m_ListCtrl.SetItemText(nRow,1,"Visual C++ 6.0");  //设置数据//LVITEM 结构插入:LVITEM item={0};item.iItem=0;  //行号item.mask=LVIF_TEXT; /*LVIF_IMAGE支持图标*/;item.cchTextMax=15;//插入字符串长度item.pszText="Visual C++ 6.0";int nRow=m_ListCtrl.InsertItem(&item);m_ListCtrl.SetItemText(nRow,1,"Visual C++ 6.0");

得到单击的CListCtrl的行列号:

添加listctrl控件的NM_CLICK消息相应函数void CMyDlg::OnClickList1(NMHDR* pNMHDR, LRESULT* pResult){//方法一:DWORD dwPos=GetMessagePos();CPoint point( LOWORD(dwPos), HIWORD(dwPos));m_ListCtrl.ScreenToClient(&point);LVHITTESTINFO lvinfo;lvinfo.pt=point;lvinfo.flags=LVHT_ABOVE;int nItem=m_ListCtrl.SubItemHitTest(&lvinfo);if(nItem!=-1){CString strtemp;strtemp.Format("单击的是第%d行第%d列",lvinfo.iItem, lvinfo.iSubItem);AfxMessageBox(strtemp);}// 方法二:NM_LISTVIEW* pNMListView=(NM_LISTVIEW*)pNMHDR;if(pNMListView->iItem!=-1){CString strtemp;strtemp.Format("单击的是第%d行第%d列",pNMListView->iItem, pNMListView->iSubItem);AfxMessageBox(strtemp);}*pResult = 0;}

右键点击CListCtrl的item弹出菜单:

添加CListCtrl控件的NM_RCLICK消息相应函数void CMyDlg::OnRclickList1(NMHDR* pNMHDR, LRESULT* pResult){/*方法一*/NM_LISTVIEW* pNMListView=(NM_LISTVIEW*)pNMHDR;if(pNMListView->iItem!=-1){DWORD dwPos = GetMessagePos();CPoint point( LOWORD(dwPos), HIWORD(dwPos) );CMenu menu;VERIFY( menu.LoadMenu( IDR_MENU1 ) );CMenu* popup = menu.GetSubMenu(0);ASSERT( popup != NULL );popup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON,point.x, point.y, this );} *pResult = 0;
/*方法二*///CMenu menu;//新建菜单实例// POINT pt = { 0 };//用于存储鼠标位置的结构体变量,pt.x和pt.y分别为x.y值// GetCursorPos(&pt);//得到鼠标点击位置// menu.LoadMenu(IDR_MENU2);//菜单资源加载,ID改成自己的// menu.GetSubMenu(0)->TrackPopupMenu(0, pt.x, pt.y, this);//显示菜单的位置// *pResult = 0;}

CListCtrl进行大数据量更新时,避免闪烁:

m_ListCtrl.SetRedraw(FALSE);//更新内容m_ListCtrl.SetRedraw(TRUE);m_ListCtrl.Invalidate();m_ListCtrl.UpdateWindow();

右键弹出菜单-删除选择的一行数据:

右键菜单添加事件处理函数:

void CMFCApplication1Dlg::On32771()//删除一行
{//m_ListCtrl.DeleteAllItems(); //删除所有数据int nItem = m_ListCtrl.GetSelectionMark();m_ListCtrl.DeleteItem(nItem);
}

用DELETE按键删除,不用右键菜单删除:
列表框新建消息响应:LVN_KEYDOWN 函数

void CMFCApplication1Dlg::OnLvnKeydownList1(NMHDR *pNMHDR, LRESULT *pResult)
{LPNMLVKEYDOWN pLVKeyDow = reinterpret_cast<LPNMLVKEYDOWN>(pNMHDR);if (VK_DELETE) //按下delete按钮{int nItem = m_ListCtrl.GetSelectionMark();m_ListCtrl.DeleteItem(nItem);*pResult = 0;}
}

改变listctrl 单元格背景及文字颜色(非重写控件):

https://download.csdn.net/download/cao_jie_xin/11846705

在ListCtrl控件中插入图标:

https://blog.csdn.net/dubuzherui/article/details/40589193

MFC 对话框常用控件详解相关推荐

  1. 基于WP7开发的Silverlight常用控件详解

    Silverlight是一个跨浏览器.跨客户平台的技术,能够设计.开发和发布有多媒体体验与富交互(RIA,Rich Interface Application)的网络交互程序. 针对Windows P ...

  2. 常用数据绑定控件详解

    常用数据绑定控件详解 GridView内容详解(1) GridView内容详解(2) DataList内容详解 ListView详解(一) ListView详解(二) 导航控件的高级应用 from:h ...

  3. 【转】ASP.NET验证控件详解(非空验证,比较验证,范围验证,正则表达式,自定义验证)...

    [转]ASP.NET验证控件详解(非空验证,比较验证,范围验证,正则表达式,自定义验证) ASP.NET验证控件详解 现在ASP.NET,你不但可以轻松的实现对用户输入的验证,而且,还可以选择验证在服 ...

  4. android自定义组件属性,Android组合控件详解 自定义属性

    组合控件详解 & 自定义属性 组合控件是自定义控件的一种,只不过它是由其他几个原生控件组合而成,故名组合控件. 在实际项目中,GUI 会遇到一些可以提取出来做成自定义控件情况. 一个自定义控件 ...

  5. pythongui日历控件_“五一”快到了,用Python中PyQt5做一个日历,QCalendar控件详解...

    前面内容,我们详细了解了PyQt5中的一些常用控件 精彩内容回顾 Python用PyQt5设计界面,如何正确显示一幅图片,QPixmap控件详解 拥有漂亮的笔刷才能绘制多彩界面,PythonPyQt5 ...

  6. WindowsMediaPlayer 11 控件详解

    WindowsMediaPlayer 11 控件详解 转载别人的VB内容 C#中大多也通用 都是Microsoft的作品 . 属性/方法名: 说明: [基本属性] URL:String; 指定媒体位置 ...

  7. Qt Quick - Popup控件详解

    Qt Quick - Popup控件详解 Popup是基于Qt Quick中的一种弹出式用户界面控件.它可以和Window或ApplicationWindow一起使用.如果想要确保一个Popup在场景 ...

  8. Switch控件详解

    Switch控件详解 原生效果 5.x 4.x 布局 <Switch android:id="@+id/setting_switch"android:layout_width ...

  9. android什么控件能够输入多行文字,Android开发:文本控件详解——EditText(一)基本属性...

    一.简单实例: EditText输入的文字样式部分的属性,基本都是和TextView中的属性一样. 除此之外,EditText还有自己独有的属性. 二.基本属性: hint 输入框显示的提示文本 te ...

  10. Spinner控件详解

    Spinner控件详解 效果图 修改Spinner样式 在介绍之前,先看一下系统原生的样式 6.x & 5.x系统样式 4.x系统样式 官方文档 XML属性 方法 描述 android:dro ...

最新文章

  1. EasyExcle使用小结
  2. 无线覆盖项目地勘——无线地勘记录
  3. NYOJ 559 报数游戏
  4. 将有序数组转为二叉搜索树
  5. [Leetcode]-containsNearbyDuplicate
  6. ATOM editor recommended by Sean
  7. java在集合中的方法变动的类_java中级面试题 之基础篇
  8. 2020年安卓学习笔记目录
  9. C51数据类型扩充定义
  10. What’s New in Virtio 1.1
  11. 主播助理的三种常见工作类型
  12. rhel6下,mysql 5.6.14 主从复制(也称mysql AB复制)环境配置[基于binlog]
  13. day2_windows下zip安装wamp环境
  14. Trie(字典)树详解
  15. windows下Navicat 过期如何解决
  16. 什么是 docker?docker和虚拟机有什么差别和不同?
  17. 【视频联动】编译原理:写出布尔表达式A or (B and not(C or D)) 的四元式序列。说明:按照控制语句中的布尔表达式翻译
  18. QWidget setStyleSheet无效
  19. 修改CAD图纸背景颜色的方法?
  20. 企业CDN缓存加速原理

热门文章

  1. 最新版校园招聘进大厂系列----------(5)百度篇 -----未完待续
  2. vue 中基于drag drop拖放实现左菜单和右画布的功能
  3. SqlServer数据库 设置查询结果字体
  4. Android对接蓝牙打印机
  5. 监控摄像头网页直播解决方案
  6. 基于asp.net338医院体检信息管理系统
  7. 【Microsoft Azure 的1024种玩法】五十五.Azure speech service之通过JavaScript快速实现文本转换为语音
  8. 2021-09-10 网安实验-文件修复-各种文件的文件头
  9. Linux C recv函数阻塞问题
  10. 平面设计在现实生活中有哪些用途