MFC——我的第一个MFC_vs 创建mfc-程序员宅基地

技术标签: 学习  图像处理  MFC  mfc  microsoft  


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

一、“什么是MFC”

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

二、创建一个MFC

0.编译freeimage

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

1.在VS2022创建MFC

在VS2022启动页面选择创建新项目,然后进入新的页面选择”MFC应用“,然后设置项目名称及保存位置,最后对MFC的具体功能进行设置
在这里插入图片描述

2.编写代码前3步骤

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

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文件下即可,再次编译链接,得到如下结果图
在这里插入图片描述

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

  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中,
    在这里插入图片描述重写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”,在出现的窗口,“在此处键入”处输入菜单名字,然后在新跳出的具体功能栏输入新的具体功能名
    在这里插入图片描述
  2. 为具体功能栏赋予功能

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

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

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

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

最后验证打勾功能,如下:
在这里插入图片描述

为菜单栏添加快捷键

在这里插入图片描述

创建快捷按钮

在这里插入图片描述

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

在这里插入图片描述

鼠标左键绑定事件

在这里插入图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_45009947/article/details/127705688

智能推荐

Caused by: org.postgresql.util.PSQLException: 错误: 语法错误 在 “order“ 或附近的 位置:345_idea 报org.postgresql.util.psqlexception: :-程序员宅基地

文章浏览阅读2k次。此错误一般是由于postgres的数据库表字段名定义与关键字重名导致的错误;Missing the data source name: ‘null‘_idea 报org.postgresql.util.psqlexception: :

2021年有哪些能用的活体人物虚拟主播_免费虚拟角色男性主持人主播-程序员宅基地

文章浏览阅读1.6k次。新的一年刚刚开始,小编花费几天时间体验一把当前最前沿国内科技公司开发的虚拟人物产品。 还是先介绍一下什么是虚拟主播: 主播是一个比较抽象的概念,实际上可以理解成一个人物形象,它可以实现基本活人动作:眨眼摇头点头张口说话等。它不一定非要是在电视或者直播间的主持人。当前看来主要有卡通人物或者真实人物形象。而用途就比较广泛。例如:银行业务介绍工作人员,教育行业虚拟老师,电视媒体主持人,智能汽车虚拟助手,公共出行介绍导游,数字城市和智慧社区指引者。他们这些岗位中有一些是比较枯燥,内容单一而具有专业性,是完全可以由当_免费虚拟角色男性主持人主播

深度学习计算框架综述(十三)HVX 计算优化实践—Hexagon DSP简介_网络模型推理hvx cdsp-程序员宅基地

文章浏览阅读3.2k次,点赞2次,收藏15次。本节,我们主要介绍一下HexagonDSP的架构:_网络模型推理hvx cdsp

js获取文本高度和屏幕高度_js计算文字高度-程序员宅基地

文章浏览阅读4.8k次,点赞2次,收藏2次。网页可见区域宽: document.body.clientWidth 网页可见区域高: document.body.clientHeight 网页可见区域宽: document.body.offsetWidth (包括边线的宽) 网页可见区域高: document.body.offsetHeight (包括边线的高) 网页正文全文宽: document.body.scrollWidth ..._js计算文字高度

c语言的快速排序,C语言实现快速排序-程序员宅基地

文章浏览阅读162次。#include#include#include#define RANDOM(i) (rand()%i)#define N 15//划分函数int partion(int a[],int p,int r){int x = 0;int j;int i;int temp;i = p-1;x = a[r];for ( j = p; j <=r-1; j++){if (a[j] <= x..._使用快速排序实现输入数据的升序排列c语言

C#笔记-----串口类(异步发送,接收)_vs c# 串口非堵塞接收-程序员宅基地

文章浏览阅读3.7k次。using System;using System.Collections.Generic;using System.IO.Ports;using System.Linq;using System.Text;using System.Threading;using System.Threading.Tasks;using System.Windows.Forms;namespace WindowsFormsApp1{ class Comm { public..._vs c# 串口非堵塞接收

随便推点

Linux内核学习:EXT4 INode在磁盘上的读写-程序员宅基地

文章浏览阅读3.2k次,点赞2次,收藏8次。目录1 关于Ext4系统的一些概念1.1 Inode与Data Block1.2 关于上述概念的规律2 查找Inode在磁盘的位置2.1 关于Inode操作的数据结构2.2 Ext4在磁盘上Inode分配的策略分析2.3.1目录的Inode分配策略2.3.2文件的inode分配策略2.3 Inode分配情况2.3.1 磁盘块上的Inode分配3 ex..._ext4 inode

自动化测试实践总结-程序员宅基地

文章浏览阅读2.7k次,点赞6次,收藏22次。  引言  内容已经有了,但是标题想了很久,最终还是决定用这个。简单清楚明了——总结一场失败的自动化测试案例。  文笔欠佳,如有阅读不适,请见谅!  自动化测试  如今,软件测试行业里,人人都在讲自动化测试,人人都在做自动化测试。如果谁说自己不会自动化测试,都不好意思去面试。现在各大公司招聘信息都是必须会自动化测试,一部分公司招人只招测试开发。甚至有些大头公司都不分测试与开发两个..._自动化测试实践

同一局域网下自己能ping通别人,别人ping不通自己_局域网我可以ping a,a ping不了我-程序员宅基地

文章浏览阅读6.8k次,点赞2次,收藏2次。更改自己本地的网络状况为如下图所示:_局域网我可以ping a,a ping不了我

全网最全最细的PLSQL下载、安装、配置、使用指南、问题解答,相关问题已汇总-程序员宅基地

文章浏览阅读2.6w次,点赞92次,收藏401次。双击之后,这里选择安装目录,你安装目录选的哪里,这里就填哪里。后面点下去就可以,弄好之后重新打开PLSQL,就已经是中文界面了。对没有语言包的PLSQL可以直接在软件里面调,有语言包的下载Chinese语言安装包。我下载的是有语言包的,但是怎么配置,我看了其它博主的教学,也不难,找到地方就行。大家都有自己熟悉的快捷键设置,只要不冲突就行,其它快捷键可自行摸索。这个感觉还是有必要的,每次登录都不需要再输口令了,勾选带口令存储。就我个人而言,全屏模式挺友好的,原始界面看着太小,使用起来会眼花。........._plsql下载

OpenGL之纹理过滤的四种方式_opengl 纹理滤波-程序员宅基地

文章浏览阅读8.3k次。I.纹理过滤:当三维空间里面的多边形经过坐标变换、投影、光栅化等过程,变成二维屏幕上的一组象素的时候,对每个象素需要到相应纹理图像中进行采样,这个过程就称为纹理过滤。II.纹理过滤通常分为2种情况:a) 纹理被缩小 GL_TEXTURE_MIN_FILTER 比如说一个8 x 8的纹理贴到一个平行于xy平面的正方形上,最后该正方形在屏幕上只占4 x 4的象素矩阵,这种情况下一个象素对应着多个纹理单元。b) 纹理被_opengl 纹理滤波

LeetCode 119. Pascal's Triangle II(杨辉三角II) -- c语言_力扣119. 杨辉三角|| c语言具体思路-程序员宅基地

文章浏览阅读313次。119. Pascal's Triangle IIGiven a non-negativeindexkwherek≤33, return thekthindex row of the Pascal's triangle.Note that the row index starts from0.In Pascal's triangle, each number is ..._力扣119. 杨辉三角|| c语言具体思路

推荐文章

热门文章

相关标签