c++ MFC笔记008 对话框+动态创建按钮+Edit Control+Static Text

一   创建对话框

  资源视图->Dialog->右键->插入Dialog 默认生成一个ID:IDD_DIALOG1的对话框,在生成的IDD_DIALOG1上双击打开编辑。在对话框编辑区任意位置按右键->添加类(也可以通过[项目]->[添加类])。这两种方式默认状态下, 对话框:IDD_DIALOG1,基类:CDialogEx。此时填写类名:CFstDlg,它会自动生成去了字母C的头文件和源文件(名字都可以改,一般默认就可以,除非冲突)。

                                         

  在资源视图中Menu双击 IDR_MAINFRAME菜单,在帮助后面添加一个菜单项,直接输入打开对话框1,选中它右键->属性,将Popup的值改为False,杂项中ID那里输入:IDM_OPENDIL1。再次在刚增加的菜单上右键->添加处理程序->消息类型:COMMAND  类列表选择:xxxView,函数处理程序用默认的:OnOpenDlg1之后添加编辑:

                                       

  在OnOpenDlg1中添加如下代码:   先包含  #include "FstDlg.h"

CFstDlg dlg1;
void CMFCDLGView::OnOpendlg1()
{
    /*模式窗口方式*/
    CFstDlg dlg;        //用刚才增加的类CFstDlg 创建一个对象
    dlg.DoModal();      //用模式窗口方式显示该对话框
    //dlg.EndDialog();  关闭模式窗口用
    //单击了OK才会执行到下面
    

    /*非模式窗口方式*/
    //CFstDlg dlg1; //定义在类外,否则,执行完就自动析构了 
    dlg1.Create(IDD_DIALOG1,this); //非模式窗口的创建
    dlg1.ShowWindow(SW_SHOW);      //非模式窗口的显示
    //dlg1.DestroyWindow();   实现真正的销毁对象
    //单击OK,只是隐藏了,但并没有销毁对象,要实现按OK销毁它,需要重写OnOK,并在OnOK中调用DestroyWindow();
}

  运行程序,可以单击添加的菜单,可以打开该对话框窗口了。

  当需要按一个按钮之后在对话框中动态的增加一个按钮时:在要弹处的对话框里面,添加一个按钮,修改IDCaption属性,之后右键->添加处理程序->消息类型:BN_CLICKED,函数处理程序名:默认的就可以了,之后添加编辑按钮->转到代码区

    if(!m_btnAdd)
    { 
        m_btnAdd.Create(L"我是动态创建出来的按钮", BS_DEFPUSHBUTTON | WS_VISIBLE | WS_CHILD, CRect(0, 0, 260, 60), this, 0xf11);
    }
    else
    {
        MessageBox(L"对象已存在");
    }

    对话框中的子窗口获取需要用GetDlgItem()

 二 CEdit控件值的获取、设置、选中状态

  一个CEdit可以关联多个变量,变量类别:Control类 Value类

  直接使用项目->类向导添加关联变量时,类名:要添加的关联控件变量所在的对话框类;需要选中 [ ]控件变量复选框勾选,切换到成员变量类别中选择:ControlValue

       资源视图上,选中要创建变量的控件,再右键->添加变量->打开一个对话框:添加成员变量向导->勾选控件变量->类别:Control/Value  变量名:m_xxx; 也可以右键->类向导->成员变量

      关联控件的成员变量在 .h文件中跟普通的没啥区别:在CPP文件中主要区别在如下这段代码:

//由Frame调用,带有数据校验功能,不直接调用,而是要通过调用UpdateData()方法来实现对它的调用
void CFstDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialogEx::DoDataExchange(pDX);
    DDX_Control(pDX, IDC_EDIT1, m_Edit1);         //CEdit控件关联  private CEdit m_Edit1变量
    DDX_Control(pDX, IDC_EDIT2, m_Edit2); 
    DDX_Control(pDX, IDC_EDIT3, m_Edit3);
    DDX_Text(pDX, IDC_EDIT1, m_num1);            //CEdit控件关联  private int m_num1变量
    DDV_MinMaxInt(pDX, m_num1, -1000, 100000);   //带校验功能 Dlg Data Validate
    DDX_Text(pDX, IDC_EDIT2, m_num2);
    DDX_Text(pDX, IDC_EDIT3, m_num3);
}

CEdit值的获取、设置、选中状态测试代码如下:

void CFstDlg::OnBnClickedBtnAdd()
{
    //if(!m_btnAdd)
    //{ 
    //    m_btnAdd.Create(L"我是动态创建出来的按钮", BS_DEFPUSHBUTTON | WS_VISIBLE | WS_CHILD, CRect(0, 0, 260, 60), this, 0xf11);
    //}
    //else
    //{
    //    MessageBox(L"对象已存在");
    //}

    /*方法1*/
    //int num1, num2, num3;
    ////char ch1[10], ch2[10], ch3[10];
    //CString cs1, cs2, cs3;
    //GetDlgItem(IDC_EDIT1)->GetWindowTextW(cs1);
    //GetDlgItem(IDC_EDIT2)->GetWindowTextW(cs2);
    //USES_CONVERSION;
    //num1=atoi(T2A(cs1.GetBuffer()));
    //num2 = atoi(T2A(cs2.GetBuffer()));
    //num3 = num1 + num2;
    //char* temp=new char[10];
    //itoa(num3, temp, 10);//第三个参数表示10进制
    //CString css(temp);
    //GetDlgItem(IDC_EDIT3)->SetWindowText(css);
    //delete[] temp;

    /*方法2 S/GetDlgItemText 文本转数字*/
    //int num1_1, num2_2, num3_3;
    //CString cs_num1, cs_num2, cs_num3;
    //GetDlgItemText(IDC_EDIT1, cs_num1);
    //GetDlgItemText(IDC_EDIT1, cs_num2);
    //USES_CONVERSION;
    //num1_1 = atoi(T2A(cs_num1.GetBuffer()));
    //num2_2 = atoi(T2A(cs_num2.GetBuffer()));
    //num3_3 = num1_1 + num2_2;
    //char* temp1 = new char[10];
    //itoa(num3_3, temp1, 10);//第三个参数表示10进制
    //CString cs_result(temp1);
    //SetDlgItemText(IDC_EDIT3, cs_result);
    //delete[] temp1;

    /*方法3 G/SetDlgItemInt()*/
    //int num11, num12, num13;
    //num11=GetDlgItemInt(IDC_EDIT1);
    //num12 = GetDlgItemInt(IDC_EDIT2);
    //num13 = num12+ num11;
    //SetDlgItemInt(IDC_EDIT3, num13);

    /*方法4 编辑框控件关联int变量法------最简单的一种*/
    //UpdateData(); //参数:bSaveAndValidate  TRUE 返回一个非零值表示成功 返回FALSE 表示正在初始化
    //m_num3 = m_num1 + m_num2;
    //UpdateData(FALSE); //需要再次调用,否则控件不会有值,意思就是让控件重新初始化

    /*方法5 编辑框控件关联编辑框变量 使用控件自身的G/SetWindowTextW()*/
    //CString cs_ctrl1, cs_ctrl2, cs_ctrl3;
    //m_Edit1.GetWindowTextW(cs_ctrl1);
    //m_Edit2.GetWindowTextW(cs_ctrl2);
    //m_Edit3.GetWindowTextW(cs_ctrl3);

    /*方法6 利用消息 WM_GETTEXT/WM_GETTEXT*/
    //int a, b, c;
    //wchar_t ch1[10], ch2[10], ch3[10];
    ////控件发送消息的4种方式
    //::SendMessage(GetDlgItem(IDC_EDIT1)->m_hWnd,WM_GETTEXT,10,(LPARAM)ch1); //第三个参数,指示要拷贝的字符数,第四个LParam 文本Buffer
    //::SendMessage(m_Edit1.m_hWnd, WM_GETTEXT, 10, (LPARAM)ch1);                //由于关联了控件变量    
    //GetDlgItem(IDC_EDIT1)->SendMessage(WM_GETTEXT, 10, (LPARAM)ch1);        //直接用CWnd的成员函数
    //m_Edit1.SendMessageW(WM_GETTEXT,10, (LPARAM)ch1);                        //用控件自身的SendMessage
    //m_Edit2.SendMessageW(WM_GETTEXT,10, (LPARAM)ch2);
    //a = _wtoi(ch1);
    //b = _wtoi(ch2);
    //c = a + b;
    //_itow(c, ch3, 10);
    //SendDlgItemMessageW(IDC_EDIT3, WM_SETTEXT, 10, (LPARAM)ch3);


    /*方法7 */
    int a, b, c;
    wchar_t ch1[10], ch2[10], ch3[10];
    SendDlgItemMessageW(IDC_EDIT1, WM_GETTEXT, 10, (LPARAM)ch1);
    SendDlgItemMessageW(IDC_EDIT2, WM_GETTEXT, 10, (LPARAM)ch2);
    a = _wtoi(ch1);   //W 宽字符 atoi()会得不到想要的结果
    b = _wtoi(ch2);
    c = a + b;
    _itow(c,ch3,10);
    SendDlgItemMessageW(IDC_EDIT3, WM_SETTEXT, 0, (LPARAM)ch3); //VS2015里 第三个参数设置为10000也没问题,负数也没影响

    /*设置选中文本状态 EM_SETSEL*/
    SendDlgItemMessageW(IDC_EDIT3, EM_SETSEL,1,3L); //第三个参数开始:0,结尾:-1 它将实现全选功能
    m_Edit3.SetFocus(); //需要设置焦点

}

猜你喜欢

转载自www.cnblogs.com/zhou8744/p/10447937.html