用vc++创建直方图详解.docx

上传人:b****4 文档编号:3535283 上传时间:2022-11-23 格式:DOCX 页数:22 大小:21.94KB
下载 相关 举报
用vc++创建直方图详解.docx_第1页
第1页 / 共22页
用vc++创建直方图详解.docx_第2页
第2页 / 共22页
用vc++创建直方图详解.docx_第3页
第3页 / 共22页
用vc++创建直方图详解.docx_第4页
第4页 / 共22页
用vc++创建直方图详解.docx_第5页
第5页 / 共22页
点击查看更多>>
下载资源
资源描述

用vc++创建直方图详解.docx

《用vc++创建直方图详解.docx》由会员分享,可在线阅读,更多相关《用vc++创建直方图详解.docx(22页珍藏版)》请在冰豆网上搜索。

用vc++创建直方图详解.docx

用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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 表格模板 > 合同协议

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1