这一周,我和同组的人一直在学习如何使用MFC,构建出一个图形化界面
下面是转载别人博客的一些学习MFC的总结
来源:http://my.oschina.net/u/1772925/blog/410340
一、接触MFC day01
1. 使用资源:
①insert resource,对话框资源
②resource view下面,右键对话框,修改properties,重要的是资源ID,一般为IDD_Dialogxx
③对资源的操作一般都是通过类来完成,因此要操作资源需要为资源添加类,基类一般都是CDialog
注意:添加类后,在class view中没有该类的浏览信息
方法一:可以删除 .ncb文件(no compile browse 无编译浏览文件),重新编译一遍
方法二:在文件视图,右键工程,添加 cpp文件和h文件(----win7下右键工程添加文件没有反应---)
方法三:直接修改dsp文件
|-------用记事本打开dsp文件----①SOURCE=.\xxx.cpp
|---②SOURCE=.\xxx.h
2. 对话框的创建;
2.1 头文件包含include “dialog.h”
2.2 先创建后显示
2.2.1 创建模态对话框:Ctest dlg; dlg.DoModal();
2.2.2 创建非模态对话框:
①static CTestDlg dlg; 或者设置成员变量dlg;或者使用堆对象dlg
②dlg.Create();
③dlg.ShowWindow(); 如果在Create函数中设置了WS_VISIBLE参数,则不需要调用ShowWindow函数
④如果是堆中的对象,还需要重写OnOK函数,在其中销毁dlg:dlg->Destroy()---------------------重要
3. Button的创建(通上面Dialog的创建)
CButton btn;
if(b_isCreated)
{
btn.Create();
btn.ShowWindow(SW_SHOW);
Sleep(2000); 睡眠2s
}
else
{
btn.Destroy(); // 现在就销毁资源,如果是堆空间,这句话非常重要
}
4. 让static text 静态文本框 接收消息:
①由于所有的static都是相同的ID_STATIC,因此无法添加消息,修改ID后可以通过消息映射添加消息处理函
②style中设置允许通告消息notify
5. 获得对话框中的对象: CWnd* GetDlgItem(ID_XXX)
SetWindowText("xxx");
GetWindowText(CString&);
6. 控件访问的7种方式: 原始方式 控件绑定 消息方式
6.1 GetDlgItem()->Get(Set)WindowText();
结合:atoi和itoa函数
/--------------------------------------------------/
char n1[16],n2[16],n3[16];
int i1,i2,i3;
GetDlgItem(IDC_EDIT1)->GetWindowText(n1,sizeof(n1));
..
i1=atoi(n1);
i2=atoi(n2);
i3=i1+i2;
GetDlgItem(IDC_EDIT3)->SetWindowText(itoa(i3,n3,10));
/---------------------------------------------------/
6.2 GetDlgItemText()/SetDlgItemText()
6.3 GetDlgItemInt()/SetDlgItemInt();
/---------------------------------------------------/
int i1,i2,i3;
i1=GetDlgItemInt(IDC_EDIT1);
i2=GetDlgItemInt(IDC_DEIT2);
i3=i1+i2;
SetDlgItemInt(IDC_EDIT3);
/---------------------------------------------------/
6.4 将控件和整型相关联
①ClassWizard -> Member Variables
②DDX_Text
③DoDataExchange
UpdateData(true); // 获取值
m_num3=m_num1 + m_num2;
UpdateData(false); // 更新值
注意:使用DDX,DDV时候,需要使用UpdateData函数,一般安装先真后假的顺序执行
6.5 将控件和控件变量关联
一个控件可以和多个,多种类型的变量绑定
m_Edit.GetWindwoText(buf,sizeof(buf));
m_Edit.SetWindowText(buf);
6.6 SendMessage()
WM_GETTEXT 获取消息
WM_SETTEXT 设置消息
方法1:使用::SendMessage(hwnd,uMsg,wParam,lParam);
char buf[64]={'\0'};
::SendMessage(m_Edit.m_hWnd,WM_GETTEXT,sizeof(buf),(LPARAM)buf);
::SendMessage(GetDlgItem(IDC_EDIT)->m_hWnd,WM_GETTEXT,sizeof(buf),(LPARAM)buf);
int i=atoi(buf);
itoa(xx,xx,xx);
::SendMessage(m_Edit.m_hWnd,WM_SETTEXT,0,(LPARAM)buf);
方法2:使用成员 .SendMessage(uMsg,wParam,lParam);
m_Edit.SendMessage(WM_GETTEXT,sizof(buf),(LPARAM)buf);
注意:这里说明,在不同的环境下,wParam和lParam代表的参数不同含义
6.7 SendDlgItemMessage()
SendDlgItemMessage(IDC_EDIT,WM_GETTEXT,sizeof(buf),(LPARAM)buf);
7. 属性表单、向导程序wizard
属性表单和属性页
7.1 创建属性页----------------------------------------------------------需要界面资源
①插入属性页资源,设计"属性页"资源,
insert resource -> 对话框 IDD_PROPAGE_XXX
insert resource -> 对话框 IDD_PROPSHEET_XXX
②为页面添加类(继承CPropertyPage) 需要属性页资源
注意:在resource view中,复制一个资源,直接粘贴,可以快速产生多个资源
7.2 创建属性表单类(包含3个属性页类的成员) (继承CPropertySheet)-----不需要界面资源
①insert -> new class : CPropSheet Base class:CPropertySheet
②物理上添加属性表单:右键属性表单类名 -->> 添加成员变量 m_page1,m_page2,...
③逻辑上添加属性表单:构造函数中:AddPage(m_page1);AddPage(m_page2);...
④主对话框添加一个按钮,添加消息响应:sheet.DoModal();
void CHelloDialog::OnBtn(){
CPropSheet sheet(第一个表单程序);
sheet.SetWizardMode();
sheet.DoModal();
}
注意:中文乱码,将资源属性中,将字体改成新宋体
向导程序
在DoModal之前调用,sheet.SetWizarMode()
总结:
-------------------------------------------
类型 基类 是否需要资源
-------------------------------------------
属性页 CPropertyPage 需要
属性表单 CPropertySheet 不需要
-------------------------------------------
7.3 完善Wizard:
关键点:上一步,下一步,确定,取消 等按钮属于Sheet
CPropertySheet::SetWizardButtons(xxx)
①属性表单处于Active状态时候: 要取消上一步,下一步按钮,
必须复写虚函数:virtual CPropertyPage::OnSetActive()
BOOL CProp1::OnSetActive(){
// 这里需要转型,因为GetParent返回一个CWnd*指针,
// 而SetWizardButtons不是虚函数,因此必须转型为CPropertySheet类型
((CPropertySheet*)GetParent())->SetWizardButtons(PS_);
}
②virtual CPropertyPage::OnWizardNext() -----------单击下一步,CPropertyPage派生类调用该函数
LRESULT CProp1::OnWizardNext(){
if(条件不满足){xxx,return -1}
CPropertyPage::OnWizardnext();
}
最终,我们也大概设计了一个界面雏形
结构比较丑陋,不代表最终成品的样子