VC++/MFC Window编程原创教程目录
1:设置一个属性表单
添加三个Dialog--IDD_PROPPAGE_LARGE资源,修改ID为:IDD_PROP1、2、3;
添加如下控件:
右键点击IDD_PROP1、2、3资源视图--添加类(类名CProp1、2、3,基类:CPropertyPage属性页类);
添加新类CPropSheet,基类为:CPropertySheet。一个属性表由一个CPropertySheet对象和一个或多个CPropertyPage对象构成。
为CPropSheet添加CProp1、2、3变量m_prop1、2、3。
在CPropSheet的两个构造函数加上属性页:
CPropSheet::CPropSheet(UINT nIDCaption, CWnd* pParentWnd, UINT iSelectPage)
:CPropertySheet(nIDCaption, pParentWnd, iSelectPage)
{
AddPage(&m_prop1);
AddPage(&m_prop2);
AddPage(&m_prop3);
}
CPropSheet::CPropSheet(LPCTSTR pszCaption, CWnd* pParentWnd, UINT iSelectPage)
:CPropertySheet(pszCaption, pParentWnd, iSelectPage)
{
AddPage(&m_prop1);
AddPage(&m_prop2);
AddPage(&m_prop3);
}
最后在菜单增加子菜单(属性表单),改其ID为IDM_PROPERTYSHEET,添加CPropView下的COMMAND消息。代码:
void CPropView::OnPropertysheet()
{
// TODO: 在此添加命令处理程序代码
CPropSheet propSheet("属性表单程序");
propSheet.SetWizardMode(); //加上此句代码表向导模式。不加,则是选择模式。
propSheet.DoModal(); //显示方法与Dialog相似
}
若使用向导模式,则需增加代码完善页面。
CProp1--属性--重写(虚函数)--添加OnSetActive() //选择的页面为活动页面时触发的函数。代码如下
BOOL CProp1::OnSetActive()
{
// TODO: 在此添加专用代码和/或调用基类
((CPropertySheet*)GetParent())->SetWizardButtons(PSWIZB_NEXT);
//属性表单是属性页的父窗口,所以可以使用GetParent()获取然后进行转换。SetWizardButtons(PSWIZB_NEXT)表向导第一页只有下一步可用。
//同理,在CProp2、3添加的OnSetActive()代码为:
((CPropertySheet*)GetParent())->SetWizardButtons(PSWIZB_BACK | PSWIZB_NEXT);
((CPropertySheet*)GetParent())->SetWizardButtons(PSWIZB_BACK | PSWIZB_FINISH);
return CPropertyPage::OnSetActive();
}
2.1:需要进行选择职业才能进入下一步。
将单选选项的Group属性值设置为TRUE才能为选项关联变量,表该页的单选选项关联在同一组,下标为0、1、2...直到遇到下个单选选项的Group属性值为TRUE的另一组。
为"程序员IDC_RADIO1"关联变量(Value,int变量名m_occupation),在构造函数将其初始值设为-1(0的话表默认选择第一项了)。然后重写(虚函数)OnWizardNext,代码:
LRESULT CProp1::OnWizardNext()
{
// TODO: 在此添加专用代码和/或调用基类
UpdateData(); //DoDataExchange 框架与控件用来交流数据,呼叫UpdateData函数时才会被调用http://zhidao.baidu.com/question/89105522.html
if(m_occupation==-1)
{
MessageBox("请选择你的职业");
return -1; //返回-1表返回当前属性页;返回0表下一步
}
return CPropertyPage::OnWizardNext();
}
2.2:需要进行选择工作地点才能进入下一步。
为IDC_LIST1列表框关联一个变量(Value,CString,变量名m_workAddr)。
重写(虚函数)OnInitDialog (框架显示前响应),代码:
BOOL CProp1::OnInitDialog()
{
CPropertyPage::OnInitDialog();
// TODO: 在此添加额外的初始化
((CListBox*)GetDlgItem(IDC_LIST1))->AddString("北京");
((CListBox*)GetDlgItem(IDC_LIST1))->AddString("天津");
((CListBox*)GetDlgItem(IDC_LIST1))->AddString("上海");
return TRUE; // return TRUE unless you set the focus to a control
// 异常: OCX 属性页应返回 FALSE
}
2.3:第二页,需要选择兴趣爱好才能下一步。
为IDC_CHECK1、2、3、4分别添加变量m_football、m_basketball、m_volleyball、m_swin(Value,BOOL)
为CProp2重写nWizardNext
LRESULT CProp2::OnWizardNext()
{
// TODO: 在此添加专用代码和/或调用基类
UpdateData();
if(m_football || m_basketball || m_volleyball || m_swin)
{
return CPropertyPage::OnWizardNext();
}
else
{
MessageBox("请选择你的兴趣爱好");
return -1;
}
}
2.4:第三页,默认选择第一项。
重写(虚函数)OnInitDialog
BOOL CProp3::OnInitDialog()
{
CPropertyPage::OnInitDialog();
// TODO: 在此添加额外的初始化
((CComboBox*)GetDlgItem(IDC_COMBO1))->AddString("1000元以下");
((CComboBox*)GetDlgItem(IDC_COMBO1))->AddString("1000--2000元");
((CComboBox*)GetDlgItem(IDC_COMBO1))->AddString("2000--3000元");
((CComboBox*)GetDlgItem(IDC_COMBO1))->AddString("3000元以上");
((CComboBox*)GetDlgItem(IDC_COMBO1))->SetCurSel(0); //选择第一个(-1为不选择)。
return TRUE; // return TRUE unless you set the focus to a control
// 异常: OCX 属性页应返回 FALSE
}
3:输出选项内容。
首先在CProp3定义一个CString m_strSalary变量接收选项内容。
为CProp3重写nWizardFinish。
BOOL CProp3::OnWizardFinish()
{
// TODO: 在此添加专用代码和/或调用基类
int index; //接收索引
index=((CComboBox*)GetDlgItem(IDC_COMBO1))->GetCurSel();
((CComboBox*)GetDlgItem(IDC_COMBO1))->GetLBText(index,m_strSalary); //接收对应索引的文本
return CPropertyPage::OnWizardFinish();
}
在View.h类手动添加变量:
int m_iOccupation; //接收职业
CString m_workAddr; //接收工作地点
BOOL m_bLike[4]; //接收兴趣爱好
CString m_strSalary; //接收工薪水平
初始化:
CPropView::CPropView()
{
// TODO: 在此处添加构造代码
m_iOccupation=-1;
m_workAddr="";
memset(m_bLike,0,sizeof(m_bLike)); //数组初始化。参数(首地址,初始值,数组长度)
m_strSalary="";
}
然后是获取属性页各项的值:
void CPropView::OnPropertysheet()
{
// TODO: 在此添加命令处理程序代码
CPropSheet propSheet("属性表单程序");
propSheet.SetWizardMode();
if(propSheet.DoModal()) //窗口销毁之后。但此时对象还在!
{
m_iOccupation=propSheet.m_prop1.m_occupation;
m_workAddr=propSheet.m_prop1.m_workAddr;
m_bLike[0]=propSheet.m_prop2.m_football;
m_bLike[1]=propSheet.m_prop2.m_basketball;
m_bLike[2]=propSheet.m_prop2.m_volleyball;
m_bLike[3]=propSheet.m_prop2.m_swin;
m_strSalary=propSheet.m_prop3.m_strSalary;
//添加一个BOOL变量初始化为FALSE,用在OnDarw的判断
m_bDraw=TRUE;
Invalidate(); //让窗口无效,引起窗口重绘。然后在OnDraw完成信息是输出
}
}
void CPropView::OnDraw(CDC* pDC) //把后面的注释取消
{
CPropDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
// TODO: 在此处为本机数据添加绘制代码
if(m_bDraw==true)
{
CString strTemp; //接收输出的文本。
TEXTMETRIC tm; //接收字体信息
strTemp="你的职位:";
switch(m_iOccupation) //根据单项选择索引赋值
{
case 0:
strTemp+="程序员";
break;
case 1:
strTemp+="系统工程师";
break;
case 2:
strTemp+="项目经理";
break;
default:
break;
}
pDC->TextOutA(0,0,strTemp); //输出职位
pDC->GetTextMetrics(&tm);
strTemp="你的工作地点:"+m_workAddr;
pDC->TextOutA(0,tm.tmHeight,strTemp); //输出工作地点
strTemp="你的兴趣爱好:";
if(m_bLike[0]==true)
strTemp+="足球 ";
if(m_bLike[1]==true)
strTemp+="篮球 ";
if(m_bLike[2]==true)
strTemp+="排球 ";
if(m_bLike[3]==true)
strTemp+="游泳 ";
pDC->TextOutA(0,tm.tmHeight*2,strTemp); //输出兴趣爱好
strTemp="你的薪资:"+m_strSalary;
pDC->TextOutA(0,tm.tmHeight*3,strTemp); //输出薪资
}
}
分享到:
相关推荐
在这种情况下,最好定义一个本地的 data 属性并将这个 prop 用作其初始值: props: [‘initialCounter’], data: function () { return { counter: this.initialCounter } } 这个 prop 以一种原始的值传入且...
1.在写循环的时候遇见这个的 原创文章 96获赞 50访问量 6万+ 关注 私信 展开阅读全文 作者:itwangyang520
两大部分,对JQ . prop()属性的完美解释,及对jquery.tableCheckbox.jsd 解释
antd+vue实现动态验证循环属性表单的思路 希望实现查询表单的某些属性可以循环验证必填项: 需求: 1.名称,对比项,备注必填,默认为一行,可增加多行 2.根据名称,动态请求对比项列表,名称变化时,清空该行...
prop()方法设置属性值语法: $(selector).prop("属性", "属性值");prop()方法获取a标签属性:;prop()方法获取input标签属性:;attr()方法:attr()用来设置或获取元素的自定义属性,自定义属性是指用户给元素添加的非...
主要介绍了Vue组件中prop属性使用说明,非常不错具有一定的参考借鉴价值,需要的朋友可以参考下
获取和设置嵌套属性。 安装 $ npm install --save nested-prop 用法 var nestedProp = require ( 'nested-prop' ) ; var obj = { a : '' } ; nestedProp . set ( obj , 'a.b.c' , 1 ) ; //=> {a: {b: {c: 1}}} ...
Tor Prop279 DNS提供商dns-prop279充当Tor Prop279客户端和DNS服务器之间的桥梁。 它设计用于Tor中的Namecoin命名。 dns-prop279是Miek Gieben出色的q工具的分支。用法您需要才能使用dns-prop279 。 您还需要DNS...
从对象获取随机属性 安装 $ npm install random-obj-prop 用法 const randomObjProp = require ( 'random-obj-prop' ) ; randomObjProp ( { foo : ':horse_face:' , bar : ':unicorn:' } ) ; //=> ':unicorn:' ...
第十二节:vue表单处理 第十三节:vue生命周期 第十四节:vue-cli脚手架安装 第十五节:基于vue-cli搭建HelloWorld项目 第十六节:通过 Prop 实现父子组件数据传递 第十七节:父子组件方法传递及回调 第十八节:...
第十二节:vue表单处理 第十三节:vue生命周期 第十四节:vue-cli脚手架安装 第十五节:基于vue-cli搭建HelloWorld项目 第十六节:通过 Prop 实现父子组件数据传递 第十七节:父子组件方法传递及回调 第十八节:...
-- 表单 --> <el-form ref="rulesForm" :rules="formRules" :model="rulesForm" label-width="200px"> 用户名称:" prop="userName"> <el-input v-model="rulesForm.userName" style="width:300px" maxlength="50...
PSS语言基于道具的StyleSheets旨在改善React.js项目的样式语法。... 到目前为止,如果您想将基于prop的样式应用于您的React组件,则需要: 编写CSS类,然后将它们手动映射到我们的每个组件道具if prop
中国土壤数据中国30S栅格格式 :ADD_PROP: Real (土壤单元中与农业用途有关的特定土壤类型)
build.prop是所有安卓手机都有的一些配置信息。 位置在system/build.prop 我们了解了这些配置的意义后,可以通过编辑rom包对这个配置文件做一定的修改,达到不同的自定义效果,如:更改dpi、更改版本号、更改网络首...
build.prop文件可以控制整个安卓系统的流畅性
ucGUI-Prop-Font-CombinatorucGUI Prop型字模库“组合”工具与 PCtoLCD 程序配合,生成用于 ucGUI 显示用的字模字体文件用法先用 PCtoLCD 程序分别生成 ASCII 和 NonASCII 的字模文件,修改此程序配置项中对应的字段...
is-prop 检查对象中的属性是否等于某物的功能方法。 基本上return object[property] == value ,但带有函数。 npm install --save is-prop 例子当您想测试传递给函数的对象中的相等性时, is-prop很有用。 例如,它...
在Preact中,“测试中”(节点中的prop)用于推断是否应将给定的抽象“ prop”作为属性或属性应用于DOM。 这种方法可以更自然地处理“自定义元素”属性,但这是以牺牲性能和确定性为代价的。 其他渲染库选择向开发...
本文实例讲述了Vue Prop属性功能与用法。分享给大家供大家参考,具体如下: 1 Prop 的大小写 (camelCase vs kebab-case) HTML 中的特性名是大小写不敏感的,所以浏览器会把所有大写字符解释为小写字符。这意味着当你...