第8章 对话框(二)
参考: https://blog.csdn.net/u014162133/article/details/46573873
https://blog.csdn.net/u012377333/article/details/40791033
1、如何改变按纽的字体?在对话框的属性中改变字体的属性即可
2、逃跑按纽的实现方法一:
(1) 从CButton派生一个类,CWeixinBtn
(2) 将IDC_EDIT1关联成员变量m_btn1,类型为CWeixinBtn,注意要包含头文件。
(3) 在CWeixinBtn中加一个指针成员变量CWeixinBtn *pWeixinBtn,然后将其地址初始化。
(4) 在新类中增加鼠标移动的消息处理。
m_btn1.m_pbtn=&m_btn2;
m_btn2.m_pbtn=&m_btn1;
void CButtonDlg::OnMouseMove(UINT nFlags, CPoint point) { ShowWindow(SW_HIDE); m_pbtn->ShowWindow(SW_SHOW); CButton::OnMouseMove(nFlags, point); }
3、逃跑按纽的实现方法二:使用SetWindowPos
void CDlgButton::OnMouseMove(UINT nFlags, CPoint point) { static CRect crectold,crectnew; if(crectold.IsRectNull()) { GetWindowRect(&crectold); crectnew.left=crectold.left-100; crectnew.top=crectold.top+100; crectnew.right=crectold.right-100; crectnew.bottom=crectold.bottom+100; } ScreenToClient(&crectold); SetWindowPos(NULL,crectold.left,crectold.top+100,crectold.right,crectold.bottom+100,SWP_SHOWWINDOW|SWP_NOSIZE ); //ShowWindow(SW_SHOW); /*CString cstring; cstring.Format("x=%d",crectold.left); MessageBox(cstring);*/ CButton::OnMouseMove(nFlags, point); }
只是初步测试,由于时间关系,自己改吧。
4、memset()的用法! memset(m_bLike,0,sizeof(m_bLike));将所指定长度设置为0
ZeroMemory(m_bLike, sizeof(m_bLike));同上效果
5、属性表单和向导的创建
(1) 插入属性页资源。Insert->new Resource->Dialog。
(2) 当选择Classwizard菜单时,系统提示是否为创建新的类,我们将其从CPropertyPage派生!这样可以为方便为其增加消息响应函数。
(3) 插入新的从CPropertySheet派生的类,在类中增加3个CPropertyPage的实例。
(4) 在view中增加菜单项,当点击时显示属性表单,出现中文乱码,修改CPropertyPage属性为中文,另外将其字体设为宋体。
(5) 在CPropertyPage中设置SetWizardButtons可将其属性改为上一步、完成。
(6) 为IDC_RADIO1关联成员变量,需要先设置Group属性才行。另外别忘记调用UpdateData()。
(7) 为CPropertyPage增加虚函数,OnWizardNext,如果用户点击下一步时,不想让他进入下一步,则返回-1。
(8) 将用户的选择输出到屏幕上,此时可以在View中增加几个成员变量,用来接收用户选择的数据。
6、解决中文乱码的问题:先设置propertypage的字体为Chinese,然后修改字体为宋体或其他
7、
(1)新建一个MFC单文档模式
(2)在资源那里添加
创建三个属性页.
(3)然后拉控件
(4)为每个Proppage添加一个类
(5) 查MSDN得知,要用CPropertySheet调用AddPage
(6)在其构造函数中添加
CPropSheet::CPropSheet(UINT nIDCaption, CWnd* pParentWnd, UINT iSelectPage) :CPropertySheet(nIDCaption, pParentWnd, iSelectPage) { AddPage(&m_proc1); AddPage(&m_proc2); AddPage(&m_proc3); } CPropSheet::CPropSheet(LPCTSTR pszCaption, CWnd* pParentWnd, UINT iSelectPage) :CPropertySheet(pszCaption, pParentWnd, iSelectPage) { AddPage(&m_proc1); AddPage(&m_proc2); AddPage(&m_proc3); }
(7) 菜单添加一个选项
void CProccView::OnProc() { //MessageBox("hello"); CPropSheet cpst("属性列表"); cpst.DoModal(); }
这样就可以显示了
To create a wizard-type dialog box, follow the same steps you would follow to create a standard property sheet, but call SetWizardMode before you call DoModal.
void CProccView::OnProc() { //MessageBox("hello"); CPropSheet cpst("属性列表"); cpst.SetWizardMode( ); cpst.DoModal(); }
向导的按钮有问题,第一页是没有上一页的:
属性页添加到属性表单,属性表单就是属性页的父窗体
BOOL CProc1::OnSetActive() { ((CPropertySheet*)GetParent())->SetWizardButtons(PSWIZB_NEXT);//CPropertySheet相当于CPropertyPage的父窗体 return CPropertyPage::OnSetActive(); }
BOOL CProp3::OnSetActive() { ((CPropertySheet*)GetParent())->SetWizardButtons(PSWIZB_BACK|PSWIZB_FINISH); return CPropertyPage::OnSetActive(); }
第一个单选按钮在GROUP打钩,则后面(直到再次遇到一个GROUP打钩的)都为同一组:
单选关联一个数值:
为CListBoX赋值,WM_INITDILOG
BOOL CProc1::OnInitDialog() { CPropertyPage::OnInitDialog(); // TODO: Add extra initialization here CString cst1="北京"; CString cst2="上海"; CString cst3="天津"; CString cst4="南京"; CString cst5="广州"; ((CListBox*)GetDlgItem(IDC_LIST1))->AddString(cst1); ((CListBox*)GetDlgItem(IDC_LIST1))->AddString(cst2); ((CListBox*)GetDlgItem(IDC_LIST1))->AddString(cst3); ((CListBox*)GetDlgItem(IDC_LIST1))->AddString(cst4); ((CListBox*)GetDlgItem(IDC_LIST1))->AddString(cst5); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE }
LRESULT CProc1::OnWizardNext() { // TODO: Add your specialized code here and/or call the base class UpdateData();//参数默认为TRUE,取值的时候,参数为TRUE,要赋值的时候,参数为FALSE if(m_zhiye==-1) { MessageBox("请选择你的职业"); return -1; } if(m_gongzuodidian=="") { MessageBox("请选择你的工作地点"); return -1; } return CPropertyPage::OnWizardNext(); }
LRESULT CProc2::OnWizardNext() { UpdateData(); if(m_zuqiu||m_lanqiu||m_paiqiu||m_youyong) { return CPropertyPage::OnWizardNext(); } else { MessageBox("请选择你的兴趣爱好"); } }
初始化CCombox
BOOL CProp3::OnInitDialog() { CPropertyPage::OnInitDialog(); // TODO: Add extra initialization here CString str1="1000元以下"; CString str2="1000-2000元"; CString str3="2000-3000元"; CString str4="3000-5000元"; CString str5="5000元以上"; ((CComboBox*)GetDlgItem(IDC_COMBO1))->AddString(str1); ((CComboBox*)GetDlgItem(IDC_COMBO1))->AddString(str2); ((CComboBox*)GetDlgItem(IDC_COMBO1))->AddString(str3); ((CComboBox*)GetDlgItem(IDC_COMBO1))->AddString(str4); ((CComboBox*)GetDlgItem(IDC_COMBO1))->AddString(str5); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE }
把SORT的勾去掉,使得它按照我们添加进去的顺序排序
数值关联:
VIEW中添加成员变量,用以接收数据
private: int zhiye; CString gongzuodidian; BOOL xingqu[4]; CString xinzishuiping; };
void CProccView::OnProc() { //MessageBox("hello"); CPropSheet cpst("属性列表"); cpst.SetWizardMode( ); //cpst.DoModal(); if(ID_WIZFINISH==cpst.DoModal()) { zhiye=cpst.m_proc1.m_zhiye; gongzuodidian=cpst.m_proc1.m_gongzuodidian; xingqu[0]=cpst.m_proc2.m_zuqiu; xingqu[1]=cpst.m_proc2.m_lanqiu; xingqu[2]=cpst.m_proc2.m_paiqiu; xingqu[3]=cpst.m_proc2.m_youyong; xinzishuiping=cpst.m_proc3.cstrxinshui; Invalidate(); } }
void CProccView::OnDraw(CDC* pDC) { CProccDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: add draw code for native data here CFont cfont; cfont.CreatePointFont(300,"宋体"); CFont *oldfont=pDC->SelectObject(&cfont); TEXTMETRIC tm; pDC->GetTextMetrics(&tm); CString temp="你的职业是:"; if(zhiye==0) { temp+="程序员"; } if(zhiye==1) { temp+="系统工程师"; } if(zhiye==2) { temp+="项目经理"; } pDC->TextOut(0,0,temp); temp="你的工作地点是:"; temp+=gongzuodidian; pDC->TextOut(0,tm.tmHeight,temp); temp="你的兴趣爱好是:"; if(xingqu[0]) { temp+="足球 "; } if(xingqu[1]) { temp+="篮球 "; } if(xingqu[2]) { temp+="排球 "; } if(xingqu[3]) { temp+="游泳 "; } pDC->TextOut(0,tm.tmHeight*2,temp); temp="你的薪资水平是"; temp+=xinzishuiping; pDC->TextOut(0,tm.tmHeight*3,temp); pDC->SelectObject(oldfont); }
自此,这个程序完成了