MFC——我的第一个MFC

这篇具有很好参考价值的文章主要介绍了MFC——我的第一个MFC。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


我的第一个MFC是在图像软件设计课程中创建的,使用Visual Studio 2022软件,基于C++语言,依赖freeimage图像库,实现在窗口应用中对一幅图像进行各种处理功能(如中值滤波等)

一、“什么是MFC”

  1. 微软基础类库(Microsoft Foundation Classes,简称MFC)是微软公司提供的一个类库,以C++类的形式封装了Windows API
  2. MFC是一个框架,在Visual Studio里新建一个MFC的工程,开发环境会自动帮你生成许多文件

二、创建一个MFC

0.编译freeimage

下载freeimage,
MFC——我的第一个MFC
解压压缩包,使用VS2022打开FreeImage.2017.sln,
MFC——我的第一个MFC
选择debug、x64,菜单栏点击生成解决方案,等待完成后找到FreeImage和FreeImagePlus的h、lib、dll文件,
MFC——我的第一个MFC
MFC——我的第一个MFC
将这些文件拷贝到新建文件夹FreeImage_x64中的h、lib文件夹内,以h结尾的放到h文件夹,其余放到lib中。
一般将FreeImage_x64文件夹放到解决方案所在目录下,这样添加附加依赖项和附加库时,只需要填写相对路径即可。
MFC——我的第一个MFC

1.在VS2022创建MFC

在VS2022启动页面选择创建新项目,然后进入新的页面选择”MFC应用“,然后设置项目名称及保存位置,最后对MFC的具体功能进行设置
MFC——我的第一个MFC

2.编写代码前3步骤

  1. 设置启动项
    因为1个解决方案可以包含多个项目,但启动项只能是1个,也就是只能对1个项目进行编译链接操作
    MFC——我的第一个MFC
  2. 修改属性——字符集、附加包含目录、附加库目录
    在不同的配置(release、debug)和平台(x64、x86)下,属性是不同步的,我的MFC窗口是在debug、x86情况下编译和链接的,因此需要确保属性页面上方的配置和平台一致。
    MFC——我的第一个MFC

3.编辑代码

编辑pch.h

在pch.h将头文件包含进来

#include "scuimage.h"

编辑doc.h

在doc.h中Doc类的pulic下,创建一个变量

SCU::CImage* m_pImg;

编辑doc.cpp

在doc.cpp中定义析构函数和构造函数、MFC窗口初始化界面

  1. 析构函数
m_pImg = NULL;
  1. 析构函数
if (m_pImg != NULL)
	delete m_pImg;
  1. 初始化界面
    如果想让MFC一运行就显示一幅图,则可以在OnNewDocument()添加代码
BOOL CMyfreeImage1105Doc::OnNewDocument()
{
	if (!CDocument::OnNewDocument())
		return FALSE;

	// TODO: 在此添加重新初始化代码
	// (SDI 文档将重用该文档)
	m_pImg = new SCU::CImage;
	m_pImg->Create(640, 480, 24);
	return TRUE;
}
  1. 取消初始化
    当然,可以在App(即解决方案名.cpp)程序中的InitInstance()函数定义内123行左右,添加如下代码,取消程序自动打开doc.cpp中OnNewDocument()函数创造的图。
	// 分析标准 shell 命令、DDE、打开文件操作的命令行
	CCommandLineInfo cmdInfo;
	//ParseCommandLine(cmdInfo);
	cmdInfo.m_nShellCommand = CCommandLineInfo::FileNothing;

编译链接

到了这一步已经可以编译链接了,点击三角按钮,弹出缺少FreeImagePlus.ll,我们将附加依赖库目录下的FreeImagePlus.ll、FreeImage.ll加入到解决方案所在目录下的Debug文件下即可,再次编译链接,得到如下结果图
MFC——我的第一个MFC

增加绘图、滑动轴、打开、保存图片的功能

  1. 绘图、滑动轴
    在view.cpp中定义MFC窗口绘图(OnDraw函数)、滑动轴(OnInitialUpdate)的功能。

OnDraw():
函数对应用程序窗口的客户区进行绘图。为了使该函数有效,先将参数入口中被屏蔽掉(注释掉)的pDC恢复出来;然后发现pDoc是一个Doc类实例的一个指针,因此通过该pDoc指针可以调用我们在Doc类中定义的成员变量m_pImg;又因为m_pImg是Cimage类实例的一个指针。

void CMyfreeImage1105View::OnDraw(CDC* pDC)
{
	CMyfreeImage1105Doc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	if (!pDoc)
		return;
	// TODO: 在此处为本机数据添加绘制代码
	pDoc->m_pImg->Draw(pDC, CPoint(0, 0));
}

OnInitialUpdate():
框架在第一次调用OnDraw前会调用OnInitialUpdate,因此OnInitialUpdate是设置滚动视图的逻辑尺寸和映射模式的最适合的地方。

void CMyfreeImage1105View::OnInitialUpdate()
{
	CScrollView::OnInitialUpdate();

	CSize sizeTotal;
	// TODO: 计算此视图的合计大小
	//sizeTotal.cx = sizeTotal.cy = 100;
	GetDocument()->m_pImg->GetRealizeSize(sizeTotal);
	SetScrollSizes(MM_TEXT, sizeTotal);
}
  1. 打开、保存
    在doc类试图下,选择重写,添加OnOpenDocument、OnSaveDocument函数到doc.cpp中,
    MFC——我的第一个MFC重写OnOpenDocument()
BOOL CMyfreeImage1105Doc::OnOpenDocument(LPCTSTR lpszPathName)
{
	if (!CDocument::OnOpenDocument(lpszPathName))
		return FALSE;

	// TODO:  在此添加您专用的创建代码
	m_pImg = new SCU::CImage;
	m_pImg->Load(lpszPathName);
	return TRUE;
}

重写OnSaveDocument()

BOOL CMyfreeImage1105Doc::OnSaveDocument(LPCTSTR lpszPathName)
{
	// TODO: 在此添加专用代码和/或调用基类

	//return CDocument::OnSaveDocument(lpszPathName);
	m_pImg->Save(lpszPathName);

	return CDocument::OnSaveDocument(lpszPathName);
}

增添菜单栏并为该栏赋予功能

  1. 添加菜单栏
    在资源视图中,点击menu,鼠标双击“IDR_解决方案名TYPE”,在出现的窗口,“在此处键入”处输入菜单名字,然后在新跳出的具体功能栏输入新的具体功能名
    MFC——我的第一个MFC
  2. 为具体功能栏赋予功能

在view的类试图,找到事件,然后找到具体功能栏对应的标识符(本文为ID_green),点击添加代码,最后就会在view.cpp中创建该标识符对应的代码编辑区
MFC——我的第一个MFC
然后,在该标识符所在代码区编写代码,实现具体功能。
比如,我想让图片变绿,代码例子如下:

void CMyFirstMFC1111View::Ongreen()
{
	// TODO: 在此添加命令处理程序代码
	GetDocument()->m_pImg->SetShowBank(SCU::CI_GREEN);
	Invalidate(FALSE);
}

最后进行编译链接,验证功能
MFC——我的第一个MFC
当添加多个具体功能栏时,会出现不知道图片运行的是哪个功能栏,因此可以在栏中“打勾”的方式显示当前运行的功能栏。
为了实现“打勾”,要在view类视图事件,所有具体功能栏都添加onUpdatexxx()函数,然后再函数内添加代码,如下:
MFC——我的第一个MFC

pCmdUI->SetCheck(GetDocument()->m_pImg->GetShowBank() == SCU::CI_GREEN);
//其中CI_GREEN为标识符,要修改成对应具体功能栏对应的标识符

最后验证打勾功能,如下:
MFC——我的第一个MFC

为菜单栏添加快捷键

MFC——我的第一个MFC

创建快捷按钮

MFC——我的第一个MFC

菜单栏的功能栏之间添加横线

MFC——我的第一个MFC

鼠标左键绑定事件

MFC——我的第一个MFC文章来源地址https://www.toymoban.com/news/detail-455919.html

到了这里,关于MFC——我的第一个MFC的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • VLLO - 我的第一个视频编辑器Vlog

    ​ ​【应用名称】:VLLO - 我的第一个视频编辑器Vlog ​【适用平台】:#Android   ​【软件标签】:#VLLO ​【应用版本】:9.0.20 ​【应用大小】:180MB ​【软件说明】:VLLO 是一款非常简单的视频编辑器。初學者和一般使用者也能享受剪輯、添加字幕、加入背景音樂與轉場效果

    2024年01月19日
    浏览(54)
  • 我的第一个项目(十四) :完成数据保存功能(前端,增查改接口)

    好家伙,天天拖,终于写完了   代码已开源(Gitee) PH-planewar: 个人开发的全栈小游戏 前端:vue2 + element-ui 后端: Springboot + mybatis-plus 数据库: mysql 目前实现功能: 1.注册登陆 2.游戏数据保存 3.游戏运行 (gitee.com) (前后端放一起了) 怎么说呢,感觉比较简洁,但是问题不大 实现了分数保存的

    2024年02月06日
    浏览(29)
  • 我的第一个后端项目(环境搭建,Springboot项目,运行,接口验证)

    访问Java Software | OracleOracle官方网站,下载适合你操作系统的最新版本的JDK。安装JDK并设置好JAVA_HOME环境变量。 推荐使用IntelliJ IDEA作为IDE。你可以从官方网站(IntelliJ IDEA – the Leading Java and Kotlin IDE)下载适合你操作系统的版本,并根据安装向导进行安装。最新2023.2版本需要注

    2024年02月15日
    浏览(31)
  • 我的第一个项目(十一) :飞机大战分包完成(简单阐述分包思路以及过程)

    好家伙,   代码已开源 Git: https://gitee.com/tang-and-han-dynasties/panghu-planebattle-esm.git NPM: panghu-planebattle-esm - npm (npmjs.com)   现在,比如说,我用Vue写好了个人博客主页的前端 我想在这个主页里面加点东西,让我的博客更缤纷多彩一点 我想在他的主页里面塞个小游戏,他会怎么做   如下

    2023年04月18日
    浏览(27)
  • 猿创征文|Python-sklearn机器学习之旅:我的第一个机器学习实战项目

    目录 前言 一、从目的出发 1.导入数据 二、项目开启 1.导入数据

    2024年01月24日
    浏览(39)
  • 【Python数据科学 | 11】应用实战:我的第一个开源项目-基金定投回测工具

    这是机器未来的第60篇文章 原文首发地址:https://robotsfutures.blog.csdn.net/article/details/127712752 【Python数据科学快速入门系列 | 01】Numpy初窥——基础概念 【Python数据科学快速入门系列 | 02】创建ndarray对象的十多种方法 【Python数据科学快速入门系列 | 03】玩转数据摘取:Numpy的索引

    2024年02月02日
    浏览(26)
  • 我的第一个NPM包:panghu-planebattle-esm(胖虎飞机大战)使用说明

    好家伙,我的包终于开发完啦   欢迎使用胖虎的飞机大战包!! 为你的主页添加色彩 这是一个有趣的网页小游戏包,使用canvas和js开发 使用ES6模块化开发 效果图如下:  (觉得图片太sb的可以自己改) 代码已开源!! Git: https://gitee.com/tang-and-han-dynasties/panghu-planebattle-esm.git NPM: panghu-pla

    2023年04月19日
    浏览(30)
  • 我的第一个项目(十二) :分数和生命值的更新(后端增删查改的"改")

    好家伙,写后端,这多是一件美逝. 关于这个项目的代码前面的博客有写  我的第一个独立项目 - 随笔分类 - 养肥胖虎 - 博客园 (cnblogs.com)   现在,我们登陆进去了,我开始和敌人战斗,诶,打到一百分了,我现在要把这个分数保存起来      随便写一个测试样例    (确实是非常朴实无

    2024年02月01日
    浏览(32)
  • 【C快学-C语言程序设计(基础篇)】从VSCode中使用C编写我的第一个Hello world

    简介:本专栏是一个C语言基础入门知识学习的一个专栏 面向:广大C友 工具:VSCODE 博主:一个友好且宠粉的博主,送书活动小专栏,不定期抽奖送图书给粉丝 社区:🦈山鱼社区 我这里是使用超级强大的vscode来进行C语言的学习的,因为vscode有着许多好用且方便的插件,能够

    2024年02月13日
    浏览(30)
  • 【图像处理】经营您的第一个U-Net以进行图像分割

            AI厨师们,今天您将学习如何准备计算机视觉中最重要的食谱之一:U-Net。本文将叙述:1 语义与实例分割,2 图像分割中还使用了其他损失,例如Jaccard损失,焦点损失;3 如果2D图像分割对您来说太容易了,您可以查看3D图像分割,因为模型要大得多,因此要困难得

    2024年02月15日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包