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.
点击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);
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模式