一、模态与非模态对话框
模态对话框的创立:
创建对话框资源,生成与资源相关的对话框类。
首先,view.cpp中添加对话框头文件#include "CtestDlg.h"
1. 假设CTestDlg是一个对话框类,则
CTestDlg dlg;
dlg.domodal();//创建模态对话框
模态对话框执行到domodal()时会暂停执行,直到关闭销毁,因此无需定义为全局变量或者成员函数
2.创建非模态对话框,注意定义为view类的成员变量,否则对应菜单的函数相应完自动释放该局部变量的对话框对象:
CDialog::Create()函数 |
CTestDlg* pdlg = new CTestDlg();
pdlg->Create(IDD_DIALOG1, this);
pdlg->ShowWindow(SW_SHOW);
点击对话框的OK按钮此时并没有销毁,而是使得对话框不可见。因此,必须重新定义成员函数OnOK()
或者定义局部静态bool变量判断是否创建了CButton控件;
或者不用bool变量判断,使用CButton的窗口子变量m_Wnd是否为NULL作为创建按钮的判断。
if
(!btn.m_hWnd)
{
btn.Create(TEXT(
"weixin"
), BS_PUSHBUTTON|WS_VISIBLE|WS_CHILD, CRect(0, 0, 100, 50),
this
, 123);
}
else
btn.DestroyWindow()
二、静态文本(static edit )框和文本编辑框(edit)操作
静态文本框控件的ID默认情况下是一样的,因为只是作为标记无需修改,但是可以修改。如何读取文本框的字符串呢?GetWindowText(),但是首先要获取当前控件的指针,用GetDlgItem(ID);
若要静态文本框相应事件函数,首先改变ID,再复选上Notify选项,才能正确相应。
字符串与CString之间的关系,在UNICODE下,一般是16位的字符串定义,即WCHAR,TCHAR此时是一样的16位字符串,能够从LPTSTR直接转换成TCHAR和WCHAR字符串。
TCHAR的定义:
LPTSTR的定义:
|
|
int
num1, num2, num3;
TCHAR ch1[10], ch2[10], ch3[10];
GetDlgItem(IDC_EDIT1)->GetWindowText(ch1, 10);//
GetDlgItemText(IDC_EDIT1, ch1, 10);
GetDlgItem(IDC_EDIT2)->GetWindowText(ch2, 10);
GetDlgItem(IDC_EDIT3)->GetWindowText(ch3, 10);
num1 = _wtoi(ch1);
num2 = _wtoi(ch2);
num3 = num2 + num1;
_itow_s(num3, ch3, 10);
GetDlgItem(IDC_EDIT3)->SetWindowText(ch3);//SetDlgItemText(IDC_EDIT3, ch3);
或者通过
CWnd::GetDlgItemText直接获取控件的字符串,也有一个对应的设置对话框控件文本的函数SetDlgItemText
2.直接用函数
CWindow::GetDlgItemInt()获取文本编辑框内的字符串表示的整型数值,但是对于浮点型数值,仍需要字符串到数值的转化。
相应的设置文本编辑框的整型数值为
CWindow::SetDlgItemInt()。
3.增加相应的成员变量关联编辑框(edit)。
UpdateData(
TRUE
);//设置对话框获取数据有效
m_num3 = m_num1 + m_num2;
//三个与编辑框关联的整型变量
UpdateData(
FALSE
);//编辑对话框重新初始化
4.增加成员变量CEdit来完成。
m_edit1、
m_edit2、
m_edit3来关联三个编辑框控件。
int
num1, num2, num3;
TCHAR ch1[10], ch2[10], ch3[10];
m_edit1.GetWindowText(ch1, 10);
m_edit2.GetWindowText(ch2, 10);
num1 = _wtoi(ch1);
num2 = _wtoi(ch2);
num3 = num2 + num1;
_itow_s(num3, ch3, 10);
m_edit3.SetWindowText(ch3);
5.通过消息传递来实现。
int
num1, num2, num3;
TCHAR ch1[10], ch2[10], ch3[10];
::SendMessage(GetDlgItem(IDC_EDIT1)->m_hWnd, WM_GETTEXT, 10, (LPARAM)ch1);
::SendMessage(GetDlgItem(IDC_EDIT2)->m_hWnd, WM_GETTEXT, 10, (LPARAM)ch2);
num1 = _wtoi(ch1);
num2 = _wtoi(ch2);
num3 = num2 + num1;
_itow_s(num3, ch3, 10);
::SendMessage(GetDlgItem(IDC_EDIT3)->m_hWnd, WM_SETTEXT, 0, (LPARAM)ch3);
发送消息的其他形式:
1.关联控件
m_edit1.SendMessage(WM_GETTEXT, 10, (LPARAM)ch1);
m_edit2.SendMessage(WM_GETTEXT, 10, (LPARAM)ch2);
m_edit3.SendMessage(WM_SETTEXT, 10, (LPARAM)ch3);
2、
::SendMessage(m_edit1->m_hWnd, WM_GETTEXT, 10, (LPARAM)ch1);
6.通过sendDlgItemMessage()直接给对话框的子控件发送消息。
int
num1, num2, num3;
TCHAR ch1[10], ch2[10], ch3[10];
SendDlgItemMessage(IDC_EDIT1, WM_GETTEXT, 10, (LPARAM)ch1);
SendDlgItemMessage(IDC_EDIT2, WM_GETTEXT, 10, (LPARAM)ch2);
num1 = _wtoi(ch1);
num2 = _wtoi(ch2);
num3 = num2 + num1;
_itow_s(num3, ch3, 10);
SendDlgItemMessage(IDC_EDIT3, WM_SETTEXT, 0, (LPARAM)ch3);
注:如何获取文本复选内容的消息。
SendDlgItemMessage(IDC_EDIT3, EM_SETSEL, 1, 3);、、设置复选位置,为1到3,不包括1
m_edit3.SetFocus();//设置焦点为当前编辑框控件
三、CRect是否为空,区别isRectNull()和
CRect::IsRectEmpty
前者是CRect的四个分量top,left,right,bottom都为0。后者是当宽度和高度为0或者小于0时。
四、获取控件矩形区域大小:
GetDlgItem(IDC_SEPRATE)->GetWindowRect(&rectseperator);
五、对话框扩展与收缩
void
CTestDlg::OnBnClickedButton2()
{
// TODO: Add your control notification handler code here
CString str;
if
(GetDlgItemText(IDC_BUTTON2, str), str == _T(
"收缩<<"
))
{
SetDlgItemText(IDC_BUTTON2, _T(
"扩展"
));
}
else
SetDlgItemText(IDC_BUTTON2, _T(
"收缩<<"
));
static
CRect rectlarge;
static
CRect rectsmall;
if
(rectlarge.IsRectEmpty())
{
//对?话框原-始?矩?形?大小?
GetWindowRect(&rectlarge);
CRect rectseperator;
GetDlgItem(IDC_SEPRATE)->GetWindowRect(&rectseperator);
rectsmall = rectlarge;
rectsmall.bottom -= rectseperator.bottom;
}
if
(str == _T(
"收缩<<"
))
{
SetWindowPos(NULL, 0, 0, rectsmall.Width(), rectsmall.Height(), SWP_NOMOVE|SWP_NOZORDER);//设置窗口的位置,Z次序。
SWP_NOMOVE保存当前位置,忽略了x和
//y。
SWP_NOZORDER保存z次序
}
else
{
SetWindowPos(NULL, 0, 0, rectlarge.Width(), rectlarge.Height(), SWP_NOMOVE|SWP_NOZORDER);
}
}
六、完成在EDIT控件中按下回车键将焦点转移到下一个EDIT,需要修改窗口过程
1.使用窗口过程来实现,将窗口过程改写在初始化对话框操作中
OnInitDialog()
LRESULT CALLBACK wndsunProc(HWND hwnd, UINT uMsg, WPARAM wParam,LPARAM lParam)
{
if
(uMsg == WM_CHAR &&wParam == 0x0d)
{
::SetFocus(::GetNextWindow(hwnd, GW_HWNDNEXT));
return
1;
}
else
{
return
preProc(hwnd, uMsg, wParam, lParam);
}
}
BOOL
CTestDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// TODO: Add extra initialization here
preProc = (WNDPROC)SetWindowLong(GetDlgItem(IDC_EDIT1)->m_hWnd, GWL_WNDPROC, (
LONG
)wndsunProc);
return
TRUE
;
// return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
2.通过缺省按钮的相应函数,按下回车键由OnOK()来相应,获取下一个窗口:
GetNextDlgTabItem
CWnd* GetNextDlgTabItem(
CWnd* pWndCtl, //要搜索的当前窗体
BOOL bPrevious = FALSE //为FALSE则搜索后一个,为TRUE则搜索前一个控件
)
GetNextDlgTabItem(GetFocus())->SetFocus();
GetFocus()返回当前焦点的对话框控件句柄,
GetNextDlgTabItem返回控件,
SetFocus()设置焦点。