《VC++深入详解》学习笔记 第七、八章对话框
(程序员不仅要会写代码还要会写博客还要会写诗??我是原来是硬件工程师诶)
控件问题: 对话框中各种控件都是CWnd派生而来都是窗口,一般为对话框子窗口,也可以在视类窗口中使用
模态对话框: 对话框分为模态对话框(开启后禁止其他界面交互)和非模态对话框(不禁止其他界面交互)
创建模态对话框: 创建对话框类(CDialog类)>类.DoModal();(CDialog类DoModal函数)
非模态对话框创建: CDialog类Create函数) Create(ID,pParentwnd) 创建完成后用ShowWindow函数显示
为保持其生命周期(定义为视类窗口对象/定义为指针对象)(结束对话框按钮需要手动重写按钮函数并调用DestroyWindow销毁对话框,否则只是隐藏)
局部指针会引发内存泄露(要么视类中创建然后析构函数中delete/要么原类中重载PostNcDestroy(窗口销毁后调用)释放this指向内存)
按钮控件的创建: CButton::Create();
获取指定ID控件对象: CWnd* GetDlgItem(int nID) const;
静态文本控件: 可以 通过配置Notify从而实现消息响应,其次需要配置新ID
获取,设置文字: pWnd->GetWindowText(CString)获取文字到CString pWnd->SetWindowText(CString)设置文本
获取指定ID控件文本: GetDlgItemText()/SetDlgItemText() GetDlgItemInt()/SetDlgItemInt()
编辑框控件: 可以将编辑框文本和对话框类中成员数据变量(类型随意)关联 框架自动重写DoDataExchange实现变量关联
UpdateData(bool);更新关联数据.默认为true从对话框获取,false变量赋值对话框
同时可以和控件变量关联、当成对象使用
DDX/DDV: 对话框数据交换/校验
对话窗伸缩(展开): 配置完伸缩按钮文字变化>将图型控件拉伸为细线坐标伸缩分割线>设置两变量(CRect)作为两种状态尺寸存放
判断尺寸存放变量是否为空(IsRectEmpty/IsRectNull)>以图形控件作为边界限制伸缩尺寸
判断状态(伸还是缩)>设置尺寸SetWindowPos(pCWnd,x,y(坐标),cx,cy(宽高),尺寸配置)
焦点移动下一控件: GetDlgItem(ID)获取当前窗口指针>GetNextDlgTabItem()获取下一窗口指针>SetFocus()输入焦点移动该位置弄人
默认按钮优先级高
属性表单: IDD_PROPPAGE_XXX 属性页资源
风格(Style):子集(Child) 边框(Border)为细 对话框中不包含系统菜单(System menu) 最初显示不使用(Disabled)
创建对应类,对每一页属性页创建对应类基于CPropertyPage确保ID对应正确,然后创建属性表单基于CPropertySheet类(MFC类)其中对每一页属性页建立对象,
在其构建函数中通过AddPage(pPage)将属性页添加进表单,在需要地方通过创建对象 (构建函数是创建属性表单标题),然后DoModal()调用对象;
向导构建: 向导是一种特殊属性表单,在通过DoModal()显示对象前,通过SetWizardMode()设置向导模式,
按钮配置:在对应类中重写OnSetActive()函数,通过SetWizardButtons()设置按钮
ps:向导首页只有下一步:((CPropertySheet*)GetParent())->SetWizardButtons(PSWIZB_NEXT);
中间页存在上一步和下一步:((CPropertySheet*)GetParent())->SetWizardButtons(PSWIZB_BACk | PSWIZB_NEXT);
最后一页有上一步和完成:((CPropertySheet*)GetParent())->SetWizardButtons(PSWIZB_BACk | PSWIZB_FINISH);
重写OnWizardNext()实现在对下一步按键响应前处理,返回值为-1时禁止属性页变更(注意添加提示MessageBox,注意数据更新)
同理OnWizardBack(),OnWizardFinsh()对应上一步和完成按键
当DoModal()结束后窗口被销毁,但其对象依然存在可以访问其内部成员
单选框控件: 将单选控件设为组后,添加一个Value-int变量表示选择内容和第一个控件ID绑定,-1为没选,0~表示选择第几个根据tab顺序,第一个为0
列表框控件: 通过AddString进行字符串添加(在对话框初始化函数中添加OnInitDialog())
ps:((CListBox*)GetDlgItem(IDC_LIST1))->AddString("背景");
多选框控件: 每个控件单独设定变量,控件勾取,变量为True否则为False
组合框控件: 通过AddString进行数据添加,同样在初始化函数中
ps:((CComboBox*)GetDlgItem(IDC_COMBO3))->AddString("10000左右");
SetCurSel(索引首位为0)设置默认选项 int GetCurSel();获取索引 GetLBText(索引,接收缓存);获取索引位置字符串
窗体重绘: Invalidate();使窗体无效引发重绘,然后再OnDraw()配置重绘内容