// 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
} */
MyMFC(7-9)对话框 CTestDlg
最新推荐文章于 2023-01-16 22:51:22 发布
