孙鑫VC++视频学习笔记之6: 对话框编程(1)

转自:http://webbery.tianyablog.com

   阅读本文前,我们假设您已经:
   1,知道如何创建一个单文档的App Wizard
   2,知道C++ 类、函数重载等简单知识
   3,知道如何给View类或者Doc文档添加成员变量
   4,会用MFC的IDE调试工具最好,那么本文的程序您可以copy去调试
   5,知道如何为某个框架类添加虚函数或消息处理函数
  
  
  
  1,动态创建按钮
  
   1)增加全局变量 CButton m_btn;
  
   2)在需要创建的地方
  
  //ID号123可以随意改变
  
   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()
  
   对于显示数字类的文本框,可以定义value和control两种类型变量
  
  
  
  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();
  
   注意: 对话框初始的OK的ID号为IDOK,即使删除按钮(OnOk函数存在),依然会响应OnOk函数

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章