模态对话框
非模态对话框
解决局部变量生命周期问题 其一是改成类的成员变量
其二是定义指针 在堆中分配内存 与程序的生命周期一致
还有就是静态变量
非模态对画框需要考虑 窗口销毁问题 和堆内存释放问题
对静态文本框添加事件响应 需要把不同的文本框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属性才能接收回车消息