【转】第六章 对话框编程(1)

来源:互联网 发布:一分钟59秒什么梗 知乎 编辑:程序博客网 时间:2024/05/16 14:41
阅读本文前,我们假设您已经:
      1,知道如何创建一个单文档的App Wizard
      2,知道C++ 类、函数重载等简单知识
      3,知道如何给View类或者Doc文档添加成员变量
      4,会用MFC的IDE调试工具最好,那么本文的程序您可以copy去调试
      5,知道如何为某个框架类添加虚函数或消息处理函数

 

1,动态创建按钮

 1)增加全局变量 CButton m_btn;

 2)在需要创建的地方

//ID123可以随意改变

 if(!m_btn.m_hWnd)

        m_btn.Create("维新",BS_DEFPUSHBUTTON | WS_VISIBLE | WS_CHILD,CRect(0,0,100,100),this,123);

else

        m_btn.DestroyWindow();

2,复制控件

dlg上添加控件时,按住ctrl键,拖动就可以复制一模一样的控件

3,控件对齐

在对话框上多个控件对齐,可以用layout菜单或者左下角toolbar

4,动态编辑static静态文本框

 CString str;

 if(GetDlgItem(IDC_NUMBER1)->GetWindowText(str),str=="Number1:")

GetDlgItem(IDC_NUMBER1)->SetWindowText("数值1:");

else

GetDlgItem(IDC_NUMBER1)->SetWindowText("Number1:");

要让static静态文本框响应消息,需要复选上notify选项

5,Edit文本框

 获取/设置文本内容

 1)方法1

        char ch[10];

        GetDlgItem(IDC_EDIT1)->GetWindowText(ch1,10);

        GetDlgItem(IDC_EDIT3)->SetWindowText(itoa(atoi(ch1),ch1,10));

 2)方法2

        GetDlgItemText(IDC_EDIT1,ch1,10);

        SetDlgItemText(IDC_EDIT3,itoa(atoi(ch1),ch1,10));

 3)方法3

        SetDlgItemInt(IDC_EDIT3,GetDlgItemInt(IDC_EDIT1));//对整型数字的字符串有用

 4)关联变量法

        对每个Edit控件关联一个变量,设置后记得用UpdateData()

        对于显示数字类的文本框,可以定义valuecontrol两种类型变量

 

DoDataExchange() called by the framework to exchange and validate dialog data

The framework automatically calls UpdateData with bSaveAndValidate set to FALSE when a modal dialog box is created in the default implementation of CDialog::OnInitDialog.

 5)利用WM_GETTEXT消息处理获取文本

 char ch1[10];

        可以用以下四种方法(m_edit1为关联的控制型变量)

        ::SendMessage(GetDlgItem(IDC_EDIT1)->m_hWnd,WM_GETTEXT,10,(LPARAM)ch1);

        ::SendMessage(m_edit1.m_hWnd,WM_GETTEXT,10,(LPARAM)ch1);

        GetDlgItem(IDC_EDIT1)->SendMessage(WM_GETTEXT,10,(LPARAM)ch1);

        m_edit1.SendMessage(WM_GETTEXT,10,(LPARAM)ch1);

 

        利用WM_SETTEXT消息处理设置文本

        m_edit3.SendMessage(WM_SETTEXT,0,(LPARAM)ch3);

 6)直接对对话框控件进行消息发送

        SendDlgItemMessage(IDC_EDIT1,WM_GETTEXT,10,(LPARAM)ch1);//获取文本

        SendDlgItemMessage(IDC_EDIT3,WM_SETTEXT,0,(LPARAM)ch3);//设置文本

        SendDlgItemMessage(IDC_EDIT3,EM_SETSEL,0,-1);

 7)利用EM_GETSEL,EM_SETSEL的消息处理

6,对话框收缩

        点击"收缩<<"对话框收缩,点击"扩展>>"则扩展, 请看例子代码

7,多个edit框用Enter键切换的方法,三种方法

 1)捕获键盘消息,在消息函数中处理(未提供)

 2)修改Edit的窗口过程:自己写窗口过程替代原来的窗口过程(比较麻烦的方法)

  (1)定义窗口过程类型变量

   WNDPROC prevProc;

  (2)定义窗口过程函数

  LRESULT CALLBACK WinSunProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam )

  {

   if(uMsg==WM_CHAR && wParam==0x0d)//如果是回车

   {

    //::SetFocus(::GetNextWindow(hwnd,GW_HWNDNEXT));//获取下一窗口句柄方法一

    //SetFocus(::GetWindow(hwnd,GW_HWNDNEXT));//方法二

    SetFocus(::GetNextDlgTabItem(::GetParent(hwnd),hwnd,FALSE));//方法三

    return 1;

   }

   else

       return prevProc(hwnd,uMsg,wParam,lParam);

  }

  (3)添加WM_INITDIALOG对应的函数

  (4)OnInitDialog中添加

   prevProc=(WNDPROC)SetWindowLong(GetDlgItem(IDC_EDIT1)->m_hWnd,GWL_WNDPROC,(LONG)WinSunProc);

  (5)注意 edit控件 MultiLine复选属性选/不选的不同

 SetWindowLong changes an attribute of the specified window.

 

  3)OnOK(default button对应的函数)

  GetFocus()->GetNextWindow()->SetFocus();//注意最后一个窗口时要判断,不然获取出错

  GetFocus()->GetWindow(GW_HWNDNEXT)->SetFocus();//注意同上

  GetNextDlgTabItem(GetFocus())->SetFocus();

  注意: 对话框初始的OKID号为IDOK,即使删除按钮(OnOk函数存在),依然会响应OnOk函数

    欢迎以任何形式转载本文,只要对您有用
    欢迎给我来信 webbery (at) sohu (dot) com (分别用@,.替换at,dot)

    韦伯主页: http://mail.ustc.edu.cn/~bywang(提供此笔记系列相关源程序下载)
    韦伯Blog: http://webbery.tianyablog.com参考书目和网站:     (1)孙鑫VC++视频    (2)1-6章主要参考: hbyufan的BLog    (3)11-20章主要参考: songpeng的Blog

 

原创粉丝点击