用vc++创建直方图详解.docx
《用vc++创建直方图详解.docx》由会员分享,可在线阅读,更多相关《用vc++创建直方图详解.docx(22页珍藏版)》请在冰豆网上搜索。
![用vc++创建直方图详解.docx](https://file1.bdocx.com/fileroot1/2022-11/23/22fbb349-c52e-4892-b582-a06e227c29ae/22fbb349-c52e-4892-b582-a06e227c29ae1.gif)
用vc++创建直方图详解
步骤和程序:
打开VC程序——文件——新建——工程中的MFCAppWizard(exe),在工程下面的框中输入工程名(假定工程名为111),点确定——选多重文档,点下一个——后面都点下一个直到完成确定,基本框架就完成了,下面就加代码。
这时VC界面上左边框的下面有三个按钮:
ClassView、ResourceView和FileView,ClassView里面是工程111的类:
CAdoutDlg、CChildFrame、CMy111App、CMy111Doc、CMy111View和Globals;点ResourceView里面是资源类:
Accelerator、Dialog、Icon、Menu、StringTable、Toolbar和Version;点开FileView里面是文件类:
SourceFile、HeaderFiles、ResourceFiles和ReadMe.txt。
点界面的“工程”按钮——添加工程——新建——选C++SourceFile,在文件下面的框里输入文件名(如DIBAPI),点“结束”,这样在FileView中的SourceFiles里面就多了一个DIBAPI.cpp文件,所有的代码都加在该文件中。
再点界面的“工程”按钮——添加工程——新建——选C/C++HeaderFile,在文件下面的框里输入文件名(和前面的文件名必须一致),点“结束”,这样在FileView中的HeaderFiles里面就多了一个DIBAPI.h文件,该文件是DIBAPI.cpp的头文件。
点开DIBAPI.h文件,里面是空白的,把如下代码考入文件中:
//DIBAPI.h
#ifndef_INC_DIBAPI
#define_INC_DIBAPI
DECLARE_HANDLE(HDIB);
#definePALVERSION0x300
#defineIS_WIN30_DIB(lpbi)((*(LPDWORD)(lpbi))==sizeof(BITMAPINFOHEADER))
#defineRECTWIDTH(lpRect)((lpRect)->right-(lpRect)->left)
#defineRECTHEIGHT(lpRect)((lpRect)->bottom-(lpRect)->top)
#defineWIDTHBYTES(bits)(((bits)+31)/32*4)
#defineDIB_HEADER_MARKER((WORD)('M'<<8)|'B')
BOOLWINAPIPaintDIB(HDC,LPRECT,HDIB,LPRECT,CPalette*pPal);
BOOLWINAPICreateDIBPalette(HDIBhDIB,CPalette*cPal);
LPSTRWINAPIFindDIBBits(LPSTRlpbi);
DWORDWINAPIDIBWidth(LPSTRlpDIB);
DWORDWINAPIDIBHeight(LPSTRlpDIB);
WORDWINAPIPaletteSize(LPSTRlpbi);
WORDWINAPIDIBNumColors(LPSTRlpbi);
HGLOBALWINAPICopyHandle(HGLOBALh);
BOOLWINAPISaveDIB(HDIBhDib,CFile&file);
HDIBWINAPIReadDIBFile(CFile&file);
//在此处输入自己的函数声明
#endif//!
_INC_DIBAPI
上面这些函数是实现图像的读取、存储等图像处理的基本功能的,你将自己需要的函数也输入到“//在此处输入自己的函数声明”的下面。
点开DIBAPI.cpp文件,里面是空白的,将如下代码加入其中:
//DIBAPI.cpp
#include"stdafx.h"
#include"DIBAPI.h"
WORDWINAPIDIBNumColors(LPSTRlpbi)
{
WORDwBitCount;
if(IS_WIN30_DIB(lpbi))
{
DWORDdwClrUsed;
dwClrUsed=((LPBITMAPINFOHEADER)lpbi)->biClrUsed;
if(dwClrUsed)
return(WORD)dwClrUsed;
}
if(IS_WIN30_DIB(lpbi))
wBitCount=((LPBITMAPINFOHEADER)lpbi)->biBitCount;
else
wBitCount=((LPBITMAPCOREHEADER)lpbi)->bcBitCount;
switch(wBitCount)
{
case1:
return2;
case4:
return16;
case8:
return256;
default:
return0;
}
}
WORDWINAPIPaletteSize(LPSTRlpbi)
{
if(IS_WIN30_DIB(lpbi))
return(WORD)(DIBNumColors(lpbi)*sizeof(RGBQUAD));
else
return(WORD)(DIBNumColors(lpbi)*sizeof(RGBTRIPLE));
}
LPSTRWINAPIFindDIBBits(LPSTRlpbi)
{
return(lpbi+*(LPDWORD)lpbi+:
:
PaletteSize(lpbi));
}
DWORDWINAPIDIBWidth(LPSTRlpDIB)
{
LPBITMAPINFOHEADERlpbmi;
LPBITMAPCOREHEADERlpbmc;
lpbmi=(LPBITMAPINFOHEADER)lpDIB;
lpbmc=(LPBITMAPCOREHEADER)lpDIB;
if(IS_WIN30_DIB(lpDIB))
returnlpbmi->biWidth;
else
return(DWORD)lpbmc->bcWidth;
}
DWORDWINAPIDIBHeight(LPSTRlpDIB)
{
LPBITMAPINFOHEADERlpbmi;
LPBITMAPCOREHEADERlpbmc;
lpbmi=(LPBITMAPINFOHEADER)lpDIB;
lpbmc=(LPBITMAPCOREHEADER)lpDIB;
if(IS_WIN30_DIB(lpDIB))
returnlpbmi->biHeight;
else
return(DWORD)lpbmc->bcHeight;
}
BOOLWINAPIPaintDIB(HDChDC,LPRECTlpDCRect,HDIBhDIB,LPRECTlpDIBRect,CPalette*pPal)
{
LPSTRlpDIBHdr;
LPSTRlpDIBBits;
BOOLbSuccess=FALSE;
HPALETTEhPal=NULL;
HPALETTEhOldPal=NULL;
if(hDIB==NULL)
returnFALSE;
lpDIBHdr=(LPSTR):
:
GlobalLock((HGLOBAL)hDIB);
lpDIBBits=FindDIBBits(lpDIBHdr);
if(pPal!
=NULL)
{
hPal=(HPALETTE)pPal->m_hObject;
hOldPal=:
:
SelectPalette(hDC,hPal,TRUE);
}
:
:
SetStretchBltMode(hDC,COLORONCOLOR);
if((RECTWIDTH(lpDCRect)==RECTWIDTH(lpDIBRect))&&(RECTHEIGHT(lpDCRect)==RECTHEIGHT(lpDIBRect)))
{
bSuccess=:
:
SetDIBitsToDevice(hDC,lpDCRect->left,lpDCRect->top,RECTWIDTH(lpDCRect),RECTHEIGHT(lpDCRect),lpDIBRect->left,\
(int)DIBHeight(lpDIBHdr)-lpDIBRect->top-RECTHEIGHT(lpDIBRect),0,(WORD)DIBHeight(lpDIBHdr),\
lpDIBBits,(LPBITMAPINFO)lpDIBHdr,DIB_RGB_COLORS);
}
else
{
bSuccess=:
:
StretchDIBits(hDC,lpDCRect->left,lpDCRect->top,RECTWIDTH(lpDCRect),RECTHEIGHT(lpDCRect),lpDIBRect->left,\
lpDIBRect->top,RECTWIDTH(lpDIBRect),RECTHEIGHT(lpDIBRect),\
lpDIBBits,(LPBITMAPINFO)lpDIBHdr,DIB_RGB_COLORS,SRCCOPY);
}
:
:
GlobalUnlock((HGLOBAL)hDIB);
if(hOldPal)
:
:
SelectPalette(hDC,hOldPal,TRUE);
GlobalUnlock(hDIB);
returnbSuccess;
}
BOOLWINAPICreateDIBPalette(HDIBhDIB,CPalette*pPal)
{
LPLOGPALETTElpPal;
HANDLEhLogPal;
HPALETTEhPal=NULL;
LPSTRlpbi;
LPBITMAPINFOlpbmi;
LPBITMAPCOREINFOlpbmc;
BOOLbWinStyleDIB;
inti;
WORDwNumColors;
BOOLbResult=FALSE;
if(hDIB==NULL)
returnFALSE;
lpbi=(LPSTR):
:
GlobalLock((HGLOBAL)hDIB);
lpbmi=(LPBITMAPINFO)lpbi;
lpbmc=(LPBITMAPCOREINFO)lpbi;
wNumColors=DIBNumColors(lpbi);
bWinStyleDIB=IS_WIN30_DIB(lpbi);
if(wNumColors!
=0)
{
hLogPal=:
:
GlobalAlloc(GHND,sizeof(LOGPALETTE)+sizeof(PALETTEENTRY)*wNumColors);
if(hLogPal==0)
{
:
:
GlobalUnlock((HGLOBAL)hDIB);
returnFALSE;
}
lpPal=(LPLOGPALETTE):
:
GlobalLock(hLogPal);
lpPal->palVersion=PALVERSION;
lpPal->palNumEntries=(WORD)wNumColors;
bWinStyleDIB=IS_WIN30_DIB(lpbi);
for(i=0;i<(int)wNumColors;i++)
{
if(bWinStyleDIB)
{
lpPal->palPalEntry[i].peRed=lpbmi->bmiColors[i].rgbRed;
lpPal->palPalEntry[i].peGreen=lpbmi->bmiColors[i].rgbGreen;
lpPal->palPalEntry[i].peBlue=lpbmi->bmiColors[i].rgbBlue;
lpPal->palPalEntry[i].peFlags=0;
}
else
{
lpPal->palPalEntry[i].peRed=lpbmc->bmciColors[i].rgbtRed;
lpPal->palPalEntry[i].peGreen=lpbmc->bmciColors[i].rgbtGreen;
lpPal->palPalEntry[i].peBlue=lpbmc->bmciColors[i].rgbtBlue;
lpPal->palPalEntry[i].peFlags=0;
}
}
bResult=pPal->CreatePalette(lpPal);
:
:
GlobalUnlock((HGLOBAL)hLogPal);
:
:
GlobalFree((HGLOBAL)hLogPal);
}
:
:
GlobalUnlock((HGLOBAL)hDIB);
returnbResult;
}
HGLOBALWINAPICopyHandle(HGLOBALh)
{
if(h==NULL)
returnNULL;
DWORDdwLen=:
:
GlobalSize((HGLOBAL)h);
HGLOBALhCopy=:
:
GlobalAlloc(GHND,dwLen);
if(hCopy!
=NULL)
{
void*lpCopy=:
:
GlobalLock((HGLOBAL)hCopy);
void*lp=:
:
GlobalLock((HGLOBAL)h);
memcpy(lpCopy,lp,dwLen);
:
:
GlobalUnlock(hCopy);
:
:
GlobalUnlock(h);
}
returnhCopy;
}
BOOLWINAPISaveDIB(HDIBhDib,CFile&file)
{
BITMAPFILEHEADERbmfHdr;
LPBITMAPINFOHEADERlpBI;
DWORDdwDIBSize;
if(!
hDib)
returnFALSE;
lpBI=(LPBITMAPINFOHEADER):
:
GlobalLock((HGLOBAL)hDib);
if(lpBI==NULL)
returnFALSE;
if(!
IS_WIN30_DIB(lpBI))
{
:
:
GlobalUnlock((HGLOBAL)hDib);
returnFALSE;
}
bmfHdr.bfType=DIB_HEADER_MARKER;
dwDIBSize=*(LPDWORD)lpBI+:
:
PaletteSize((LPSTR)lpBI);
if((lpBI->biCompression==BI_RLE8)||(lpBI->biCompression==BI_RLE4))
dwDIBSize+=lpBI->biSizeImage;
else
{
DWORDdwBmBitsSize;
dwBmBitsSize=WIDTHBYTES((lpBI->biWidth)*((DWORD)lpBI->biBitCount))*lpBI->biHeight;
dwDIBSize+=dwBmBitsSize;
lpBI->biSizeImage=dwBmBitsSize;
}
bmfHdr.bfSize=dwDIBSize+sizeof(BITMAPFILEHEADER);
bmfHdr.bfReserved1=0;
bmfHdr.bfReserved2=0;
bmfHdr.bfOffBits=(DWORD)sizeof(BITMAPFILEHEADER)+lpBI->biSize+:
:
PaletteSize((LPSTR)lpBI);
TRY
{
file.Write((LPSTR)&bmfHdr,sizeof(BITMAPFILEHEADER));
file.WriteHuge(lpBI,dwDIBSize);
}
CATCH(CFileException,e)
{
:
:
GlobalUnlock((HGLOBAL)hDib);
THROW_LAST();
}
END_CATCH
:
:
GlobalUnlock((HGLOBAL)hDib);
returnTRUE;
}
HDIBWINAPIReadDIBFile(CFile&file)
{
BITMAPFILEHEADERbmfHeader;
DWORDdwBitsSize;
HDIBhDIB;
LPSTRpDIB;
dwBitsSize=file.GetLength();
if(file.Read((LPSTR)&bmfHeader,sizeof(bmfHeader))!
=sizeof(bmfHeader))
returnNULL;
if(bmfHeader.bfType!
=DIB_HEADER_MARKER)
returnNULL;
hDIB=(HDIB):
:
GlobalAlloc(GMEM_MOVEABLE|GMEM_ZEROINIT,dwBitsSize);
if(hDIB==0)
returnNULL;
pDIB=(LPSTR):
:
GlobalLock((HGLOBAL)hDIB);
if(file.ReadHuge(pDIB,dwBitsSize-sizeof(BITMAPFILEHEADER))!
=dwBitsSize-sizeof(BITMAPFILEHEADER))
{
:
:
GlobalUnlock((HGLOBAL)hDIB);
:
:
GlobalFree((HGLOBAL)hDIB);
returnNULL;
}
:
:
GlobalUnlock((HGLOBAL)hDIB);
returnhDIB;
}
//在此处输入自己的函数定义
上面是DIBAPI.h头文件中声明的函数的定义,你将自己的函数定义加到“//在此处输入自己的函数定义”后面。
下面加相应的消息映射函数,点Ctrl+W键,会出现MFCClassWizard对话框,点MessageMaps,在Classname下面的框中选择CMy111Doc,在Messages里面选中OnOpenDocument,然后点击AddFunction按钮就加入了相应的消息映射函数,同样的方法以此加入OnSaveDocument、DeleteContents、CanCloseFrame相应的消息函数,点“确定”即可。
点开111Doc.cpp文件,里面有相应的消息映射函数定义位置,在函数CMy111Doc:
:
CMy111Doc()里输入以下代码:
m_refColorBKG=0x00808080;
m_hDIB=NULL;
m_palDIB=NULL;
m_sizeDoc=CSize(1,1);
在函数CMy111Doc:
:
~CMy111Doc()里输入以下代码:
if(m_hDIB!
=NULL)
:
:
GlobalFree((HGLOBAL)m_hDIB);
if(m_palDIB!
=NULL)
deletem_palDIB;
在函数BOOLCMy111Doc:
:
OnOpenDocument(LPCTSTRlpszPathName)里/TODO:
Addyourspecializedcreationcodehere下面添加如下代码:
CFilefile;
CFileExceptionfe;
if(!
file.Open(lpszPathName,CFile:
:
modeRead|CFile:
:
shareDenyWrite,&fe))
{
ReportSaveLoadException(lpszPathName,&fe,FALSE,AFX_IDP_FAILED_TO_OPEN_DOC);
returnFALSE;
}
DeleteContents();
BeginWaitCursor();
TRY
{
m_hDIB=:
:
ReadDIBFile(file);
}
CATCH(CFileException,eLoad)
{
file.Abort();
EndWaitCursor();
ReportSaveLoadException(lpszPathName,eLoad,FALSE,AFX_IDP_FAILED_TO_OPEN_DOC);
m_hDIB=NULL;
returnFALSE;
}
END_CATCH
InitDIBData();
EndWaitCursor();
if(m_hDIB==NULL)
{
CStringstrMsg;
strMsg="读取图像时出错!
可能是不支持该类型的图像文件!
";
MessageBox(NULL,strMsg,NULL,MB_ICONINFORMATION|MB_OK);
returnFALSE;
}
SetPathName(lpszPathName);
SetModifiedFlag(FALSE);
在函数BOOLCMy111Doc:
:
OnSaveDocument(LPCTSTRlpszPathName)里//TODO:
Addyourspecializedcodehereand/orcallthebaseclass后面添加如下代码:
CFilefile;
CFileExceptionfe;
if(!
file.Open(lpszPathName,CFile:
:
modeCreate|CFile:
:
modeReadWrite|CFile:
:
shareExclusive,&fe))
{
ReportSaveLoadException(lpszPathName,&fe,TRUE,AFX_IDP_INVALID_FILENAME);
returnFALSE;
}
BOOLbSuccess=FALSE;
TRY
{
BeginWaitCursor();
bSuccess=:
:
SaveDIB(m_hDIB,file);
file.Close();
}
CATCH(CException,eSave)
{
file.Abort();
EndWaitCursor();
ReportSaveLoadException(lpszPathName,eSave,TRUE,AFX_IDP_FAILED_TO_SAVE_DOC);
returnFALSE;
}
END_CATCH
EndWaitCursor();
SetModifiedFlag(FALSE);
if(!
bSucce