本文使用环境Visual Studio 2017
一、创建项目
按照第一篇文章《Visual Studio 2017安装MFC相关组件并新建MFC初始化项目》进行创建。
二、添加输入框并完成功能
1.添加组件
在项目的“资源视图”中点开“项目名.rc”,点开其中的“DIalog”,双击选择主题窗口可视化文件,例如图中“IDD_MFCAPPLICATION2_DIALOG”。从图中右侧“对话框编辑器”中选择Edit Control,并拖拽至对话框中所需位置,并调整所需大小,放入两个。(这次我们直接删除“确认”和“取消”按钮,使用不到)。

2.设置属性
在视图界面中单击刚刚拖入的左侧Edit Control输入框后,选择“属性”,ID为该输入框在项目中的唯一标识,可进行修改,图中修改为“IDC_EDIT_INPUT”,右侧修改为“IDC_EDIT_OUTPUT”。(其它补充:若在“属性”->“行为”中将Password设置为True,则Edit Control组件中的内容将不会明文显示,而是会像输入密码一样显示为:●●●●●●●)

3.添加变量
在视图界面中右键输入框,选择“添加变量”。左侧输入框设置为变量m_input,右侧输入框设置为变量m_output。

在弹出的对话框中,输入变量名称,点击“完成”

添加变量之后,我们手动在.h文件中创建变量m_editText用来关联Edit Control中的文字内容
CString m_editText;
在对应窗口的.h文件的public中,内容如下:
// MFCApplication2Dlg.h: 头文件
#pragma once
// CMFCApplication2Dlg 对话框
class CMFCApplication2Dlg : public CDialogEx
{
// 构造
public:
CMFCApplication2Dlg(CWnd* pParent = nullptr); // 标准构造函数
// 对话框数据
#ifdef AFX_DESIGN_TIME
enum { IDD = IDD_MFCAPPLICATION2_DIALOG };
#endif
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
// 实现
protected:
HICON m_hIcon;
// 生成的消息映射函数
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
DECLARE_MESSAGE_MAP()
/* ↓↓↓添加变量自动生成的内容,CEdit变量↓↓↓ */
public:
CEdit m_input;
CEdit m_output;
/* ↑↑↑添加变量自动生成的内容,CEdit变量↑↑↑ */
/* ↓↓↓手动添加的m_editText变量↓↓↓ */
CString m_editText;
/* ↑↑↑手动添加的m_editText变量↑↑↑ */
};
在对应窗口的.cpp文件的DoDataExchange中会多出绑定:
void CMFCApplication2Dlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
/* ↓↓↓添加变量时自动添加的绑定内容,将ID与变量进行绑定。↓↓↓ */
DDX_Control(pDX, IDC_EDIT_INPUT, m_input); //控制绑定
DDX_Control(pDX, IDC_EDIT_OUTPUT, m_output); //控制绑定
/* ↑↑↑添加变量时自动添加的绑定内容,将ID与变量进行绑定。↑↑↑ */
/* ↓↓↓手动添加的绑定内容,将ID与变量进行绑定。↓↓↓ */
DDX_Text(pDX, IDC_EDIT_INPUT, m_editText); //内容文字绑定
/* ↑↑↑手动添加的绑定内容,将ID与变量进行绑定。↑↑↑ */
}
自动添加的内容除此种添加方法之外,也可以不用右键点击试图界面种的Edit Control控件选择“添加变量”,可以直接在程序中添加变量声明和绑定ID和变量即可完成变量定义。
4.获取并显示
在这里,我们为了提供一个触发方式来方便显示从输入框中获取消息并在输出框中显示,按照上一篇文章《Visual Studio 2017 MFC控件 - Button按钮》的内容添加一个按钮作为触发器,按钮的ID设置为“IDC_BUTTON_GET”,绑定变量为m_button,触发事件绑定函数OnBnClickedButtonGet。
// .h中添加的按钮相关内容:
public:
CEdit m_input;
CEdit m_output;
CString m_editText;
/* ↓↓↓添加的按钮相关内容。↓↓↓ */
CButton m_button;
afx_msg void OnBnClickedButtonGet();
/* ↑↑↑添加的按钮相关内容。↑↑↑ */
// .cpp中添加的按钮相关内容
void CMFCApplication2Dlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Control(pDX, IDC_EDIT_INPUT, m_input);
DDX_Control(pDX, IDC_EDIT_OUTPUT, m_output);
DDX_Text(pDX, IDC_EDIT_INPUT, m_editText);
/* ↓↓↓添加的按钮相关内容。↓↓↓ */
DDX_Control(pDX, IDC_BUTTON_GET, m_button);
/* ↑↑↑添加的按钮相关内容。↑↑↑ */
}
BEGIN_MESSAGE_MAP(CMFCApplication2Dlg, CDialogEx)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
/* ↓↓↓添加的按钮相关内容。↓↓↓ */
ON_BN_CLICKED(IDC_BUTTON_GET, &CMFCApplication2Dlg::OnBnClickedButtonGet)
/* ↑↑↑添加的按钮相关内容。↑↑↑ */
END_MESSAGE_MAP()
/* ↓↓↓添加的按钮相关内容。↓↓↓ */
void CMFCApplication2Dlg::OnBnClickedButtonGet()
{
// TODO: 在此添加控件通知处理程序代码
}
/* ↑↑↑添加的按钮相关内容。↑↑↑ */
这时,我们让按钮点击之后,获取Edit Control框IDC_EDIT_INPUT中的内容并在Edit Control框IDC_EDIT_OUTPUT中显示。需要在CMFCApplication2Dlg::OnBnClickedButtonGet()函数中添加相关内容,代码如下:
void CMFCApplication2Dlg::OnBnClickedButtonGet()
{
// TODO: 在此添加控件通知处理程序代码
// 获取方法一:
// 通过更新和绑定关系,直接获取内容此方法只需
// 要定义CString类型变量m_editText并进行文字
// 绑定即可,不需要m_input与IDC_EDIT_INPUT进
// 行控制绑定,不需要定义CEdit类型m_input变量
UpdateData(); //将控件的值赋值给成员变量
CString word1 = m_editText; //因为m_editText与控件内容绑定,所以更新后直接获得相应内容
// 获取方法二:
// 通过控件相关函数获取内容。需要进行控制绑定,
// 不需要定义CString类型变量m_editText和文字内
// 容绑定。
CString word2;
m_input.GetWindowTextW(word2);
// 拼接两种方法获取的内容并在第二个框中进行显示
CString showText = _T("(") + word1 + _T(")(") + word2 + _T(")");
m_output.SetWindowTextW(showText);
}
运行程序,效果如图:

三、其它常用功能
除此之外,其它常用功能还有显示,隐藏,禁用,可用等。
// 输出框设为不可用状态
m_output.EnableWindow(FALSE);
// 输出框设为可用状态
m_output.EnableWindow(TRUE);
// 让输出框隐藏
m_output.ShowWindow(FALSE);
// 让输出框隐藏
m_output.ShowWindow(TRUE);
效果如图:

四、整体代码:
MFCApplication2Dlg.h
// MFCApplication2Dlg.h: 头文件
//
#pragma once
// CMFCApplication2Dlg 对话框
class CMFCApplication2Dlg : public CDialogEx
{
// 构造
public:
CMFCApplication2Dlg(CWnd* pParent = nullptr); // 标准构造函数
// 对话框数据
#ifdef AFX_DESIGN_TIME
enum { IDD = IDD_MFCAPPLICATION2_DIALOG };
#endif
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
// 实现
protected:
HICON m_hIcon;
// 生成的消息映射函数
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
DECLARE_MESSAGE_MAP()
public:
CEdit m_input;
CEdit m_output;
CString m_editText;
CButton m_button;
afx_msg void OnBnClickedButtonGet();
CButton m_btn_disable;
CButton m_btn_enable;
CButton m_btn_hide;
CButton m_btn_show;
afx_msg void OnBnClickedButtonDisable();
afx_msg void OnBnClickedButtonEnable();
afx_msg void OnBnClickedButtonHide();
afx_msg void OnBnClickedButtonShow();
};
MFCApplication2Dlg.cpp
// MFCApplication2Dlg.cpp: 实现文件
//
#include "pch.h"
#include "framework.h"
#include "MFCApplication2.h"
#include "MFCApplication2Dlg.h"
#include "afxdialogex.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// 用于应用程序“关于”菜单项的 CAboutDlg 对话框
class CAboutDlg : public CDialogEx
{
public:
CAboutDlg();
// 对话框数据
#ifdef AFX_DESIGN_TIME
enum { IDD = IDD_ABOUTBOX };
#endif
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
// 实现
protected:
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialogEx(IDD_ABOUTBOX)
{
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP()
// CMFCApplication2Dlg 对话框
CMFCApplication2Dlg::CMFCApplication2Dlg(CWnd* pParent /*=nullptr*/)
: CDialogEx(IDD_MFCAPPLICATION2_DIALOG, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CMFCApplication2Dlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Control(pDX, IDC_EDIT_INPUT, m_input);
DDX_Control(pDX, IDC_EDIT_OUTPUT, m_output);
DDX_Text(pDX, IDC_EDIT_INPUT, m_editText);
DDX_Control(pDX, IDC_BUTTON_GET, m_button);
DDX_Control(pDX, IDC_BUTTON_DISABLE, m_btn_disable);
DDX_Control(pDX, IDC_BUTTON_ENABLE, m_btn_enable);
DDX_Control(pDX, IDC_BUTTON_HIDE, m_btn_hide);
DDX_Control(pDX, IDC_BUTTON_SHOW, m_btn_show);
}
BEGIN_MESSAGE_MAP(CMFCApplication2Dlg, CDialogEx)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON_GET, &CMFCApplication2Dlg::OnBnClickedButtonGet)
ON_BN_CLICKED(IDC_BUTTON_DISABLE, &CMFCApplication2Dlg::OnBnClickedButtonDisable)
ON_BN_CLICKED(IDC_BUTTON_ENABLE, &CMFCApplication2Dlg::OnBnClickedButtonEnable)
ON_BN_CLICKED(IDC_BUTTON_HIDE, &CMFCApplication2Dlg::OnBnClickedButtonHide)
ON_BN_CLICKED(IDC_BUTTON_SHOW, &CMFCApplication2Dlg::OnBnClickedButtonShow)
END_MESSAGE_MAP()
// CMFCApplication2Dlg 消息处理程序
BOOL CMFCApplication2Dlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// 将“关于...”菜单项添加到系统菜单中。
// IDM_ABOUTBOX 必须在系统命令范围内。
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != nullptr)
{
BOOL bNameValid;
CString strAboutMenu;
bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
ASSERT(bNameValid);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// 设置此对话框的图标。 当应用程序主窗口不是对话框时,框架将自动
// 执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标
// TODO: 在此添加额外的初始化代码
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
void CMFCApplication2Dlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialogEx::OnSysCommand(nID, lParam);
}
}
// 如果向对话框添加最小化按钮,则需要下面的代码
// 来绘制该图标。 对于使用文档/视图模型的 MFC 应用程序,
// 这将由框架自动完成。
void CMFCApplication2Dlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 用于绘制的设备上下文
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
// 使图标在工作区矩形中居中
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// 绘制图标
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialogEx::OnPaint();
}
}
//当用户拖动最小化窗口时系统调用此函数取得光标
//显示。
HCURSOR CMFCApplication2Dlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}
void CMFCApplication2Dlg::OnBnClickedButtonGet()
{
// TODO: 在此添加控件通知处理程序代码
// 获取方法一:
// 通过更新和绑定关系,直接获取内容此方法只需
// 要定义CString类型变量m_editText并进行文字
// 绑定即可,不需要m_input与IDC_EDIT_INPUT进
// 行控制绑定,不需要定义CEdit类型m_input变量
UpdateData(); //将控件的值赋值给成员变量
CString word1 = m_editText; //因为m_editText与控件内容绑定,所以更新后直接获得相应内容
// 获取方法二:
// 通过控件相关函数获取内容。需要进行控制绑定,
// 不需要定义CString类型变量m_editText和文字内
// 容绑定。
CString word2;
m_input.GetWindowTextW(word2);
// 拼接两种方法获取的内容并在第二个框中进行显示
CString showText = _T("(") + word1 + _T(")(") + word2 + _T(")");
m_output.SetWindowTextW(showText);
}
void CMFCApplication2Dlg::OnBnClickedButtonDisable()
{
// TODO: 在此添加控件通知处理程序代码
// 输出框设为不可用状态
m_output.EnableWindow(FALSE);
}
void CMFCApplication2Dlg::OnBnClickedButtonEnable()
{
// TODO: 在此添加控件通知处理程序代码
// 输出框设为可用状态
m_output.EnableWindow(TRUE);
}
void CMFCApplication2Dlg::OnBnClickedButtonHide()
{
// TODO: 在此添加控件通知处理程序代码
// 让输出框隐藏
m_output.ShowWindow(FALSE);
}
void CMFCApplication2Dlg::OnBnClickedButtonShow()
{
// TODO: 在此添加控件通知处理程序代码
// 让输出框隐藏
m_output.ShowWindow(TRUE);
}

1718

被折叠的 条评论
为什么被折叠?



