MFC对话框绘制灰度直方图

基于https://blog.csdn.net/ywxk1314/article/details/81170666,实际操作时由于VS版本差别很大,以及C++没怎么用过,MFC也不太会,被逼无奈穷途末路,走了很多弯路,故基于实际操作,总结于本文,使用VS2017。

原理

原理部分省略,只写操作。

程序实现

一、对话框的建立

VS有几个视图,功能不同,对话框、菜单等在资源视图中打开。
在这里插入图片描述
(但是对VS太不熟悉,连资源视图怎么打开都要找上一会)
在这里插入图片描述
打开方式:视图->其他窗口->资源视图
然后Dialog->插入dialog就可以创建一个新的对话框,于是我们就得到了一个空的对话框,除了确定和取消之外什么也没有,为了添加构件,需要打开视图->工具箱。
为了画图,我们用Picture Control
在这里插入图片描述
为了显示文字,则用Static Text
在这里插入图片描述
在它们的属性中,ID项时用于标识这些构件的,就像变量名。
在这里插入图片描述
布局、大小都可以拖动,根据需要自己调整,这里就不上图了。
对话框模板空白处双击创建一个新类,就是这个对话框的类,也要取一个名字。
在这里插入图片描述
接下来在类向导中为这个类新建变量(类名一定要选对):
在这里插入图片描述
我们可以为控件添加对应的成员变量,这里只为Static Text添加,但是这里类别默认设为控件,要改成值,后续我们更改这个成员变量,就可以改变显示的文字。变量类型为CString,名字自己取。
在这里插入图片描述
主程序的头文件里记得include这个类的头文件。#include “*****.h”
为了在菜单栏里能够打开这个对话框,还要对菜单栏进行设置。
资源视图->Menu->IDR_MAINFRAME
添加菜单项的操作一看就能懂,省略。
同样要在属性里改一下ID。(其实不改也可以,但是改一个有意义的ID较为方便使用)
在这里插入图片描述
然后右键->添加事件处理程序
在这里插入图片描述
类列表里选择主类(这里不知道怎么表达,核心的画图的那个类?)
然后会生成代码:
在这里插入图片描述
要修改显示的文字就在这里添加代码,修改前面添加的成员变量就可以。

二、画图

打开类向导,在消息中添加一个画图的处理程序(WM_PAINT),类名选择对话框的这个类(为了在对话框的坐标下画图):
在这里插入图片描述
然后添加自己的代码就可以画图了:
在这里插入图片描述
以下代码均源自参考博客https://blog.csdn.net/ywxk1314/article/details/81170666(还是挺好用的,自己使用时要注意修改控件ID)

//****************绘制原图直方图*********************//

void CImageZFTDlg::OnPaint()

{
   

CPaintDC dc(this); // device context for painting

 
// TODO: Add your message handler code here

 
/********************************************************************************/

/* 重点知识:(百度)

/* 如何在View.cpp中把一个变量的值传给其它对话框

/*

/* 错误一:在View.h中定义的pubic变量只能在View.cpp中用

/* 错误二:定义一个Struct.h中存全局变量,在2个函数中分别调用#include "Struct.h"

/*

/* 解决方法一: (CSDN 不会)参数用 A& a 两个对话框里都可以访问a

/* 解决方法二: (CSDN 不会)重载

/*

/* 解决:在View.cpp中定义全局变量 void CBmpDrawView::OnZftYt() 前面 并函数中操作

/* 在dialog的cpp中即void CTestZFTDlg::OnPaint()中在定义一个extern int a

/********************************************************************************/

 
extern int Red[256],Green[256],Blue[256];

 
/*写在该空间中可以省略Invalidate()语句*/

/*获取控件的CDC指针*/

CRect rectpic;

GetDlgItem(IDC_STATIC_KJ)->GetWindowRect(&rectpic);

 
int x,y;

x=rectpic.Width();

y=rectpic.Height();

 
CWnd *pWnd=GetDlgItem(IDC_STATIC_KJ);

CDC *pDC=pWnd->GetDC();

 
/***********************/

/*重点:画直方图 红色

/**********************/

CPen *RedPen=new CPen(); //创建画笔对象

RedPen->CreatePen(PS_SOLID,1,RGB(255,0,0)); //红色画笔

CGdiObject *RedOlderPen=pDC->SelectObject(RedPen); //选中当前红色画笔并保存以前的画笔

 
/*画图*/

pDC->Rectangle(9,16,312,147); //画一个矩形框

pDC->MoveTo(15,20); //绘制坐标轴

pDC->LineTo(15,128); //Y竖轴

pDC->LineTo(
  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值