MFC 对话框与常用控件

  1. 模态对话框创建方式
    【方法一】创建对话框类的对象,然后调用domodal
    CGuiDlg dlg;
    dlg.DoModal();
    会阻塞,可以局部变量。因为会堵塞
    【方法二】
    CDialog dlg(IDD_GUI_DLG);
    dlg.DoModal();

2.非模态对话框 先创建,在显示
在菜单命令下 :
【方法一】
CDialog dlg;
dlg.Create(IDD_GUI_DLG);
dlg.ShowWindow(SW_SHOW);
会发现闪烁 是因为模态对话框会阻塞,而非模态不会,dlg是一个局部变量,而菜单有自己的更新机制,非模态的对话框被隐藏了,解决办法
::::dlg设置为类的成员函数
【方法二】创建对话框类,然后显示
CGuiDlg dlg;
dlg.Create(IDD_GUI_DLG);
dlg.ShowWindow(SW_SHOW);
【小结】
1.模态对话框可以局部变量。因为会堵塞。
非模态对话框不能是局部变量,因为不会堵塞,函数运行完毕就释放啦。
2.Ctrl + D 可以查看 控件的顺序。点击数字可以改变顺序

解决 vs2017问题 error MSB8008: 指定的平台工具集(v120)未安装或无效

项目属性中 配置 中 平台工具集 改成目前软件的版本就可以啦

-------------控件------------------------
3. 单选框: 特殊的button按钮,双击控件时,进入点击控件的处理函数,与CButton一样的处理方式-
1) 属性设置:顺序排放 Ctrl+D 查看
2) 同组第一个按钮 Group 设置为 TRUE
3) 初始化单选框 CWnd::CheckRadioButton
4) 按钮是否按下 CWnd::IsDlgButtonChecked
--------------------------摘抄------------------------------------
一、对话框
1)模态对话框
a) 资源视图 -> Dialog -> 右击 -> 插入 Dialog
b) 创建对话框对象 CDialog
c) 以模态方式运行 CDialog::DoModal
2)非模态对话框
a)资源视图 -> Dialog -> 右击 -> 插入 Dialog
b)创建对话框对象,需要在.h的地方声明为成员变量 CDialog
c)创建对话框(在构造函数或OnCreate(),目的只创建一次) CDialog::Create
d)显示窗口 CWnd::ShowWindow
3)自定义对话框类(重要)
a)资源视图 -> Dialog -> 右击 -> 插入 Dialog
b)点击对话框模板 -> 右击 -> 添加类
c)多出来一个自定义的类, .h 类中有个枚举和对话框关联 enum { IDD = IDD_DIALOG2 };

二、基于对话框(控件)编程
1)基于对话框应用程序框架
a)应用程序类:继承于 CWinApp
InitInstance() : 程序的入口地址
b)对话框类:继承于 CDialogEx
OnInitDialog() :对话框的初始化工作
DoDataExchange() : 控件和变量的关联和交换

三、常用控件
1)静态控件CStatic(Qt中的标签QLabel)
显示一些文字信息 ,起标签的作用
a) Caption: 修改显示的内容
b) ID: XXX_STATIC,静态ID,不响应任何消息(事件)
c)如果想让static相应消息时
1… 修改ID
2…修改 属性 notify 勾选

2)按钮 CButton
a) Caption: 修改显示的内容
b) 处理消息 BN_CLICKED,用户点击按钮自动触发:
1)属性 -> 控制事件 -> 选择所需事件
2)双击按钮,自动生成消息处理函数

3)逃跑按钮(类似于Qt提升)
a)自定义按钮类,继承于 CButton
选择类视图最开始的文件夹 -> 右击 -> 添加类 -> MFC -> MFC类
1)处理鼠标移动消息 WM_MOUSEMOVE
2)获取父窗口指针 CWnd::GetParent
3)获取父窗口客户区域的范围 CWnd::GetClientRect
4)获取按钮的范围 CWnd::GetWindowRect
5)产生随机坐标 rand()%w
6)移动按钮的位置 CWnd::MoveWindow
b)变量关联
选中按钮 -> 右击 -> 添加变量 -> 变量类型: MyButton -> 变量:button
最终,button和我们所选中的按钮关联成功,操作button,相当于操作ui上的按钮 (Qt的提升)
c)为按钮设置位图
1)按钮属性:Bitmap -> True
2)在对话框类中 OnInitDialog() 做如下处理
a)创建位图模板
b)创建位图对象 CBitmap
c)加载位图资源 CBitmap::LoadBitmap
b)按钮设置位图 CButton::SetBitmap
c)获取位图大小 CBitmap::GetBitmap
c)重新设置按钮大小(图片和按钮大小一致) CWnd::MoveWindow

4)编辑框CEdit
a)关联类别:Value, Control
1)Value:标准普通数据类型 CString str;
关联变量和控件数据的交互更新
a)把编辑区的内容更新到str中 UpdateData(TRUE); 获取数据给变量
b)把str的内容更新到编辑区中 UpdateData(FALSE);初始化对化框

	2)Control:控件类型
		控件类型的对象即为ui上的控件
		
b)常用属性设置
	1)Number -> True 只能输入数字
	2)Password -> True 密码模式
	3)Want return -> True 接收回车键,自动换行,只有在多行模式下,才能换行
	4)Multiline -> True 多行模式
	5)Auto VScroll -> True
	   Vertical Scroll -> True 当垂直方式字符太多,自动出现滚动条
	6)Read Only -> True 只读
c)复制小案例
关联 Control:控件类型,只能关联一次
	1)获取编辑区内容 CWnd::GetWindowText
	2)设置编辑区内容 CWnd::SetWindowText
	3)关闭对话框窗口
		CDialogEx::OnOK();
		CDialogEx::OnCancel();

5)单选框、复选框 (特殊的CButton, 没有单选框, 复选框类型 )
a) 单选框
1) 属性设置:顺序排放 Ctrl+D 查看
2) 同组第一个按钮 Group 设置为 TRUE
3) 初始化单选框 CWnd::CheckRadioButton
4) 按钮是否按下 CWnd::IsDlgButtonChecked

b) 复选框
	1) 常关联变量 BOOL  UpdateData(TRUE), UpdateData(FALSE);
	2) 设置按钮选择状态 CButton::SetCheck
	3) 获取按钮选择状态 CButton::GetCheck

6)列表框CListBox
a) 给列表框添加一个字符串 CListBox::AddString
插入的结果顺序是按照 英文字母 由上而下
CListBox::InsertString(int nIndex, LPCTSTR lpszItem );插入结果严格按照代码中写的顺序来 依赖nIndex这个值,为-1 时 添加到末尾
b) 选中列表列表框某一项,自动触发事件:LBN_SELCHANGE
1)获取当前选中项 CListBox::GetCurSel
2)获取指定位置的内容 CListBox::GetText
c) 删除指定位置的字符串 CListBox::DeleteString 不用UpdateData(false)界面上的字符串就被删除了。
d) 在指定位置插入字符串 CListBox::InsertString
e)设置选中行 CListBox::SetCurSel 设置默认选则项

7)组合框(下拉框)CComboBox
a) 获取内容:CComboBox::GetLBText( int nIndex, LPTSTR lpszText )
其它接口和 CListBox 的用法几乎一样
b) 属性设置
1) data: 设置内容,不同内容间同英文的分号“;”分隔 可以初始化
2) type : DropDown 可编辑 DropList 不可编辑
3)sort 排序 按照 字母顺序

8)滚动条 CScrollBar: 只有一个事件处理,如果处理滑块和两端的按钮,则处理父窗口的WM_HSCROLL消息
a) 设置给定滚动条的最小和最大位置:CScrollBar::SetScrollRange
b) 获取一个滚动框的当前位置: CScrollBar::GetScrollPos
c) 设置一个滚动框的当前位置:CScrollBar::SetScrollPos
d) 处理滚动条的事件,不是在滚动条控件本身处理,是在滚动条所属的父窗口处理(对话框类)
处理信号: WM_HSCROLL

	void CControlDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)   
	
	说明: 只有点击 滑块时nPos 才有数值,如果想获得当前位置,则用GetScrollPos获得滑块位置。 滚动条默认是不会变的
	
e)滚动条位置关系
	switch (nSBCode) //判断滚动条的哪一部分
	{
	case SB_THUMBPOSITION: //滑块位置
		break;
	case SB_LINELEFT: //向左的箭头
		break;
	case SB_LINERIGHT: //向左的箭头
		break;
	case SB_PAGELEFT: //箭头和滑块之间左边
		break;
	case SB_PAGERIGHT: //箭头和滑块之间右边
		break;
	default:
		break;
	}

9)微调(旋转)按钮 SpinControl 的使用
a)属性设置
Auto Buddy -> True
Set buddy integer -> True
b)**微调(旋转)**按钮的顺序比伙伴大1 (Ctrl + D 查看),不能出现0.

MFC 对话框与常用控件_第1张图片
在点击5时 会在 4上显示

MFC 对话框与常用控件_第2张图片

                                        点击2时,在1上有显示

10)列表视图控件 CListCtrl
a) 属性设置 view -> Report (报表方式)
b) 常用接口 顺序
1)设置列表风格 CListCtrl::SetExtendedStyle
LVS_EX_FULLROWSELECT:选择整行
LVS_EX_GRIDLINES:网格方式
具体有哪些风格,可通过MSDN查看

	2)获取列表风格 CListCtrl::SetExtendedStyle
		具体有哪些风格,可通过MSDN查看	
		
	3)插入某列 CListCtrl::InsertColumn
	
	4)字符串格式化
		CString str;
		str.Format(_T("张三_%d"), i);
		
	5)插入新项后,才能设置子项内容
		a)插入新项(确定第几行) CListCtrl::InsertItem
		b)设置子项内容(设置第几列) CListCtrl::SetItemText	

【小结】先初始化InsertColumn 及SetExtendedStyle
再确定行 insertItem,
然后在修改行中列中内容SetItemText()

     //初始化 ::::
      CString str[] = { _T("家庭地址"),_T("电话"),_T("邮箱") };
	m_ctrList.InsertColumn(0,str[0], LVCFMT_LEFT,80,50);//如果只用m_ctrList.InsertColumn(0,str[0])则显示不出来,必须设置风格
	m_ctrList.InsertColumn(1,str[1] , LVCFMT_LEFT, 80, 50);
	m_ctrList.InsertColumn(2, str[2], LVCFMT_LEFT, 80, 50);

11)树视图控件 CTreeCtrl
a) 常用属性设置
has buttons -> true
has lines -> true
lines at root -> true
b) 写代码流程
1) 加载自定义图标
a) 获取应用程序对象指针 AfxGetApp()
b) 加载自定义图标 CWinApp::LoadIcon
2) 创建图像列表
a) .h 文件类中定义图形列表(CImageList)对象
b) 创建图像列表 CImageList::Create
c) 图像列表追加图标 CImageList::Add
4) 设置图形状态列表 CTreeCtrl::SetImageList
5) 插入节点 CTreeCtrl::InsertItem
6) 设置默认选中项 CTreeCtrl::SelectItem

【程序代码】

//图像列表,程序完毕不能释放 创建
	HICON hIc[3];
	//应用程序对象AfxGetApp(
	hIc[0] = AfxGetApp()->LoadIcon(IDI_ICON1);
	hIc[1] = AfxGetApp()->LoadIcon(IDI_ICON2);
	hIc[2] = AfxGetApp()->LoadIcon(IDI_ICON3);

	//给图像列表添加图片
	//30 30 图片的大小
	//3  3 有多少张写多少
	m_image.Create(30,30, ILC_COLOR32,3,3);

	//图片列表加载图标
	for (int i = 0; i < 3; i++)
	{
		m_image.Add(hIc[i]);
	}
	//树控件设置图片列表
	m_treectrl.SetImageList(&m_image,TVSIL_NORMAL);

	//给树创建节点
	//根节点 父节点 子节点
	//InsertItem(_T("根节点"), 0, 0, NULL);//文本,改变前图标,改变后,是否有父节点
	HTREEITEM  root = m_treectrl.InsertItem(_T("根节点"),0,0,NULL);

	HTREEITEM father = m_treectrl.InsertItem(_T("父节点"), 1, 1, root);

	HTREEITEM son = m_treectrl.InsertItem(_T("父节点"), 2, 2, father);

	HTREEITEM  root2 = m_treectrl.InsertItem(_T("根节点"), 0, 0, NULL);

	HTREEITEM father2 = m_treectrl.InsertItem(_T("父节点"), 1, 1, root2);

	HTREEITEM son2 = m_treectrl.InsertItem(_T("父节点"), 2, 2, father2);

	//设置某个节点被选中
	m_treectrl.SelectItem(father);
	m_treectrl.SelectItem(son2);

MFC 对话框与常用控件_第3张图片
12) 标签控件 CTabCtrl
1)在ui工具箱拖放 Tab Control
2)把 TabSheet.h和TabSheet.cpp 放在项目文件同级目录,并且添加到工程目录中
3)给ui上 Tab Control 关联Control类型(CTabSheet)
4)CTabSheet对象添加对话框
a) 资源视图 -> Dialog -> 右击 -> 插入 Dialog
b) 设置相应属性:
Style -> Child (子窗口)
Border -> None (无边框)
c) 自定义类:点击对话框模板 -> 右击 -> 添加类
d) 主对话框类中, 定义自定义类对象
e) 主对话框类中 OnInitDialog() 做初始化工作
f)CTabSheet添加对话框 CTabSheet::AddPage()
tmp.AddPage(_T(“系统管理”), &t1, tab1);
tmp: 为CTabSheet对象
t1:需要添加对话框对象
tab1:对话框ID

	g)显示窗口:CTabSheet::Show()
	【借用CTableSheet类来实现 Tab控件】
       //tab控件 添加对话框
	//对话框设置为子对话框,默认为单独对话框,默认为父亲
	//外观   :sytle默认为popup 改为child  border 改为 none
	m_tab.AddPage(_T("测试"),&dlg1, IDD_DIALOG1);
	m_tab.AddPage(_T("实验"), &dlg2, IDD_DIALOG2);
	//显示控件
	m_tab.Show();
	//发现 对话框已经跑出了 主对话框,因为默认对话框为 弹出型  想要在里面的话,则设置成 child模式

你可能感兴趣的:(MFC)