基于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(