MFC(二)集成基础控件

news2024/11/17 20:38:10

目录

  • OnCreate
  • CStatic【标签,图片】
  • CEdit【文本框,密码框,数值框,文本区】
  • CButton【按钮,单选按钮,多选按钮】
  • CComboBox【下拉列表,列表】
  • CSliderCtrl【滑动条】
  • CListCtrl【表格】
  • CAnimateCtrl【视频】
  • MessageBox【弹出对话框】
  • CFileDialog【文件选择&保存框】
  • SHBrowseForFolder【文件夹选择框】
  • OnButtonClick【按钮单击事件处理】

OnCreate

控件的动态创建代码可以放在OnCreate函数中,查阅MFC文档可知对应函数
MFC文档下载地址:http://dx.198424.com/soft1/vcmfc.zip

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

CStatic【标签,图片】

#include "atlimage.h"

CRect getRect(int x, int y, int width, int height) {
	CRect r(x, y, x + width, y + height);
	return r;
}

int MyFrame::OnCreate(LPCREATESTRUCT)
{
	int defaultStyle = WS_CHILD | WS_VISIBLE;
	int labelId = 1, imageViewId = 2;
	CStatic* label = new CStatic;
	label->Create(TEXT("标签"), defaultStyle, getRect(10, 10, 40, 30), this, labelId);

	CImage image;
	image.Load(TEXT("mfc.png"));
	HBITMAP hBmp = image.Detach();

	CStatic* imageView = new CStatic;
	imageView->Create(NULL, defaultStyle | SS_BITMAP | SS_CENTERIMAGE, getRect(10, 60, 200, 100), this, imageViewId);
	imageView->SetBitmap(hBmp);

	return 1;
}

CEdit【文本框,密码框,数值框,文本区】

int MyFrame::OnCreate(LPCREATESTRUCT)
{
	int defaultStyle = WS_CHILD | WS_VISIBLE;
	int editStyle = defaultStyle | ES_AUTOHSCROLL | WS_BORDER;
	int textAreaStyle = defaultStyle | WS_BORDER | ES_MULTILINE | ES_AUTOVSCROLL;
	int textInputId = 1, passwordInputId = 2, numberInputId = 3, textAreaInputId = 4;

	CEdit* textInput = new CEdit;
	textInput->Create(editStyle, getRect(10, 10, 150, 30), this, textInputId);
	textInput->SetWindowText(TEXT("文本输入框"));

	// 密码输入框
	CEdit* passwordInput = new CEdit;
	passwordInput->Create(editStyle | ES_PASSWORD, getRect(10, 50, 150, 30), this, passwordInputId);

	// 数值输入框
	CEdit* numberInput = new CEdit;
	numberInput->Create(editStyle | ES_NUMBER, getRect(10, 90, 150, 30), this, numberInputId);

	CEdit* textAreaInput = new CEdit;
	textAreaInput->Create(textAreaStyle, getRect(10, 130, 150, 100), this, textAreaInputId);
	textAreaInput->SetWindowText(TEXT("多行文本区"));

	return 1;
}

CButton【按钮,单选按钮,多选按钮】

int MyFrame::OnCreate(LPCREATESTRUCT)
{
	int defaultStyle = WS_CHILD | WS_VISIBLE;
	int pushButtonId = 1, radioButton1Id = 2, radioButton2Id = 3, checkBox1Id = 4, checkBox2Id = 5;

	CButton* pushButton = new CButton;
	pushButton->Create(TEXT("按钮"), defaultStyle | BS_PUSHBUTTON, getRect(10, 10, 60, 30), this, pushButtonId);

	// 单选按钮, 必须设置分组, 处于同一组的按钮, 只能选中其中一个
	// 处于同一组的按钮, 首个按钮必须添加WS_GROUP风格, 它们的ID往往是连续递增的
	// 一旦添加具有WS_GROUP风格的按钮, 则代表上一组的成员已经分配完毕, 准备分配下一组的成员
	CButton* radioButton1 = new CButton;
	radioButton1->Create(TEXT("男"), defaultStyle | BS_AUTORADIOBUTTON | WS_GROUP, getRect(10, 50, 60, 30), this, radioButton1Id);
	radioButton1->SetCheck(true);
	CButton* radioButton2 = new CButton;
	radioButton2->Create(TEXT("女"), defaultStyle | BS_AUTORADIOBUTTON, getRect(70, 50, 60, 30), this, radioButton2Id);

	// 多选按钮
	CButton* checkBox1 = new CButton;
	checkBox1->Create(TEXT("A"), defaultStyle | BS_AUTOCHECKBOX | WS_GROUP, getRect(10, 90, 60, 30), this, checkBox1Id);
	checkBox1->SetCheck(true);
	CButton* checkBox2 = new CButton;
	checkBox2->Create(TEXT("B"), defaultStyle | BS_AUTOCHECKBOX, getRect(70, 90, 60, 30), this, checkBox2Id);

	return 1;
}

CComboBox【下拉列表,列表】

int MyFrame::OnCreate(LPCREATESTRUCT)
{
	int defaultStyle = WS_CHILD | WS_VISIBLE;
	int comboBoxId = 1, listBoxId = 2;

	// 下拉列表的高度值最好设大点, 不然下拉框无法显示
	CComboBox* comboBox = new CComboBox;
	comboBox->Create(defaultStyle | CBS_DROPDOWNLIST, getRect(10, 10, 100, 100), this, comboBoxId);
	comboBox->AddString(TEXT("方案1"));
	comboBox->AddString(TEXT("方案2"));
	comboBox->AddString(TEXT("方案3"));
	comboBox->AddString(TEXT("方案4"));
	comboBox->SetCurSel(0);

	// 普通列表
	CListBox* listBox = new CListBox;
	listBox->Create(defaultStyle | WS_BORDER, getRect(120, 10, 100, 100), this, listBoxId);
	listBox->AddString(TEXT("方案1"));
	listBox->AddString(TEXT("方案2"));
	listBox->AddString(TEXT("方案3"));
	listBox->AddString(TEXT("方案4"));
	listBox->SetCurSel(0);

	return 1;
}

CSliderCtrl【滑动条】

#include <afxcmn.h>

int MyFrame::OnCreate(LPCREATESTRUCT)
{
	int defaultStyle = WS_CHILD | WS_VISIBLE;
	int sliderId = 1;

	CSliderCtrl* slider = new CSliderCtrl;
	slider->Create(defaultStyle | TBS_BOTH | TBS_TOOLTIPS, getRect(10, 10, 180, 50), this, sliderId);
	slider->SetRange(0, 100);
	slider->SetPos(50);

	return 1;
}

CListCtrl【表格】

#include <afxcmn.h>

int MyFrame::OnCreate(LPCREATESTRUCT)
{
	int defaultStyle = WS_CHILD | WS_VISIBLE;
	int tableViewId = 1, columnNum = 3, columnWidth = 100;

	CListCtrl* tableView = new CListCtrl;
	tableView->Create(defaultStyle | WS_BORDER | LVS_REPORT, getRect(10, 10, columnNum * columnWidth, 200), this, tableViewId);
	tableView->InsertColumn(1, TEXT("学号"), LVCFMT_CENTER, columnWidth);
	tableView->InsertColumn(2, TEXT("姓名"), LVCFMT_CENTER, columnWidth);
	tableView->InsertColumn(3, TEXT("性别"), LVCFMT_CENTER, columnWidth);

	int idx = tableView->InsertItem(0, TEXT("0"));
	tableView->SetItemText(idx, 1, TEXT("AMC"));
	tableView->SetItemText(idx, 2, TEXT("男"));

	idx = tableView->InsertItem(1, TEXT("1"));
	tableView->SetItemText(idx, 1, TEXT("QAQ"));
	tableView->SetItemText(idx, 2, TEXT("男"));

	return 1;
}

CAnimateCtrl【视频】

#include <afxcmn.h>

int MyFrame::OnCreate(LPCREATESTRUCT)
{
	int defaultStyle = WS_CHILD | WS_VISIBLE;
	int mediaViewId = 1;

	// 只能播放简单的AVI视频, 绝大部分AVI视频都不符合要求
	// 它非常不实用, 如果想要测试它, 推荐Window Xp系统自带的clock.avi
	CAnimateCtrl* mediaView = new CAnimateCtrl;
	mediaView->Create(defaultStyle | WS_BORDER, getRect(10, 10, 300, 300), this, mediaViewId);
	mediaView->Open(TEXT("clock.avi"));
	mediaView->Play(0, -1, -1);

	return 1;
}

MessageBox【弹出对话框】

int MyFrame::OnCreate(LPCREATESTRUCT)
{
	// 类型                按钮[返回值]
	// MB_OK               确认[IDOK]
	// MB_YESNO            是[IDYES]+否[IDNO]
	// MB_ABORTRETRYIGNORE 中止[IDABORT]+重试[IDRETRY]+忽略[IDIGNORE]
	// MB_YESNOCANCEL      是+否+取消[IDCANCEL]
	// MB_RETRYCANCEL      重试+取消
	// MB_OKCANCEL         确认+取消
	// 图标                描述
	// MB_ICONWARNING      !
	// MB_ICONASTERISK     i
	// MB_ICONQUESTION     ?
	// MB_ICONERROR        X
	int result = MessageBox(TEXT("消息内容"), TEXT("对话框标题"), MB_YESNO | MB_ICONQUESTION);

	CString str;
	str.Format("返回值: %d", result);
	MessageBox(str);

	return 1;
}

CFileDialog【文件选择&保存框】

#include <afxdlgs.h>
//#include <vector>

int MyFrame::OnCreate(LPCREATESTRUCT)
{
	// 打开 or 保存
	BOOL open = TRUE;
	// 默认打开的文件, 有\\后缀表示文件夹
	LPCTSTR defaultFile = TEXT("D:\\Soft\\");
	// 类型说明和扩展名用|分割, 同种扩展名用;分割
	// 不同文件类型用|分割, 末尾用||指明
	LPCTSTR filter = TEXT("文本|*.txt|图片|*.bmp;*.jpg;*.png|所有文件|*.*||");
	// 如果想要打开多个文件, 可添加风格: OFN_ALLOWMULTISELECT
	CFileDialog fileDialog(open, NULL, defaultFile, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, filter);

	if (fileDialog.DoModal() == IDOK)
	{
		CString path = "你选择的路径是: " + fileDialog.GetPathName();
		MessageBox(path);

		// 打开多个文件, 需要使用以下代码
		//std::vector<CString> fileNames;
		//POSITION pos = fileDialog.GetStartPosition();
		//while (pos != NULL)
		//{
		//	CString strFile = fileDialog.GetNextPathName(pos);
		//	fileNames.push_back(strFile);
		//}
	}

	return 1;
}

SHBrowseForFolder【文件夹选择框】

#include <shlobj.h>
#pragma comment(lib,"shell32.lib")

int MyFrame::OnCreate(LPCREATESTRUCT)
{
	TCHAR path[MAX_PATH];
	BROWSEINFO bi;
	LPITEMIDLIST lp;

	bi.hwndOwner = NULL;
	bi.pidlRoot = NULL;
	bi.pszDisplayName = path;
	bi.lpszTitle = TEXT("请选择文件夹");
	bi.ulFlags = BIF_RETURNONLYFSDIRS | BIF_NEWDIALOGSTYLE;
	// 如果想要定制化功能, 可以了解以下2个参数
	bi.lpfn = NULL;
	bi.lParam = NULL;

	if ((lp = SHBrowseForFolder(&bi)) != NULL && SUCCEEDED(SHGetPathFromIDList(lp, path)))
	{
		MessageBox(path);
	}
	
	return 1;
}

OnButtonClick【按钮单击事件处理】

// 用户按钮处理函数, 可查文档
// 映射入口                               函数原型 
// ON_BN_CLICKED( <id>, <memberFxn> )    afx_msg void memberFxn( ) 

// mfc.h
class MyFrame : public CFrameWnd
{
public:
	MyFrame();
	DECLARE_MESSAGE_MAP()
	afx_msg int OnCreate(LPCREATESTRUCT);
	afx_msg void OnClickByOpenButton();
};

// mfc.cpp
int IDC_OPENBUTTON = 1;

BEGIN_MESSAGE_MAP(MyFrame, CFrameWnd)
	ON_WM_CREATE()
	ON_BN_CLICKED(IDC_OPENBUTTON, &MyFrame::OnClickByOpenButton)
END_MESSAGE_MAP()

int MyFrame::OnCreate(LPCREATESTRUCT)
{
	CButton* openButton = new CButton;
	openButton->Create(TEXT("OPEN"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, CRect(10, 10, 70, 40), this, IDC_OPENBUTTON);
	return 1;
}

void MyFrame::OnClickByOpenButton()
{
	MessageBox(TEXT("我点击了打开按钮"));
}

以上代码创建了一个id=1的按钮,它的单击事件处理函数是OnClickByOpenButton
函数名是可以自定义的,它的声明写到MyFrame中即可
需要注意映射入口,需要填写按钮id和对应的处理函数

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1548357.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LangChain核心概念与组件

Chains Chains可以让你按照一定的顺序和逻辑来执行不同的任务。Chains有以下四种类型&#xff1a; 类型作用LLMChain用于在语言模型周围添加一些功能的简单Chain&#xff0c;它由一个PromptTemplate和一个语言模型&#xff08;LLM或chat model&#xff09;组成&#xff0c;它…

FlorisBoard:Android开源键盘的现代化选择

FlorisBoard&#xff1a;Android开源键盘的现代化选择 简介 FlorisBoard是一款免费且开源的安卓键盘&#xff0c;适用于Android 7.0及以上版本的设备。它的现代化设计和用户友好的界面使其在众多键盘应用中脱颖而出。FlorisBoard的独特之处在于它注重用户体验的同时&#xff0…

ArcGIS二次开发(一)——搭建开发环境以及第一个简单的ArcGIS Engine 程序

Arcgis10.2、Arcgis Engine10.2与Microsoft Visual Studio 2012的版本进行安装 1、推荐教程与安装包2、安装顺序3、安装成功测试VS新建项目可以创建ArcGIS项目&#xff0c;并且在VS中拖拽ArcGIS工具 4、搭建第一个简单的ArcGIS Engine 程序 ArcEngine和VS版本是有对应的&#x…

如何高效系统地自学 Python?

导言&#xff1a; Python作为一门流行的编程语言&#xff0c;被广泛运用于数据分析、人工智能、网络应用等领域。想要系统地自学Python&#xff0c;并掌握其核心概念和编程技能&#xff0c;需要一定的方法和步骤。本文将介绍如何高效系统地自学Python&#xff0c;让你能够快速…

双纤SFP光模块和单纤SFP光模块之间的区别

双纤SFP光模块和单纤SFP光模块是两种不同的光模块类型。对于网络部署而言&#xff0c;了解它们之间的区别至关重要。本文将深入探讨这两种光模块之间的差异&#xff0c;并介绍其特性和适用场景。 双纤与单纤SFP光模块&#xff1a;它们是什么&#xff1f; 双纤SFP光模块是常用…

Netty源码剖析——ChannelHandler 篇(三十六)

ChannelHandler 作用及设计 public interface ChannelHandler {/*** Gets called after the {link ChannelHandler} was added to the actual context and its ready to handle events. 当把 ChannelHandler 添加到 pipeline 时被调用*/void handlerAdded(ChannelHandlerContex…

【前端面试3+1】01闭包、跨域、路由模式

一、对闭包的理解 定义&#xff1a; 闭包是指在一个函数内部定义的函数&#xff0c;并且该内部函数可以访问外部函数的变量。闭包使得函数内部的变量在函数执行完后仍然可以被访问和操作。 特点&#xff1a; 闭包可以访问外部函数的变量&#xff0c;即使外部函数已经执行完毕。…

游戏开发笔记:游戏海外版本时区问题(解释时区问题,分解为js写法和lua写法来分析记录,整理出对应语言的相关函数方法。)

对于海外游戏而言,与时间相关的功能,都不能忽略时区的计算。根据 ‘ 服务端资源是有限的,客户端资源是无穷无尽的 ’的定义来说,基本上时区包括时间的计算都是由客户端来进行计算,今天内容也是围绕客户端来展开。 时区算法常见的时间描述时区需要计算的点在lua语言中的写…

我与电源2 我要升压

上一篇文章中讲到,我从LM7805 开始 接触电子设计,后来,随着对更高耐压,更高电流及功率的需求,不断的接触更先进的,效率更高,功率密度更大的电源方案,从线性稳压器到 DCDC 的Buck 电路。从最初 DCDC的异步开关模式转到使用同步开关模式。 这里要对线性稳压器再说一点。…

library cache lock模拟和处理

会话一&#xff1a; create or replace procedure dummy is begin null; end; /begin Dummy; Dbms_lock.sleep(1000); End; /会话二&#xff1a; SQL> alter procedure dummy compile; 卡住 会话三&#xff1a; SQL> alter procedure dummy compile; 卡住 处理过程…

计算机基础系列 —— CPU

“Make everything as simple as possible, but no simpler.” – Albert Einstein 文中提到的所有实现都可以参考&#xff1a;nand2tetris_sol&#xff0c;但是最好还是自己学习课程实现一遍&#xff0c;理解更深刻。 之前的文章里我们介绍了 Register、PC、RAM 和 ALU&#…

【蓝桥杯】tarjan算法

一.概述 Tarjan 算法是基于DFS的算法&#xff0c;用于求解图的连通性问题。 Tarjan 算法可以在线性时间内求出&#xff1a; 无向图&#xff1a; 割点与桥双连通分量 有向图&#xff1a; 强连通分量必经点与必经边 1.割点&#xff1a; 若从图中删除节点 x 以及所有与 x 关联的…

【学习】软件科技成果鉴定测试有何作用

软件科技成果鉴定测试是针对软件进行项目申报、科技成果鉴定等相关目的进行的测试。软件测试报告可作为项目申报、科技成果鉴定等工作的依据之一。软件类科技成果鉴定测试从软件文档、功能性、使用技术等方面对软件系统进行符合性测试。其测试结果证明软件的质量是否符合技术合…

机器学习笔记(2)—单变量线性回归

单变量线性回归 单变量线性回归(Linear Regression with One Variable)1.1 模型表示1.2 代价函数1.3 代价函数的直观理解1.4 梯度下降1.5 梯度下降的直观理解1.6 梯度下降的线性回归 单变量线性回归(Linear Regression with One Variable) ps:...今天很倒霉 一名小女孩悄悄地碎…

PTA金字塔游戏

幼儿园里真热闹&#xff0c;老师带着孩子们做一个名叫金字塔的游戏&#xff0c;游戏规则如下&#xff1a; 首先&#xff0c;老师把孩子们按身高从高到矮排列&#xff0c;选出最高的做队长&#xff0c;当金字塔的塔顶&#xff0c;之后在其余小朋友里选出两个最高的&#xff0c;…

JUC:打断正常线程、睡眠线程、park线程的interrupt状态、二阶段终止模式

文章目录 打断标记两阶段终止注意打断park线程 打断标记 睡眠中的线程被打断时&#xff0c;会抛出异常&#xff0c;把打断标记置为false&#xff0c;而不是变为true&#xff0c;wait和join也是。 打断 sleep&#xff0c;wait&#xff0c;join 的线程 这几个方法都会让线程进入…

如何使用Docker安装部署Cronsun?

前言 Cronsun是一款开源的分布式任务调度系统&#xff0c;主要用于在*nix服务器集群中管理和调度周期性任务。相比于传统的Linux crontab 工具&#xff0c;Cronsun提供了一个集中化的Web界面&#xff0c;使得在多台服务器上的定时任务更容易管理和监控&#xff0c;并且具备任务…

大话设计模式——8.原型模式(Prototype Pattern)

1.介绍 用原型实例指定创建对象的种类&#xff0c;并且通过拷贝这些原型创建新的对象。属于创建型模式。 UML图&#xff1a; 1&#xff09;浅拷贝&#xff1a; 指创建一个新的对象&#xff0c;然后将原始对象的字段值复制到新对象中。如果字段是基本类型&#xff0c;直接复制…

MySQL高阶SQL语句

文章目录 MySQL高阶SQL语句MySQL常用查询1、按关键字排序1.1 语法1.2 ASC和DESC1.3 对数据表中信息进行排序1.3.1 普通排序1.3.2 结合where进行条件过滤1.3.3 对多个字段进行排序 2、区间判断及查询不重复记录2.1 and/or —— 且/或2.1.1 普通查询2.1.2 嵌套/多条件查询 2.2 di…

Java毕业设计-基于springboot开发的校园志愿者管理系统-毕业论文+答辩PPT(附源代码+演示视频)

文章目录 前言一、毕设成果演示&#xff08;源代码在文末&#xff09;二、毕设摘要展示1、开发说明2、需求分析3、系统功能结构 三、系统实现展示1、系统功能模块2、管理员功能3、志愿者功能 四、毕设内容和源代码获取总结 Java毕业设计-基于springboot开发的校园志愿者管理系统…