MFC学习笔记(5)

来源:互联网 发布:杭州全速网络 编辑:程序博客网 时间:2024/04/30 00:27

模态对话框
非模态对话框

解决局部变量生命周期问题 其一是改成类的成员变量
其二是定义指针 在堆中分配内存 与程序的生命周期一致
还有就是静态变量

非模态对画框需要考虑 窗口销毁问题 和堆内存释放问题 

对静态文本框添加事件响应  需要把不同的文本框ID改成不同
然后把Notify选上

GetDlgItem(IDC_EDIT1)->GetWindowTextW(wch1,10)

=GetDlgItemText(IDC_EDIT1,wch1,10);

通过加法7种方式来学习控件访问方式
(1)
 int num1,num2,num3;
 WCHAR wch1[10],wch2[10],wch3[10];
 char ch3[10];
 GetDlgItem(IDC_EDIT1)->GetWindowTextW(wch1,10);
 GetDlgItem(IDC_EDIT2)->GetWindowTextW(wch2,10);
 
 num1=_wtoi(wch1);       //注意_wtoi
 num2=_wtoi(wch2);
 num3=num1+num2;
 WideCharToMultiByte(CP_ACP,0,wch3,-

1,ch3,10,NULL,NULL);//宽字符转ASCII
 itoa(num3,ch3,10);
 MultiByteToWideChar(CP_ACP,0,ch3,-1,wch3,10);  //ASCII转宽字符
 GetDlgItem(IDC_EDIT3)->SetWindowTextW(wch3);
(2)
 int num1,num2,num3;
 TCHAR wch1[10],wch2[10],wch3[10];
 GetDlgItemTextW(IDC_EDIT1,wch1,10);
 GetDlgItemTextW(IDC_EDIT2,wch2,10);
 num1=_wtoi(wch1);
 num2=_wtoi(wch2);
 num3=num1+num2;
 _itow(num3,wch3,10);
 SetDlgItemText(IDC_EDIT3,wch3);
这里要特别注意 _wtoi和_itow  这是用宽字符形式编程
(3)
 int num1,num2,num3;
 num1=GetDlgItemInt(IDC_EDIT1);
 num2=GetDlgItemInt(IDC_EDIT2);
 num3=num1+num2;
 SetDlgItemInt(IDC_EDIT3,num3);
(4)创建控件成员值变量
先给控件分别添加成员变量关联起来
可以在这个过程中设置变量取值范围
UpdateData用来调用DoDataExchange来进行控件与数据关联
 UpdateData();       //用来获取值
 m_num3=m_num1+m_num2;
 UpdateData(FALSE);      //用来显示值    
(5)创建控件成员控件变量
 int num1,num2,num3;
 TCHAR wch1[10],wch2[10],wch3[10];
 m_edit1.GetWindowTextW(wch1,10);
 m_edit2.GetWindowTextW(wch2,10);

 num1=_wtoi(wch1);
 num2=_wtoi(wch2);
 num3=num1+num2;
 _itow(num3,wch3,10);

 m_edit3.SetWindowTextW(wch3);
(6)发送消息
 int num1,num2,num3;
 TCHAR wch1[10],wch2[10],wch3[10];
 //::SendMessage(GetDlgItem(IDC_EDIT1)->m_hWnd,WM_GETTEXT,10,(LPARAM)wch1);
 //::SendMessage(m_edit1.m_hWnd,WM_GETTEXT,10,

(LPARAM)wch1);
 //GetDlgItem(IDC_EDIT1)->SendMessage

(WM_EDIT1,10,(LPARAM)wch1);
 m_edit1.SendMessage(WM_GETTEXT,10,(LPARAM)wch1);
 m_edit2.SendMessage(WM_GETTEXT,10,(LPARAM)wch2);
 
 num1=_wtoi(wch1);
 num2=_wtoi(wch2);
 num3=num1+num2;
 _itow(num3,wch3,10);
 
 m_edit3.SendMessage(WM_SETTEXT,10,(LPARAM)wch3);
(7)直接给控件发送消息
 int num1,num2,num3;
 TCHAR wch1[10],wch2[10],wch3[10];
 SendDlgItemMessage(IDC_EDIT1,WM_GETTEXT,10,

(LPARAM)wch1);
 SendDlgItemMessage(IDC_EDIT2,WM_GETTEXT,10,

(LPARAM)wch2);
 
 num1=_wtoi(wch1);
 num2=_wtoi(wch2);
 num3=num1+num2;
 _itow(num3,wch3,10);

 SendDlgItemMessage(IDC_EDIT3,WM_SETTEXT,10,(LPARAM)wch3);
 SendDlgItemMessage(IDC_EDIT3,EM_SETSEL,0,-1); //复选
 m_edit3.SetFocus();              //设置焦点

*注意EM_SETSEL消息 和SetFocus
总结上述7种
(1)GetDlgItem()->Get(Set)WindowText()
(2)GetDlgItemText()/SetDlgItemText()
(3)GetDlgItemInt()/SetDlgItemInt()
(4)将控件和整型变量相关联 
(5)将控件和控件变量相关联
(6)SendMessage()
(7)SendDlgItemMessage()

对话框的收缩与扩展
用图形控件拉成直线当作分隔符 将其ID号改了 然后Sunken属

性勾选上 之后就是考虑如何切除分隔符之外的部分 和如何还

原整个对话框

了解Z-order

 CString str;
 if(GetDlgItemText(IDC_BUTTON1,str),str==L"收缩<<")
 {
  SetDlgItemText(IDC_BUTTON1,L"扩展>>");
 }
 else
 {
  SetDlgItemText(IDC_BUTTON1,L"收缩<<");
 }
 static CRect rectLarge;
 static CRect rectSmall;

 if(rectLarge.IsRectNull())  //如果该矩形区域为空
 {
  CRect rectSeparator;
  GetWindowRect(&rectLarge);
  GetDlgItem(IDC_SEPARATOR)->GetWindowRect(&rectSeparator);
  rectSmall.left=rectLarge.left;
  rectSmall.top=rectLarge.top;
  rectSmall.right=rectLarge.right;
  rectSmall.bottom=rectSeparator.bottom;
 }
 if(str==L"收缩<<")
 {
  SetWindowPos(NULL,0,0,rectSmall.Width(),rectSmall.Height(),SWP_NOMOVE|SWP_NOZORDER);
 }
 else
 {
  SetWindowPos(NULL,0,0,rectLarge.Width

(),rectLarge.Height(),SWP_NOMOVE|SWP_NOZORDER);
 }

*缺省函数响应回车键


在VC++6中添加WM_INITDIADLG消息 在VS2008中改为在重写里

添加OnInitDialog
更改控件窗口过程 要在OnInitDialog中改 而不应该在

OnCreate中改
用SetWindowLong来改窗口过程

实现摁回车使控件焦点的简单方法是
在缺省控件的事件响应函数里添加
GetNextDlgTabItem(GetFocus())->SetFocus();
其控件顺序可以在格式选项中tab顺序中修改
可以把缺省控件在界面上删掉

*要获取一个控件的句柄可以GetDlgItem(IDC_EDIT1)->m_hWnd
*在全局函数里只能用API函数 无法用类成员函数
*控件要选择Multiline属性才能接收回车消息