MFC(二)集成基础控件

目录

  • 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.aviCAnimateCtrl* 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        Xint 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_ALLOWMULTISELECTCFileDialog 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.mzph.cn/news/782702.shtml

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

相关文章

C语言分支循环探秘:解锁编程逻辑的无限可能 篇章1

目录 1.if语句 2.关系操作符 3.条件操作符 4.逻辑操作符&#xff1a;&&&#xff0c;||&#xff0c;&#xff01; 5.switch语句 6.while循环 7.for循环 8.do-while循环 9.break和continue语句 10.循环的嵌套 11.goto 导入 C语言是结构化的程序设计语言&…

数字化服务升级:数字乡村改善农民生活质量

随着信息技术的迅猛发展&#xff0c;数字化浪潮已经深入社会的各个角落&#xff0c;为人们的生活带来了翻天覆地的变化。在乡村地区&#xff0c;数字化服务的升级正在逐步改变农民的生活方式&#xff0c;提高他们的生活质量。本文将围绕数字化服务升级&#xff0c;探讨数字乡村…

【蓝桥杯选拔赛真题51】C++百位上的数字 第十四届蓝桥杯青少年创意编程大赛 算法思维 C++编程选拔赛真题解析

目录 C百位上的数字 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 七、推荐资料 C百位上的数字 第十四届蓝桥杯青少年创意编程大赛C选拔赛真题 一、题目要求 1、编程实现 给定一个三位数&#xff0c…

京东云免费服务器申请入口,2024年最新免费云主机

京东云服务器免费6月申请入口 jdyfwq.com 在京东云免费云主机申请页面&#xff0c;免费云服务器配置为云主机2核4G5M和轻量云主机2C2G可以申请免费使用&#xff0c;目前京东云免费云服务器申请时长从之前的6个月缩短到1个月&#xff0c;如下图&#xff1a; 京东云免费云主机 云…

【Java】MyBatis快速入门及详解

文章目录 1. MyBatis概述2. MyBatis快速入门2.1 创建项目2.2 添加依赖2.3 数据准备2.4 编写代码2.4.1 编写核心配置文件2.4.2 编写SQL映射文件2.4.3 编写Java代码 3. Mapper代理开发4. MyBatis核心配置文件5. 案例练习5.1 数据准备5.2 查询数据5.2.1 查询所有数据5.2.2 查询单条…

Cisco ISR 4000 Series IOS XE Release IOSXE-17.13.1a ED

Cisco ISR 4000 Series IOS XE Release IOSXE-17.13.1a ED 思科 4000 系列集成服务路由器系统软件 请访问原文链接&#xff1a;https://sysin.org/blog/cisco-isr-4000/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org 无耻抄…

Redis数据结构的基础插入操作

数据结构与内部编码 Redis常见的数据结构 数据结构和内部编码 数据结构的插入操作 在Redis中&#xff0c;数据结构的插入操作取决于你要插入的数据类型。以下是一些常见的数据结构和它们的插入操作&#xff1a; 字符串 (String)&#xff1a;使用 SET 命令来插入字符串。例…

yolov5+关键点检测实现溺水检测与警报提示(代码+原理)

往期热门博客项目回顾&#xff1a; 计算机视觉项目大集合 改进的yolo目标检测-测距测速 路径规划算法 图像去雨去雾目标检测测距项目 交通标志识别项目 yolo系列-重磅yolov9界面-最新的yolo 姿态识别-3d姿态识别 深度学习小白学习路线 //正文开始&#xff01; 人…

小狐狸ChatGPT付费AI创作系统V2.8.0独立版 + H5端 + 小程序前端

狐狸GPT付费体验系统的开发基于国外很火的ChatGPT&#xff0c;这是一种基于人工智能技术的问答系统&#xff0c;可以实现智能回答用户提出的问题。相比传统的问答系统&#xff0c;ChatGPT可以更加准确地理解用户的意图&#xff0c;提供更加精准的答案。同时&#xff0c;小狐狸G…

Java算法之哈希算法

Java算法之哈希算法 哈希表 哈希表&#xff08;Hash Table&#xff09;&#xff0c;也称为散列表&#xff0c;是一种根据关键码值&#xff08;Key Value&#xff09;直接进行访问的数据结构。它通过哈希函数&#xff08;Hash Function&#xff09;将关键码值映射到哈希表中的…

【Linux实践室】Linux用户管理实战指南:用户权限切换操作详解

&#x1f308;个人主页&#xff1a;聆风吟_ &#x1f525;系列专栏&#xff1a;Linux实践室、网络奇遇记 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 一. ⛳️任务描述二. ⛳️相关知识2.1 &#x1f514;图形化界面登录2.2 &#x1f514;使用login…

Collection与数据结构 链表与LinkedList (一):链表概述与单向无头非循环链表实现

1.ArrayList的缺点 上篇文章我们已经对顺序表进行了实现,并且对ArrayList进行了使用,我们知道ArrayList底层是使用数组实现的. 由于其底层是一段连续空间&#xff0c;当在ArrayList任意位置插入或者删除元素时&#xff0c;就需要将后序元素整体往前或者往后搬移&#xff0c;时…

mysql 条件/系统/加密/其它函数

学习了日期时间函数&#xff0c;接着学习条件、系统、加密和其它函数。 3&#xff0c;条件判断函数 条件判断函数也称为控制流程函数&#xff0c;根据满足的条件的不同&#xff0c;执行相应的流程。MySQL中进行条件判断的函数有IF、IFNULL和 CASE。 函数 说明 IF(expr,v1,v2…

二叉树寻找祖先问题-算法通关村

二叉树寻找祖先问题-算法通关村 1 最近公共祖先问题 LeetCode236&#xff1a;给定一个二叉树&#xff0c;找到该树中两个指定节点的最近公共祖先。 最近公共祖先的定义为&#xff1a;“对于有根树T 的两个节点 p、q&#xff0c;最近公共祖先表示为一个节点 x&#xff0c;满足是…

代码随想录笔记|C++数据结构与算法学习笔记-动态规划(〇)|

本文是简单的视频总结&#xff1a;从此再也不怕动态规划了&#xff0c;动态规划解题方法论大曝光 &#xff01;详细信息还请看代码随想录讲解视频 文章目录 动态规划的常见类型动态规划的误区动规五步曲DP数组以及下标的含义递推公式DP数组如何初始化DP数组遍历顺序打印DP数组…

GeoLite2 geoip数据库下载和使用

GeoLite2 数据库是免费的 IP 地理定位数据库&#xff0c;与MaxMind 的 GeoIP2 数据库相当&#xff0c;但准确度较低 。GeoLite2 国家、城市和 ASN 数据库 每周更新两次&#xff0c;即每周二和周五。GeoLite2 数据还可作为 GeoLite2 Country 和 GeoLite2 City Web 服务中的 Web …

Kotlin 中的类和构造方法

Kotlin 中的类与接口和 Java 中的类与接口还是有区别的。例如&#xff0c;Koltin 中的接口可以包含属性声明&#xff0c;与 Java 不同的是。Kotlin 的声明默认是 final 和 public 的。此外&#xff0c;嵌套的类默认并不是内部类&#xff1a;它们并没有包含对其它外部类的隐式引…

实施阶段(2024年3月)

【项目活动1】需求分析 学生&#xff1a;在系统中可以账号登陆&#xff0c;查看今日菜谱&#xff0c;点餐反馈。 食堂管理人员&#xff1a;对原始数据整合&#xff0c;显示菜品结果统计&#xff0c;并根据统计结果对菜品供应量进行调整反馈&#xff0c;避免浪费。 【项目活动…

MySQL开窗函数

测试环境&#xff1a;mysql8.0.18 官方文档&#xff1a;https://dev.mysql.com/doc/refman/8.0/en/window-functions.html 一、窗口函数介绍二、语法结构三、自定义窗口1.rows&#xff08;重点&#xff09;2.range3.默认窗口 四、常用窗口函数示例1.row_number & rank &…

C++之红黑树插入+查找功能实例(二百六十三)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…