MyMFC(7-9)对话框 CTestDlg

来源:互联网 发布:美工kpi绩效考核表 编辑:程序博客网 时间:2024/06/10 23:05
// 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);}elsem_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设为FALSEGetNextDlgTabItem(GetFocus())->SetFocus();  //这里的GetNextDlgGroupItem函数只有两个参数,第一个参数指定用来作为搜索开始点的控件,//第二个参数指定搜索的方向,TURE,则寻找对话框中上一个控件;FALSE则相反,默认为FALSE。//SetFocus函数可以实现焦点的设置//CDialog::OnOK();  //蒙蔽这一语句,实现:按回车键,窗口不会消失}//该功能用Tab键,完全可以自动的实现。//通过在对话框的编辑界面在格式-Tab键顺序,可以调整顺序或者按ctrl+D//把某个按钮属性中的Default button设为TRUE,则为回车的默认键/*****************************************************************************************************************///下面有NewEditProc过程函数和BOOL CTestDlg::OnInitDialog()函数共同来实现:当光标在第一个编辑框中,按下回车后调到第二个编辑框中,//但是不能从第二个跳到第三个,因为这只是修改了第一个编辑的窗口过程,要再修改第二个编辑框的窗口过程函数,才能够实现//###这种方法太麻烦了,就不再用了。而是用上面提到的OnOK函数来实现/*//实现所需功能自定义的编辑框窗口过程函数WNDPROCprevProc;LRESULT CALLBACK NewEditProc(   //窗口过程函数,截获WM_CHAR消息并作出相应的判断和处理。该函数名可以自己定义HWND hwnd,      // handle to windowUINT uMsg,      // message identifierWPARAM 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}  */

0 0
原创粉丝点击