结对编程项目阶段性进展2

这一周,我和同组的人一直在学习如何使用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(); 
   } 

 

最终,我们也大概设计了一个界面雏形

结构比较丑陋,不代表最终成品的样子

posted @ 2016-04-03 20:52  13070035王辰成  阅读(165)  评论(0编辑  收藏  举报