【数字图像处理】四.MFC对话框绘制灰度直方图

2023-10-27

        本文主要讲述基于VC++6.0 MFC图像处理的应用知识,主要结合自己大三所学课程《数字图像处理》及课件进行回忆讲解,主要通过MFC单文档视图实现点击弹出对话框绘制BMP图片的灰度直方图,再获取平均灰度、中指灰度和标准差等值。文章比较详细基础,希望该篇文章对你有所帮助~
       【数字图像处理】一.MFC详解显示BMP格式图片
       【数字图像处理】二.MFC单文档分割窗口显示图片
       【数字图像处理】三.MFC实现图像灰度、采样和量化功能详解
        
免费资源下载地址:
        http://download.csdn.net/detail/eastmount/8757243


一. 程序运行结果

        该篇文章主要是在上一篇文章基础上进行的讲解,其中当打开一张BMP图像后,点击”直方图“-》”显示原图直方图“如下。


二. 灰度直方图原理

        什么是灰度直方图?
        灰度直方图(histogram)是灰度级的函数,描述的是图像中每种灰度级像素的个数,反映图像中每种灰度出现的频率。横坐标是灰度级,纵坐标是灰度级出现的频率。


        对于连续图像,平滑地从中心的高灰度级变化到边缘的低灰度级。直方图定义为:

        其中A(D)为阈值面积函数:为一幅连续图像中被具有灰度级D的所有轮廓线所包围的面积。 对于离散函数,固定ΔD为1,则:H(D)=A(D)-A(D+1)
        色彩直方图是高维直方图的特例,它统计色彩的出现频率,即色彩概率分布信息。
        通常这需要一定的量化过程,将色彩分成若干互不重叠的种类。一般不直接在RGB色彩空间中统计,而是在将亮度分离出来后,对代表色彩部分的信息进行统计,如在HSI空间的HS子空间、YUV空间的UV子空间,以及其它反映人类视觉特点的彩色空间表示中进行。
        其中直方图的计算方法如下:
        依据定义,若图像具有L(通常L=256,即8位灰度级)级灰度,则大小为MxN的灰度图像f(x,y)的灰度直方图hist[0…L-1]可用如下计算获得。
        1、初始化 hist[k]=0; k=0,…,L-1 
        2、统计 hist[f(x,y)]++; x=0,…,M-1, y =0,…,N-1 
        3、归一化 hist[f(x,y)]/=M*N 

        那么说了这么多,直方图究竟有什么作用呢?
        在使用轮廓线确定物体边界时,通过直方图更好的选择边界阈值,进行阈值化处理;对物体与背景有较强对比的景物的分割特别有用;简单物体的面积和综合光密度IOD可以通过图像的直方图求得。

三. 程序实现

1.建立直方图对话框

       第一步:创建Dialog
        将视图切换到ResourceView界面,选中Dialog右键鼠标新建一个Dialog,并新建一个名为IDD_DIALOG_ZFT,设置成下图对话框。


        右键添加属性如下:
        对话框-原始直方图-IDD_DIALOG_ZFT
        组框-RGB-IDC_STATIC_RGB
        图像-框架-IDC_STATIC_KJ-蚀刻(重点:有它才能添加直方图在此处,注意GetDlgItem()函数中是IDC而不是IDD对话框)
        添加蚀刻线(图像蚀刻形成的直线)形如图中的3个矩形框,并添加静态文本:Red、Green、Blue、红、绿、蓝、像素、平均灰度、中值灰度、标准差;这些静态文本都是IDC_STATIC且为默认属性
        添加红色4个值(Static)、绿色4个值、蓝色4个值,分别为:
        IDC_STATIC_XS_RED(GREEN BLUE)对应像素XS
        IDC_STATIC_PJHD_RED(GREEN BLUE)对应平均灰度PJHD
        IDC_STATIC_ZZHD_RED(GREED BLUE)对应中值灰度ZZHD
        IDC_STATIC_BZC_RED(GREEN BLUE)对应标准差BZC

       第二步:建立类向导MFC ClassWizard
        (1) 在对话框资源模板空白区双击鼠标(Ctrl+W),创建一个新类,命名为CImageZFTDlg会自动生成它的.h和.cpp文件。在类向导中选中类名CImageZFTDlg,IDs为CImageZFTDlg,WM_INITDIALOG建立这个函数用于初始化。
        (2) 打开类向导,选择Member Variables页面,添加如下变量,类型均为CString。
        像素 m_redXS、m_greenXS、m_blueXS
        标准差 m_redBZC、m_greeenBZC、m_blueBZC
        平均灰度 m_redPJHD、m_greenPJHD、m_bluePJHD
        中值灰度 m_redZZHD、m_greenZZHD、m_blueZZHD

        (3) 在View.cpp中添加直方图的头文件 #include "ImageZFTDlg.h"

        第三步:设置菜单栏调用直方图对话框
        (1) 将视图切换到ResourceView界面,选中Menu,在IDR_MAINFRAM中添加菜单项“直方图”,菜单属性中选择“弹出”,在“直方图”中添加子菜单“显示原图直方图”。
        (2) 设置其属性为ID_ZFT_YT(显示直方图原图),同时建立类向导,选择ID_ZFT_YT(IDs),通过COMMAND建立显示直方图函数OnZftYt()。


       第四步:添加代码及计算4个值
        在ImageProcessingView.cpp中添加如下代码,注释中有如何求平均灰度、中值灰度和标准差的消息算法过程。
//引用显示直方图头文件
#include "ImageZFTDlg.h"
#include "math.h"

/*全局变量在TestZFTDlg.cpp中引用 用extern*/
int Red[256],Green[256],Blue[256];

/**************************************************/
/* 添加直方图显示功能,并在直方图下方显示相关信息 
/* 如平均灰度、中值灰度、标准差和像素总数         
/* ID_ZFT_YT:直方图原图显示                       
/**************************************************/
void CImageProcessingView::OnZftYt() 
{
	if(numPicture==0) {
		AfxMessageBox("载入图片后才能显示原图直方图!",MB_OK,0);
		return;
	}
	AfxMessageBox("显示原图直方图!",MB_OK,0);
	CImageZFTDlg dlg;

	//打开临时的图片
	FILE *fpo = fopen(BmpName,"rb");
	fread(&bfh,sizeof(BITMAPFILEHEADER),1,fpo);
	fread(&bih,sizeof(BITMAPINFOHEADER),1,fpo);
	
	int i,j;
	for(j=0;j<256;j++) { //定义数组并清零
		Red[j]=0;
		Green[j]=0;
		Blue[j]=0;
	}
	
	//计算4个数据
	unsigned char red,green,blue;
	int IntRed,IntGreen,IntBlue;                  //强制转换
	double sumRedHD=0,sumGreenHD=0,sumBlueHD=0;   //记录像素总的灰度值和
	for(i=0; i<m_nImage/3; i++ ) 
	{
		fread(&red,sizeof(char),1,fpo);
		IntRed=int(red);
		sumRedHD=sumRedHD+IntRed;
		if( IntRed>=0 && IntRed<256 ) Red[IntRed]++; //像素0-255之间
		
		fread(&green,sizeof(char),1,fpo);
		IntGreen=int(green);
		sumGreenHD=sumGreenHD+IntGreen;
		if( IntGreen>=0 && IntGreen<256 ) Green[IntGreen]++;
		
		fread(&blue,sizeof(char),1,fpo);
		IntBlue=int(blue);
		sumBlueHD=sumBlueHD+IntBlue;
		if( IntBlue>=0 && IntBlue<256 ) Blue[IntBlue]++;
	}
	fclose(fpo);
	
	//像素:int型转换为CString型 
	dlg.m_redXS.Format("%d",m_nImage);
	dlg.m_greenXS.Format("%d",m_nImage);
	dlg.m_blueXS.Format("%d",m_nImage);
	
	//平均灰度值:计算24位bmp图片的灰度值,我是记录RGB中的所有平均值	
	float pinRedHD,pinGreenHD,pinBlueHD; 
	pinRedHD=sumRedHD*3/m_nImage;
	pinGreenHD=sumGreenHD*3/m_nImage;     //平均灰度=总灰度/总像素
	pinBlueHD=sumBlueHD*3/m_nImage;
	
	dlg.m_redPJHD.Format("%.2f",pinRedHD);
	dlg.m_greenPJHD.Format("%.2f",pinGreenHD);
	dlg.m_bluePJHD.Format("%.2f",pinBlueHD);
	
	/****************************************************************/
	/* 中值灰度:算法重点(黄凯大神提供)                              
	/* 中值灰度:所有像素中的中位数,应该所有像素排序找到中间的灰度值 
	/* 算法:num[256]记录各灰度出现次数,sum+=num[i],找到sum=总像素/2 
	/****************************************************************/
	int sumRedZZHD=0,sumGreenZZHD=0,sumBlueZZHD=0;
	int redZZHD,greenZZHD,blueZZHD;
	for(i=0;i<256;i++)
	{
		sumRedZZHD=sumRedZZHD+Red[i];
		if(sumRedZZHD>=m_nImage/6)          //m_nImage被分成3份RGB并且sum=总像素/2
		{
			redZZHD=i;
			break;
		}
	}
	for(i=0;i<256;i++)
	{
		sumGreenZZHD=sumGreenZZHD+Green[i];
		if(sumGreenZZHD>=m_nImage/6)          //m_nImage被分成3份RGB并且sum=总像素/2
		{
			greenZZHD=i;
			break;
		}
	}
	for(i=0;i<256;i++)
	{
		sumBlueZZHD=sumBlueZZHD+Blue[i];
		if(sumBlueZZHD>=m_nImage/6)          //m_nImage被分成3份RGB并且sum=总像素/2
		{
			blueZZHD=i;
			break;
		}
	}
	
	dlg.m_redZZHD.Format("%d",redZZHD);
	dlg.m_greenZZHD.Format("%d",greenZZHD);
	dlg.m_blueZZHD.Format("%d",blueZZHD);
	
	/******************************************************************/
	/*标准差:标准差=方差的算术平方根                                   
	/*       方差s^2=[(x1-x)^2+(x2-x)^2+......(xn-x)^2]/n             
	/* 算法:不用开m_nImage数组进行计算 用num[256]中数进行             
	/* 方差=(平均灰度-i)*(平均灰度-i)*Red[i]  有Red[i]个灰度值为i的数 
	/******************************************************************/
	float redBZC,greenBZC,blueBZC;       //标准差
	double redFC=0,greenFC=0,blueFC=0;    //方差
	for(i=0;i<256;i++)
	{
		redFC=redFC+(pinRedHD-i)*(pinRedHD-i)*Red[i];   //有Red[i]个像素i
		greenFC=greenFC+(pinGreenHD-i)*(pinGreenHD-i)*Green[i];
		blueFC=blueFC+(pinBlueHD-i)*(pinBlueHD-i)*Blue[i];
	}
	
	redBZC=sqrt(redFC*3/m_nImage);
	greenBZC=sqrt(greenFC*3/m_nImage);
	blueBZC=sqrt(blueFC*3/m_nImage);
	
	dlg.m_redBZC.Format("%.2lf",redBZC);
	dlg.m_greenBZC.Format("%.2lf",greenBZC);
	dlg.m_blueBZC.Format("%.2lf",blueBZC);	

	//重点必须添加该语句才能弹出对话框
	if(dlg.DoModal()==IDOK)
	{

	}
}
        第五步:此时运行结果如下图所示,打开图片可以显示参数。

2.建立对话框与View联系并绘制直方图

        重点(极其重要*)
        (1) 如何在MFC中(View中)实现对子对话框的画图或直方图响应?
        解决方法:在子对话框中.cpp文件中实现画图响应,不要再View.cpp中实现,否则图像会以menu背景为坐标,而在ImageZFTDlg.cpp中建立OnPaint函数实现画图,它默认会以子对话框为标准。
        (2) 如何把View.cpp中的图片像素直方图信息传递给子对话框ImageZFTDlg.cpp呢?
        解决方法:如果自定义ImageStruct.h中建立全局变量,每个.cpp中引用该头文件调用总是报错(未知),所以我在View.h中建立一个全局变量int Red[256];再在子文件.cpp中函数里调用该全局变量即可extern int Red[256],这是非常重要的一个C语言知识。
        (3) 画图函数OnPaint()参考源代码中详细注释。
        如何绘制坐标轴、文字、图像,其实自己绘制而没调用第三方库还是挺有意思的。

        第一步:建立画直方图函数OnPaint
        打开类向导(Ctrl+W),类名选择CImageZFTDlg,IDs选择CImageZFTDlg,在Message函数中建立WM_PAINT映射,默认函数名为OnPaint建立函数void CImageZFTDlg::OnPaint()

        第二步:绘制直方图大致思想如下
        (1) 重点:获取要绘制直方图的位置和图像资源的对应号ID(IDC_STATIC_KJ 框架),我当时认为绘制直方图只能绘制到”图像“控件IDC中,不能是对话框IDD。
        CWnd *pWnd = GetDlgItem(IDC_STATIC_KJ);
        CDC *pDC = pWnd->GetDC();

        (2) 获取对话框矩形的长和宽
        CRect rectpic;
        GetDlgItem(IDC_STATIC_KJ)->GetWindowRect(&rectpic);

        (3) 创建画笔对象并对画笔进行颜色设置
        CPen *RedPen = new CPen();
        RedPen->CreatePen(PS_SOLID,1RGB(255,0,0));

        (4) 选中当前画笔并保存以前画笔
        CGdiObject *RedOlderPen = pDC->SelectObject(RedPen);
        (5) 绘制直方图(图像坐标自己算)
        矩形 pDC->Rectangle(9,327,312,468);
        移动 pDC->MoveTo(15,331);
        直线 pDC->LineTo(15,488);
        文字 pDC->TextOut(15+48*i,450,str);

        (6) 恢复以前画笔
        pDC->SelectObject(RedOlderPen);
        delete RedPen;
        ReleaseDC(pDC);


        第三步:源代码与详细注释思想
        在ImageZFTDlg.cpp中修改OnPaint函数:
//****************绘制原图直方图*********************//
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(305,128);              //X横轴
	
	pDC->MoveTo(305,128);              //绘制X箭头
	pDC->LineTo(300,123);              //绘制上边箭头
	pDC->MoveTo(305,128); 
	pDC->LineTo(300,133);              //绘制下边箭头
	
	pDC->MoveTo(15,20);                //绘制Y箭头
	pDC->LineTo(10,25);                //绘制左边箭头
	pDC->MoveTo(15,20);
	pDC->LineTo(20,25);                //绘制右边箭头
	
	/**********************************************************************/
	/* TextOut函数功能:                                                   
	/* 该函数用当前选择的字体、背景颜色和正文颜色将一个字符串写到指定位置 
	/* BOOL TextOut(HDC hdc,int x,int y,LPCTSTR str,int numStr)           
	/* 表示:x起始坐标,y起始坐标,字符串,字符串中字符个数                   
	/*
	/* SetTextColor函数功能:                                              
	/* 设置指定设备环境(HDC)的字体颜色                                    
	/* SetTextColor (HDC, COLORREF) 如:SetTextColor(HDC,RGB(255,0,0));    
	/**********************************************************************/
	
	CString str;
	int i;
	for(i=0;i<=5;i++)                    //写X轴刻度线
	{
		str.Format("%d",i*50);               //0-255之间添加6个刻度值
		pDC->SetTextColor(RGB(255,0,255));   //设置字体颜色
		pDC->TextOut(15+48*i,130,str);       //输出字体
		pDC->MoveTo(15+48*i,128);            //绘制X轴刻度
		pDC->LineTo(15+48*i,125);
	}
	for(i=0;i<=5;i++)                        //写Y轴刻度线
	{
		pDC->MoveTo(15,128-20*i);            //绘制Y轴刻度
		pDC->LineTo(18,128-20*i);
	}
	
	/*绘制直方图主要的代码*/
	for(i=1;i<256;i++)
	{
		pDC->MoveTo(15+i,128);
		if( (128-16) > (Red[i]/40) )
			pDC->LineTo(15+i,128-(Red[i]/40));   
		else
			pDC->LineTo(15+i,16);            //超过矩形的画矩形高
	}
		

	/**********************/
	/*重点:画直方图 绿色
	/**********************/
	CPen *GreenPen=new CPen();                             //创建画笔对象
	GreenPen->CreatePen(PS_SOLID,1,RGB(0,255,0));          //绿色画笔
	CGdiObject *GreenOlderPen=pDC->SelectObject(GreenPen); 
	
	pDC->Rectangle(9,167,312,308);     //画一个矩形框
	pDC->MoveTo(15,171);               //绘制坐标轴
	pDC->LineTo(15,288);               //Y竖轴
	pDC->LineTo(305,288);              //X横轴
	
	pDC->MoveTo(305,288);              //绘制X箭头
	pDC->LineTo(300,283);              //绘制上边箭头
	pDC->MoveTo(305,288);
	pDC->LineTo(300,293);              //绘制下边箭头
	
	pDC->MoveTo(15,171);                //绘制Y箭头
	pDC->LineTo(10,176);                //绘制左边箭头
	pDC->MoveTo(15,171);
	pDC->LineTo(20,176);                //绘制右边箭头
	
	for(i=0;i<=5;i++)                   //写X轴刻度线
	{
		str.Format("%d",i*50);               //0-255之间添加6个刻度值
		pDC->SetTextColor(RGB(255,0,255));   //设置字体颜色
		pDC->TextOut(15+48*i,290,str);       //输出字体
		
		pDC->MoveTo(15+48*i,288);            //绘制X轴刻度
		pDC->LineTo(15+48*i,285);
	}
	for(i=0;i<=5;i++)                        //写Y轴刻度线
	{
		pDC->MoveTo(15,288-20*i);            //绘制Y轴刻度
		pDC->LineTo(18,288-20*i);
	}
	
	/*绘制直方图主要的代码*/
	for(i=1;i<256;i++)
	{
		pDC->MoveTo(15+i,288);
		if( (288-167) > (Green[i]/40) )
			pDC->LineTo(15+i,288-(Green[i]/40));   
		else
			pDC->LineTo(15+i,167);            //超过矩形的画矩形高
	}
		
		
	/**********************/
	/*重点:画直方图 蓝色
	/***************((*****/
	CPen *BluePen=new CPen();                            //创建画笔对象
	BluePen->CreatePen(PS_SOLID,1,RGB(0,0,255));         //蓝色画笔
	CGdiObject *BlueOlderPen=pDC->SelectObject(BluePen);  
	
	pDC->Rectangle(9,327,312,468);      //画一个矩形框
	pDC->MoveTo(15,331);                //绘制坐标轴
	pDC->LineTo(15,448);                //Y竖轴
	pDC->LineTo(305,448);               //X横轴
	
	pDC->MoveTo(305,448);               //绘制X箭头
	pDC->LineTo(300,443);               //绘制上边箭头
	pDC->MoveTo(305,448);
	pDC->LineTo(300,453);               //绘制下边箭头
	
	pDC->MoveTo(15,331);                //绘制Y箭头
	pDC->LineTo(10,336);                //绘制左边箭头
	pDC->MoveTo(15,331);
	pDC->LineTo(20,336);                //绘制右边箭头
	
	
	for(i=0;i<=5;i++)                   //写X轴刻度线
	{
		str.Format("%d",i*50);               //0-255之间添加6个刻度值
		pDC->SetTextColor(RGB(255,0,255));   //设置字体颜色
		pDC->TextOut(15+48*i,450,str);       //输出字体
		
		pDC->MoveTo(15+48*i,448);            //绘制X轴刻度
		pDC->LineTo(15+48*i,445);
	}
	for(i=0;i<=5;i++)                        //写Y轴刻度线
	{
		pDC->MoveTo(15,448-20*i);            //绘制Y轴刻度
		pDC->LineTo(18,448-20*i);
	}
	
	/*绘制直方图主要的代码*/
	for(i=1;i<256;i++)
	{
		pDC->MoveTo(15+i,448);
		if( (448-327) > (Blue[i]/40) )
			pDC->LineTo(15+i,448-(Blue[i]/40));   
		else
			pDC->LineTo(15+i,327);            //超过矩形的画矩形高
	}
		
			
	//恢复以前的画笔
	pDC->SelectObject(RedOlderPen);
	pDC->SelectObject(GreenOlderPen);
	pDC->SelectObject(BlueOlderPen);
	delete RedPen;
	delete GreenPen;
	delete BluePen;
	ReleaseDC(pDC);
	return;
	
	// Do not call CDialog::OnPaint() for painting messages
}
        此时运行程序即可显示直方图。
        最后还是希望文章对你有所帮助,如果文章有不足或错误之处,请海涵~文章不仅仅讲述了直方图相关的知识,同时文章也给你提供了一种绘制坐标图像的思想和详细注释。有时候一直怀疑回忆这些知识会让我停滞不前,但心安即好,何必在意!
        从来没有什么终南捷径和大神,真正的捷径只有三个:坚持、专注、认真。其他的都是细枝末节,做到这三个,其他的自然而然都会拥有。——同学CY
      (By:Eastmount 2015-5-31 下午3点   http://blog.csdn.net/eastmount/
        
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【数字图像处理】四.MFC对话框绘制灰度直方图 的相关文章

  • MFC/WinAPI 的大问题

    我需要创建一个带有两个选项卡的表单视图的 SDI 表单 其中封装了多个对话框作为选项卡内容 但表格必须有彩色背景 诸如此类的事情让我讨厌编程 首先 我通过资源编辑器尝试了 CTabControl 尝试了不同的事情 但未记录的行为和没有答案的
  • 如何从头开始启动 MFC 应用程序?

    换句话说 来自一个空白的 win32 项目 无向导 这就是我所在的地方 预处理器定义 WIN32 链接器 gt 系统 gt 子系统 控制台 int tmain int nRetCode 0 initialize MFC and print
  • 在MFC项目中使用多个资源文件

    我在 VS2015 中使用 MFC C 11 并且有一组独立的 GUI 我想在多个项目中使用它们 我知道这可以通过创建一个 rc 文件来实现 该文件可以包含在每个项目的主 rc 文件中 使用多个资源文件 https msdn microso
  • Boost::序列化和 MFC Doc/View 架构

    我正在移植现有的 MFC C 应用程序以对 XML 文件使用 Boost Serialization 我的 CDocument 对象包含应用程序的所有数据 我已将序列化函数实现为 template
  • 从不同操作系统检索到的故障转储指向消息循环。如何从那里到达故障位置? (TeamViewer 使我的进程崩溃。)

    我们软件的一位客户抱怨说 该软件在他的 Windows XP 计算机上崩溃了 我让他下载ProcDump https technet microsoft com en us sysinternals dd996900 aspx并按如下方式运
  • 升级后的 MFC 应用程序看起来仍然很旧

    我有一个用 VC6 编写的 MFC 应用程序 我已将其升级到 VS2015 并且它可以构建并运行 该应用程序是一个主可执行文件 其中包含许多包含对话框的 DLL 然而应用仍然looks就像用 VC6 构建的一样 所有 GUI 组件都没有 W
  • CloseWindow和WM_CLOSE有什么关系

    我现在有点困惑 是吗 WM CLOSE http msdn microsoft com en us library windows desktop ms632617 28v vs 85 29 aspx and CloseWindow htt
  • 如何最好地避免 C++/CLI 本机类型中的双重转换

    传统上 我一直使用 MFC 扩展 dll 并使用 dllimport dllexport 导入 导出 但是 当 dll 更改为使用 clr 时 此方法的成本会变得很高 因为调用可能会导致双重转换 我现在的性能受到了巨大的打击 需要停止双重重
  • 如何将 std::variant 作为 VARIANT* 传递给 ExecWB?

    我看过这篇关于使用的文章std variant https en cppreference com w cpp utility variant 这是因为以下代码引发了代码分析警告 void CChristianLifeMinistryHtm
  • 默认情况下启用或禁用菜单项。为什么?

    我有一些遗留代码 由于某种原因 菜单项在启动时被启用或禁用 我的问题是 如何 有没有办法在不调用 EnableMenuItem 函数的情况下执行此操作 MFC 有没有办法做与资源设置所说相反的事情 我也不明白为什么当最后一个子窗口关闭时 当
  • 如何发光最小。最大和关闭按钮?

    我按照以下指南使用 DWM API 创建自定义 Aero 框架 My work void CMainFrame OnActivate UINT nState CWnd pWndOther BOOL bMinimized CFrameWnd
  • 如何找到激活时打开给定 HMENU 的菜单项(如果有)?

    我想用原型实现一个功能 Locates the menu item of the application which caused the given menu mnu to show up return true if the given
  • 在Linux上运行MFC程序

    我有一个相当大的基于 MFC 的程序 我的任务是让它在 Linux 上运行 我已经解释过 这需要将程序重新编写为带有 STL 的直接 C 更多工作 或者重新编写为 Qt C 更少工作 现在我被告知 我需要编写包装器以使每个 MFC 类在 L
  • 禁用/启用 MFC 功能包的功能区按钮

    我正在使用 MFC 功能包 并且功能区栏上有一些按钮 即 CMFCRibbonButton 的实例 问题是我想在某些条件下启用和禁用其中一些 但在运行时 我怎样才能做到这一点 因为没有具体的方法 我听说解决方案是在运行时附加 分离事件处理程
  • 如何通过单击 MainFrame 内的按钮来更改 MFC 视图

    我想通过单击窗口内的按钮来更改呈现的视图像这样 https i stack imgur com 3IA2o png 我的项目设置 我制作了一个没有文档 视图支持的 MFC 项目 SDI 我在设计器中又创建了两个视图并向它们添加了类 新的视图
  • 想要将 ColeDateTime 转换为 CTime

    我正在从数据库中读取日期时间ColeDateTime格式 我想将其转换为CTime获取日期 月份 年份和时间 CString repDt this will hold the datetime which i read from Datab
  • MFC CMenu 工具提示未显示

    我尝试使用类似的东西来设置 CMenu 项的工具提示 如所述here https stackoverflow com questions 2400180 mfc how to add tooltip in cmenu items 但它只是显
  • 捕获由纯 C++ dll 中的 MFC 应用程序生成的 Windows 消息

    首先 这可能吗 我有一个与某些硬件接口的第三方 dll 它是用MFC编写的 我 从 dll 供应商处 收到了一个示例 Visual Studio 2010 解决方案 该解决方案只有一个项目 调用相关第三方 dll 的 MFC 应用程序 ex
  • .NET(或 MFC)的高速图形控件?

    我需要编写一个数字示波器类型的应用程序 有很多很棒的静态绘图控件 但我需要一些可以绘制每秒处理 4000 个样本的 16 条轨迹的东西 有人知道 NET 的高速图形控件吗 我什至会选择 MFC 因为它可以封装到 NET 控件中 谢谢您的帮助
  • C++ 检查 unicode 字符是否为全角

    如何检查unicode字符是否是全角 我使用Win32 MFC 例如 中是全宽 A不是全角 是全宽 F不是全宽 你需要的是检索东亚宽度 http www unicode org reports tr11 的角色 您可以通过解析来做到这一点东

随机推荐

  • elasticsearch FunctionScore Java API

    elasticsearch FunctionScore java API 1 使用script FunctionScoreQueryBuilder query QueryBuilders functionScoreQuery queryBu
  • 修改微信小程序官方picker-view日期选择器

    微信小程序问题之picker view日期选择器 项目需求截图 选择出生日期的时候需要用到微信的picker view日期选择器 然后就发现官方picker view组件有一些问题 1 初始化日期不是当前日期 2 选择不同月份 日期都是从1
  • NVIDIA Video Codec SDK简介

    NVIDIA的Video Codec SDK提供API对视频进行加速编解码 最新发布版本为12 0 支持Windows和Linux平台 可从 https developer nvidia com video codec sdk archiv
  • python 操作 doc /docx

    对于python来说操作 doc 需要用到 win32com 安装 pip install win32com 优点 doc所有的操作都可以执行 缺点 如果没有office就死翘翘了 当然也可以com wsp 对于这种需要强制安装xx的不是很
  • Redis系列(一)与同类对比,底层数据结构,阿里云简单部署

    Redis与Memcache Ehcache对比 有持久化需求或者对数据结构和处理有高级要求的应用 选择redis 其他简单的key value存储 选择memcache Memcache适合多读少写 大数据量的情况 如人人网大量查询用户信
  • Docker搭建rtmp视频直播

    一 PC端搭建RTMP服务器 1 安装docker sudo apt get install docker sudo apt get update 2 下载docker nginx rtmp容器 sudo apt get install d
  • html中如何获取表单的数据

    1 使用表单中的id属性获取表单中的数据 在表单的input标签中指定id属性值 在script脚本中可以通过 表格的名称 id名称 value 来访问表单中的值 例如 register form username value 表单代码
  • 整理最新java面试宝典2019

    java面试宝典2019 参照 http www wityx com 3 html 1 meta标签的作用是什么 2 ReenTrantLock可重入锁 和synchronized的区别 总结 3 Spring中的自动装配有哪些限制 4 什
  • 用U盘安装Linux系统

    需要的东西 1 软件 Universal USB Installer 2 U盘 容量至少为4GB 3 linux系统的镜像文件 比如 ubuntu 10 04 3 desktop i386 iso或者ubuntu 10 04 desktop
  • 在排序数组中查找元素的第一个和最后一个位置

    本文就来探究几个最常用的二分查找场景 寻找一个数 寻找左侧边界 寻找右侧边界 而且 我们就是要深入细节 比如不等号是否应该带等号 mid 是否应该加一等等 分析这些细节的差异以及出现这些差异的原因 保证你能灵活准确地写出正确的二分查找算法
  • Alibaba 神器!一招定位 线 上Bug

    尊重原创版权 https www csnovel com hot 43764 html 更多内容参考 https www csnovel com 阿里神器 一招定位 线 上Bug 背景 公司有个渠道系统 专门对接三方渠道使用 没有什么业务逻
  • windows计算机锁屏的快捷键是什么,win10电脑锁屏快捷键是什么

    我们在使用win10操作系统的时候 其中有很多快捷方式我们都是可以直接使用键盘操作而省去鼠标键盘配合操作的 这样做的优点就是会非常的有效率 节省时间而且没有繁琐的步骤 有的小伙伴想知道我们win10的锁屏快捷键是什么 那么现在就让小编来告诉
  • 杰理之蓝牙OTA蓝牙升级【篇】

    命令AT OTA r响应成功 r nOK r n失败 r nERR data r n
  • gitee码云的使用 ----- 将项目上传

    准备工作 首先你得安装好git 安装教程如下 https git scm com downloads 去码云官网注册登录 然后创建仓库按照步骤做完会得到一个https地址 然后下面就会用到 接下来就是如何将自己的项目代码放置到gitee上
  • 记录C++类中的一次函数调用

    引用 之前遇到一次函数调用结果的问题 今天在这里做一下记录 一个基类 一个派生类 两个类中都有一个函数名相同 参数相同 参数不同的函数 创建基类指针指向派生类对象 调用相应的函数 派生类指针指向基类对象 调用相应的函数 求其输出结果 具体看
  • 基于STM32使用超声波HC-SR04模块

    写在前面注意的几点 1 HC SR04模块必须使用5V供电 不能是3 3V 2 若单是测距 无需使用中断 3 Echo和Trig两个引脚可以任意接可用的GPIO 和定时器无关 说一下超声波的工作原理 单片机给Trig引脚一个最少10us的高
  • python matplotlib 坐标轴打断

    想要绘制出如下类型坐标轴断开的图 matplotlib中并没有直接可用的API 但是官方给出了一个demo broken axis py 大概说下思路 画出两个共享X轴 完全相同的图 下图取消上边界 下图取消下边界 然后再使用plot画两组
  • Python3 ThreadPoolExecutor--线程池

    1 线程池创建 def init self max workers None thread name prefix initializer None initargs max workers 设置线程池中最多能同时运行的线程数目 threa
  • mysql-跨库联合查询

    目前微服务很火 但是就存在问题 服务拆分 数据库也进行拆分 mysql如果A数据库数据需要联合查询B数据库 应该如何实现呢 sqlserver 可以使用dblink 具体不做说明 查资料即可 着重讲解mysql 1 同实例不同库 1 gt
  • 【数字图像处理】四.MFC对话框绘制灰度直方图

    本文主要讲述基于VC 6 0 MFC图像处理的应用知识 主要结合自己大三所学课程 数字图像处理 及课件进行回忆讲解 主要通过MFC单文档视图实现点击弹出对话框绘制BMP图片的灰度直方图 再获取平均灰度 中指灰度和标准差等值 文章比较详细基础