• MFC基础-编辑框和文本控件



    模块功能

    添加当前模块大概功能的描述,希望不要把所有接口文档写在一个文件中,至少按模块分类。

    • 编辑框控件
    • 文本框控件

      1# 编辑框和文本控件创建流程

    1.创建一个对话框

    2. 在对话框中填入相应的组件,例如:用户名、密码、用户协议和注册提交等。

    3. 在组件中绑定变量,主题提交按钮双击创建函数

    CMyDlg::CMyDlg(CWnd* pParent /*=nullptr*/)
    	: CDialogEx(IDD_DIALOG1, pParent)
    	, m_UserName(_T(""))
    	, m_PassWord(_T(""))
    	, m_OtherText(_T("这里是用户协议,不同意也得同意"))
    { }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    双击注册提交 创建的函数

    // 注册按钮的响应,在这个函数中需要检测相应的值
    void CMyDlg::OnBnClickedRegisterButton()
    {
    	UpdateData(TRUE);
    
    	// 判断用户名或密码是否为空,如果为空就提示,否则就输出内容
    	if (m_PassWord.IsEmpty() || m_UserName.IsEmpty())
    		MessageBox(L"请输入正确的用户名或密码");
    	else
    		MessageBox(m_UserName + L" " + m_PassWord);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    4. 数据交换,变量到控件的绑定

    如果用户调用了 UpdateData 函数就会间接的进行数据交换,用户每绑定一个变量到控件,该函数中就会多出一行代码用于支持数据交换。
    [在响应父类 OnInitDialog
    ,消息的时候,这个函数也会被自动调用一次]

    // 如果用户调用了 UpdateData 函数就会间接的进行数据交换,用户每绑定一个变量
    //	到控件,该函数中就会多出一行代码用于支持数据交换。[在响应父类 OnInitDialog
    //	消息的时候,这个函数也会被自动调用一次]
    void CMyDlg::DoDataExchange(CDataExchange* pDX)
    {
    	CDialogEx::DoDataExchange(pDX);
    	DDX_Text(pDX, IDC_USERNAME, m_UserName);
    	DDX_Text(pDX, IDC_PASSWORD, m_PassWord);
    	DDX_Text(pDX, IDC_EDIT2, m_OtherText);
    	DDX_Control(pDX, IDC_USERNAME, m_UserNameCtrl);
    	DDX_Control(pDX, IDC_PASSWORD, m_PassWordCtrl);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    5. 编写消息对应的宏

    // 在这两个宏的中间,编写相应消息对应的宏
    BEGIN_MESSAGE_MAP(CMyDlg, CDialogEx)
    	ON_BN_CLICKED(IDC_REGISTER_BUTTON, &CMyDlg::OnBnClickedRegisterButton)
    END_MESSAGE_MAP()
    
    • 1
    • 2
    • 3
    • 4

    6. 响应对话框创建的消息

    // 响应对话框创建的消息
    BOOL CMyDlg::OnInitDialog()
    {
    	// 如果这个地方没有编写这句话,数据就不会在初始化的时候进行绑定
    	CDialogEx::OnInitDialog();
    
    	// 通过函数设置编辑框的输入长度
    	m_UserNameCtrl.SetLimitText(6);
    	m_PassWordCtrl.SetLimitText(8);
    
    	// 设置密码默认的填充字符
    	m_PassWordCtrl.SetPasswordChar('#');
    
    	return TRUE;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    编辑框和文本控件.cpp代码实现

    
    // CMyDlg.cpp: 实现文件
    //
    
    #include "pch.h"
    #include "framework.h"
    #include "CMyWinApp.h"
    #include "CMyDlg.h"
    #include "afxdialogex.h"
    
    #ifdef _DEBUG
    #define new DEBUG_NEW
    #endif
    
    // CMyDlg 对话框
    
    
    // 将资源 ID 硬编码传入了父类的构造函数中,绑定了资源
    CMyDlg::CMyDlg(CWnd* pParent /*=nullptr*/)
    	: CDialogEx(IDD_DIALOG1, pParent)
    	, m_UserName(_T(""))
    	, m_PassWord(_T(""))
    	, m_OtherText(_T("这里是用户协议,不同意也得同意"))
    { }
    
    
    // 如果用户调用了 UpdateData 函数就会间接的进行数据交换,用户每绑定一个变量
    //	到控件,该函数中就会多出一行代码用于支持数据交换。[在响应父类 OnInitDialog
    //	消息的时候,这个函数也会被自动调用一次]
    void CMyDlg::DoDataExchange(CDataExchange* pDX)
    {
    	CDialogEx::DoDataExchange(pDX);
    	DDX_Text(pDX, IDC_USERNAME, m_UserName);
    	DDX_Text(pDX, IDC_PASSWORD, m_PassWord);
    	DDX_Text(pDX, IDC_EDIT2, m_OtherText);
    	DDX_Control(pDX, IDC_USERNAME, m_UserNameCtrl);
    	DDX_Control(pDX, IDC_PASSWORD, m_PassWordCtrl);
    }
    
    
    // 在这两个宏的中间,编写相应消息对应的宏
    BEGIN_MESSAGE_MAP(CMyDlg, CDialogEx)
    	ON_BN_CLICKED(IDC_REGISTER_BUTTON, &CMyDlg::OnBnClickedRegisterButton)
    END_MESSAGE_MAP()
    
    
    // 响应对话框的创建消息
    BOOL CMyDlg::OnInitDialog()
    {
    	// 如果这个地方没有编写这句话,数据就不会在初始化的时候进行绑定
    	CDialogEx::OnInitDialog();
    
    	// 通过函数设置编辑框的输入长度
    	m_UserNameCtrl.SetLimitText(6);
    	m_PassWordCtrl.SetLimitText(8);
    
    	// 设置密码默认的填充字符
    	m_PassWordCtrl.SetPasswordChar('#');
    
    	return TRUE;
    }
    
    // 注册按钮的响应,在这个函数中需要检测相应的值
    void CMyDlg::OnBnClickedRegisterButton()
    {
    	UpdateData(TRUE);
    
    	// 判断用户名或密码是否为空,如果为空就提示,否则就输出内容
    	if (m_PassWord.IsEmpty() || m_UserName.IsEmpty())
    		MessageBox(L"请输入正确的用户名或密码");
    	else
    		MessageBox(m_UserName + L" " + m_PassWord);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73

    编辑框和文本控件.h代码实现

    
    // CMyDlg.h: 头文件
    //
    
    #pragma once
    
    
    // CMyDlg 对话框
    class CMyDlg : public CDialogEx
    {
    
    public:
    	// 构造函数要求传入的参数是指向父类对象的指针(不是句柄)
    	CMyDlg(CWnd* pParent = nullptr);
    
    // 和 [类向导] 相关,如果删除了这一行,那么类向导功能会不完整
    #ifdef AFX_DESIGN_TIME
    	enum { IDD = IDD_DIALOG1 };
    #endif
    
    protected:
    	// 支持变量和控件之间的数据交换
    	virtual void DoDataExchange(CDataExchange* pDX) override;
    
    
    protected:
    	// 这是一个虚函数,用于响应对话框的创建消息
    	virtual BOOL OnInitDialog() override;
    
    	// 消息映射宏用于支持消息和对应函数的响应
    	DECLARE_MESSAGE_MAP()
    public:
    	CString m_UserName;
    	CString m_PassWord;
    	CString m_OtherText;
    	afx_msg void OnBnClickedRegisterButton();
    	CEdit m_UserNameCtrl;
    	CEdit m_PassWordCtrl;
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39

    结果展示

    bjk1.gif

  • 相关阅读:
    【CSS3】
    Vue-(4)
    Casbin访问控制框架入门详解及Java案例示范
    如何正确选择ARM核心板的存储类型
    七天.NET 8操作SQLite入门到实战 - (2)第七天Blazor班级管理页面编写和接口对接
    [leetcode 单调栈] 901. 股票价格跨度 M
    业务出海必答题,融云全球通信网络技术挑战破解实践
    如何在OneFlow中新增算子
    c++: 引用能否替代指针? 详解引用与指针的区别.
    基于docker搭建code-server(浏览器中的VScode)
  • 原文地址:https://blog.csdn.net/mengxj168/article/details/126831926