zoukankan      html  css  js  c++  java
  • 结对编程项目阶段性进展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(); 
       } 

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

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

  • 相关阅读:
    .Net 更容易的使用配置文件 SuperConfig
    .Net 5分钟搞定网页实时监控
    记一次sql server 性能调优,查询从20秒至2秒
    [asp.net mvc 奇淫巧技] 05
    [asp.net mvc 奇淫巧技] 04
    [asp.net mvc 奇淫巧技] 03
    [asp.net mvc 奇淫巧技] 02
    ECharts 实现人民的名义关系图谱 代码开源
    C# 快速高效率复制对象另一种方式 表达式树
    Asp.net SignalR 应用并实现群聊功能 开源代码
  • 原文地址:https://www.cnblogs.com/chengyu404/p/5350637.html
Copyright © 2011-2022 走看看