MyMFC(7-9)对话框 CTestDlg

本文介绍MFC对话框中控件的数据交互方法,包括数值相加、控件文本切换及对话框伸缩功能实现。并通过具体示例展示了如何使用MFC库中的函数和成员变量来完成这些操作。
// TestDlg.cpp : 实现文件
//

#include "stdafx.h"
#include "MyMFC2-Dialog.h"
#include "TestDlg.h"
#include "afxdialogex.h"
#include <tchar.h>


// CTestDlg 对话框

IMPLEMENT_DYNAMIC(CTestDlg, CDialog)

CTestDlg::CTestDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CTestDlg::IDD, pParent)  //IDD就是所创建对话框资源的ID,pParent是父窗口的指针
	, m_bIsCreated(FALSE)
	, m_num1(0)
	, m_num2(0)
	, m_num3(0)
{

}

CTestDlg::~CTestDlg()
{
}

void CTestDlg::DoDataExchange(CDataExchange* pDX)  //该函数用来完成对话框数据的交换和校验
{
	CDialog::DoDataExchange(pDX);  //MFC中提供了多种以DDX_为前缀的函数,这些函数分别用于不同控件的数据交换
	DDX_Text(pDX, IDC_EDIT1, m_num1);  //将编辑框与所定义的成员变量关联起来
	DDX_Text(pDX, IDC_EDIT2, m_num2);
	DDX_Text(pDX, IDC_EDIT3, m_num3);
	DDX_Control(pDX, IDC_EDIT1, m_edit1);
	DDX_Control(pDX, IDC_EDIT2, m_edit2);
	DDX_Control(pDX, IDC_EDIT3, m_edit3);
}


BEGIN_MESSAGE_MAP(CTestDlg, CDialog)	
	ON_BN_CLICKED(IDC_BTN_ADD, &CTestDlg::OnBtnAdd)
	ON_STN_CLICKED(IDC_NUMBER1, &CTestDlg::OnClickedNumber1)
	ON_STN_CLICKED(IDC_NUMBER2, &CTestDlg::OnClickedNumber2)
	ON_STN_CLICKED(IDC_NUMBER3, &CTestDlg::OnClickedNumber3)	
	ON_BN_CLICKED(IDC_BUTTON1, &CTestDlg::OnClickedButton1)
	ON_BN_CLICKED(IDOK, &CTestDlg::OnOk)
END_MESSAGE_MAP()


// CTestDlg 消息处理程序




void CTestDlg::OnBtnAdd()
{
	// TODO:  在此添加控件通知处理程序代码

/********************************************************************************************************************/
	//通过Add按钮,来添加一个新的按钮,再单击则销毁,再单击则新建
//方法一:
	//通过对成员变量m_bIsCreated的判断,可以实现一个按钮的创建,再一次创建则是销毁按钮。
	//也可以通过定义静态的局部变量m_bIsCreated来实现。如:static BOOL m_bIsCreated=FALSE;
/*	if (m_bIsCreated == FALSE)
	{
		m_btn.Create(CString("New"), BS_DEFPUSHBUTTON | WS_VISIBLE | WS_CHILD, CRect(0, 0, 100, 100), this, 123);
		m_bIsCreated = TRUE;
	}
	else
	{
		m_btn.DestroyWindow();
		m_bIsCreated = FALSE;
	}
	*/

//方法二:
	//###因为每一个CWnd对象都有一个成员变量:m_hWnd,用来保存于窗口对象相关联的窗口句柄,m_hWnd的用处很大。####
/*	//本例定义的成员变量m_btn,是CButton类,也就是CWnd类。所以当创建了按钮后,m_btn.m_hWnd就会保存该按钮的句柄
	if (!m_btn.m_hWnd)
	{
		m_btn.Create(CString("New"), BS_DEFPUSHBUTTON | WS_VISIBLE | WS_CHILD, CRect(0, 0, 100, 100), this, 123);
	}
	else
		m_btn.DestroyWindow();  */



/*******************************************************************************************************************/
	//在编辑框控件中,实现两个数值相加求和,通过Add键来实现
//方法一
/*	int num1, num2, num3;
	TCHAR ch1[10], ch2[10];
	char ch3[10];
	GetDlgItem(IDC_EDIT1)->GetWindowText(ch1, 10);
	GetDlgItem(IDC_EDIT2)->GetWindowText(ch2, 10);
	num1 = atoi((char*)ch1);  //atoi将有数字组成的字符串转换为数值
	num2 = atoi((char*)ch2);
	num3 = num1 + num2;
	_itoa_s(num3, ch3, 10);  //中的10,表示按十进制转换
	GetDlgItem(IDC_EDIT3)->SetWindowText(CString(ch3));
	*/


//方法二
	//将GetDlgItem(IDC_EDIT1)函数和GetWindowText函数合并为一个函数GetDlgItemText;和对应的SetDlgItemText函数
/*	int num1, num2, num3;
	char ch1[10], ch2[10], ch3[10];
	GetDlgItemText(IDC_EDIT1, ch1, 10);
	GetDlgItemText(IDC_EDIT2, ch2, 10);
	num1 = atoi(ch1);
	num2 = atoi(ch2);
	num3 = num1 + num2;
	_itoa_s(num3, ch3, 10);
	SetDlgItemText(IDC_EDIT3, ch3);
	*/

//方法三(针对于将文本转化为整型数值),用于计算器,很好
	//GetDlgItemInt函数返回指定控件的文本,并将其转换为一个整型数值
/*	int num1, num2, num3;
	num1 = GetDlgItemInt(IDC_EDIT1);
	num2 = GetDlgItemInt(IDC_EDIT2);
	num3 = num2 + num1;
	SetDlgItemInt(IDC_EDIT3, num3);
	*/


//方法四 ###最重要、最简单的方法。输入非整型数据后,会提出警告。并且在添加成员变量的过程中可以设定数值的范围
	//将编辑框分别于三个成员变量相关联
	//首先要完成控件与成员变量关联起来。注意:一般在添加变量时的变量类别默认为Control,这里要设置为Value
	//调用UpdateData函数来从对话框获取数据,参数默认为TRUE,表示函数正在获取对话框的数据。当为FALSE时,表示在函数正在初始化对话框的控件
	UpdateData(); //从控件上获取数据
	m_num3 = m_num1 + m_num2;
	UpdateData(FALSE);  //为控件设置值
	


//方法五
/*	//方法四中所添加成员变量的类别是Value。这回我们添加Control类别,把编辑框与一个控件变量相关联。这时的成员变量代表控件本身
	int num1, num2, num3;
	char ch1[10], ch2[10], ch3[10];
	m_edit1.GetWindowTextLengthW(ch1, 10);
	m_edit2.GetWindowTextLengthW(ch2, 10);
	num1 = atoi(ch1);
	num2 = atoi(ch2);
	num3 = num1 + num2;
	_itoa_s(num3, ch3, 10);
	m_edit3.SetWindowTextW(ch3);
	*/


	
}

/*********************************************************************************************************************************/
    //为静态文件控件添加消息相应,单击它时由Number1和数值1相互变换
    //因为所有的静态文件控件的ID号都是相同的,所以必须先要改变所要添加静态控件的ID号
void CTestDlg::OnClickedNumber1()
{
	// TODO:  在此添加控件通知处理程序代码
	CString str;
	//GetWindowText(str)函数可以获得静态文本控件上显示的文本,保存到str中;SetWindowTest函数,设置控件上面的文本
	//GetDlgItem可以获得静态文本的控件对象,参数为相应控件的ID号
	if (GetDlgItem(IDC_NUMBER1)->GetWindowText(str), str == "Number1")
	{
		GetDlgItem(IDC_NUMBER1)->SetWindowText(CString("数值1"));
	}
	else
	{
		GetDlgItem(IDC_NUMBER1)->SetWindowText(CString("Number1"));
	}
	//由于静态文本控件在默认状态下是不发送通告信息的。必须要把相应控件属性中的Notify设置为TRUE,这样静态文本控件才能向其父窗口发送消息响应
	//综上所述:为了使一个静态文本控件能够响应鼠标单击消息,那么需要进行两个特殊的步骤:第一步,改变它的ID,第二步,在它的属性对话框中把Notify设为TRUE

}
//将GetDlgItem(IDC_EDIT1)函数和GetWindowText函数合并为一个函数GetDlgItemText;和对应的SetDlgItemText函数(见上面创建计算器的方法二中)

void CTestDlg::OnClickedNumber2()
{
	// TODO:  在此添加控件通知处理程序代码
	CString str;
	if (GetDlgItem(IDC_NUMBER2)->GetWindowText(str), str == "Number2")
	{
		GetDlgItem(IDC_NUMBER2)->SetWindowText(CString("数值2"));
	}
	else
	{
		GetDlgItem(IDC_NUMBER2)->SetWindowText(CString("Number2"));
	}

}


void CTestDlg::OnClickedNumber3()
{
	// TODO:  在此添加控件通知处理程序代码
	CString str;
	if (GetDlgItem(IDC_NUMBER3)->GetWindowText(str), str == "Number3")
	{
		GetDlgItem(IDC_NUMBER3)->SetWindowText(CString("数值3"));
	}
	else
	{
		GetDlgItem(IDC_NUMBER3)->SetWindowText(CString("Number3"));
	}
}




void CTestDlg::OnClickedButton1()
{
	// TODO:  在此添加控件通知处理程序代码
/**************************************************************************************************************************/
	//对话框伸缩功能的实现
	 CString str;
	if (GetDlgItem(IDC_BUTTON1)->GetWindowText(str), str == "收缩")
	{
		GetDlgItem(IDC_BUTTON1)->SetWindowText(CString("扩展"));
	}
	else
	{
		GetDlgItem(IDC_BUTTON1)->SetWindowText(CString("收缩"));
	}	
	
	static CRect rectLarge;  //定义静态局部变量,保存对话框原始尺寸和切除之后尺寸
	static CRect rectSmall;
	if (rectLarge.IsRectNull())  //IsRectNull当矩形的四个坐标值都是0,则返回一个非零值;否则,返回0.
	{
		CRect rectSeparator;
		GetWindowRect(&rectLarge); //GetWindowRect获取对话框的原始尺寸,即左上点和右下点的坐标
		GetDlgItem(IDC_SEP)->GetWindowRect(&rectSeparator);  //获取分隔符的尺寸
	
		rectSmall.left = rectLarge.left;   //下面是设置切除之后对话框的尺寸
		rectSmall.top = rectLarge.top;
		rectSmall.right = rectLarge.right;
		rectSmall.bottom = rectSeparator.bottom;
	}
	if (str == "收缩")
	{
		SetWindowPos(NULL, 0, 0, rectSmall.Width(), rectSmall.Height(), SWP_NOMOVE | SWP_NOZORDER); //设置窗口的位置和大小
		//参数:
		//1.是一个CWnd对象,该对象是在以Z次序排序的窗口中位于当前窗口前面的那个窗口对象
		//2,3.窗口左上角的x,y坐标
		//4,5.窗口的宽度和高度
		//6.设定窗口的尺寸和定位,SWP_NOMOVE将忽略2,3参数;SWP_NOZORDER将忽略1参数
	}
	else
	{
		SetWindowPos(NULL, 0, 0, rectLarge.Width(), rectLarge.Height(), SWP_NOMOVE | SWP_NOZORDER);
	}
}

/******************************************************************************************************************/
//这种方法实现光标有回车键传递是基于:在MFC中,默认情况下,当在对话框中按下回车键时,会调用对话框的默认按钮的响应函数,这里为OnOK函数
    //创建的对话框中的OK键的属性中Default button默认为TRUE。意味着按回车键就等同于OK键,自动调用基类中的OnOK,实现关闭对话框的功能
    //为了实现按回车后,光标实现传递的功能。所以要蒙蔽掉默认回车键关闭对话框这一功能,应该在对话框类中重写OK按钮的消息响应函数
void CTestDlg::OnOk()
{
	// TODO:  在此添加控件通知处理程序代码

	//在此之前要先把编辑框1属性中的Multiline设为FALSE
	GetNextDlgTabItem(GetFocus())->SetFocus();  //这里的GetNextDlgGroupItem函数只有两个参数,第一个参数指定用来作为搜索开始点的控件,
	//第二个参数指定搜索的方向,TURE,则寻找对话框中上一个控件;FALSE则相反,默认为FALSE。
	//SetFocus函数可以实现焦点的设置

	//CDialog::OnOK();  //蒙蔽这一语句,实现:按回车键,窗口不会消失
}
//该功能用Tab键,完全可以自动的实现。
//通过在对话框的编辑界面在格式-Tab键顺序,可以调整顺序或者按ctrl+D
//把某个按钮属性中的Default button设为TRUE,则为回车的默认键









/*****************************************************************************************************************/
//下面有NewEditProc过程函数和BOOL CTestDlg::OnInitDialog()函数共同来实现:当光标在第一个编辑框中,按下回车后调到第二个编辑框中,
//但是不能从第二个跳到第三个,因为这只是修改了第一个编辑的窗口过程,要再修改第二个编辑框的窗口过程函数,才能够实现
//###这种方法太麻烦了,就不再用了。而是用上面提到的OnOK函数来实现
/*
//实现所需功能自定义的编辑框窗口过程函数
WNDPROC	prevProc;
LRESULT CALLBACK NewEditProc(   //窗口过程函数,截获WM_CHAR消息并作出相应的判断和处理。该函数名可以自己定义
	HWND hwnd,      // handle to window
	UINT uMsg,      // message identifier
	WPARAM wParam,  // first message parameter //保存ASCII码
	LPARAM lParam   // second message parameter
	)
{
	if (uMsg == WM_CHAR && wParam == 0x0d)
		//在此之前要先把编辑框1属性中的Multiline设为TRUE,要它可以就收回车的消息

	{	//因为NewEditProc这个窗口过程是全局函数,所以不能调用CWnd类的成员函数,只能使用相应的SDK函数。SDK函数提供了
		//SetFocus函数可以实现焦点的设置,它的参数为输入焦点的窗口句柄
		//用GetNextWindow函数可以获得对话框中某个控件的下一个控件的句柄
		//编辑框也是一个窗口,它的父窗口为对话框
		//方法一
		//::SetFocus(::GetNextWindow(hwnd,GW_HWNDNEXT)); //GetNextWindow第一个参数是指定当前窗口句柄;第二个参数是查找方向,GW_HWNDNEXT是查找给定窗口的下一个窗口,GW_HWNDPREV返回给定窗口的上一个窗口的句柄
		//方法二 用GetWindow获得窗口句柄
		//SetFocus(::GetWindow(hwnd, GW_HWNDNEXT));
		//方法三 用GetNextDlgTabItem获得窗口句柄
		SetFocus(::GetNextDlgGroupItem(::GetParent(hwnd), hwnd, FALSE)); //GetNextDlgGroupItem第一个参数指定将被搜索的对话框,第二个参数指定用来作为搜索开始点的控件,
		//第三个参数指定搜索的方向,TURE,则寻找对话框中上一个控件;FALSE则相反。
		return 1;
	}
	else
	{
		return prevProc(hwnd, uMsg, wParam, lParam);
	}
}
//当对话框及其上的子控件创建完成,将要显示之前会发送一个WM_INITDIALOG消息,对应的响应函数为OnInitDialog,它是一个虚函数,所以可以在该类中添加此虚函数
BOOL CTestDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// TODO:  在此添加额外的初始化

	prevProc = (WNDPROC)SetWindowLong(GetDlgItem(IDC_EDIT1)->m_hWnd, GWL_WNDPROC, (LONG)NewEditProc);
	return TRUE;  // return TRUE unless you set the focus to a control
	// 异常:  OCX 属性页应返回 FALSE
}  */

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值