展开全部

步骤和程序:

打开VC程序——文件——新建——工程中的MFC AppWizard(exe),在工程下面的框中输入工程名(假定32313133353236313431303231363533e78988e69d8331333238653965工程名为111),点确定——选多重文档,点下一个——后面都点下一个直到完成确定,基本框架就完成了,下面就加代码。

这时VC界面上左边框的下面有三个按钮:ClassView、ResourceView和FileView,ClassView里面是工程111的类:CAdoutDlg、CChildFrame、CMy111App、CMy111Doc、CMy111View和Globals;点ResourceView里面是资源类:Accelerator、Dialog、Icon、Menu、String Table、Toolbar和Version;点开FileView里面是文件类:Source File、Header Files、Resource Files和ReadMe.txt。

点界面的“工程”按钮——添加工程——新建——选C++ Source File,在文件下面的框里输入文件名(如DIBAPI),点“结束”,这样在FileView中的Source Files里面就多了一个DIBAPI.cpp文件,所有的代码都加在该文件中。再点界面的“工程”按钮——添加工程——新建——选C/C++ Header File,在文件下面的框里输入文件名(和前面的文件名必须一致),点“结束”,这样在FileView中的Header Files里面就多了一个DIBAPI.h文件,该文件是DIBAPI.cpp的头文件。

点开DIBAPI.h文件,里面是空白的,把如下代码考入文件中:

//DIBAPI.h

#ifndef _INC_DIBAPI

#define _INC_DIBAPI

DECLARE_HANDLE(HDIB);

#define PALVERSION 0x300

#define IS_WIN30_DIB(lpbi) ((*(LPDWORD)(lpbi))==sizeof(BITMAPINFOHEADER))

#define RECTWIDTH(lpRect) ((lpRect)->right-(lpRect)->left)

#define RECTHEIGHT(lpRect) ((lpRect)->bottom-(lpRect)->top)

#define WIDTHBYTES(bits) (((bits)+31)/32*4)

#define DIB_HEADER_MARKER ((WORD)('M'<<8)|'B')

BOOL WINAPI PaintDIB(HDC,LPRECT,HDIB,LPRECT,CPalette* pPal);

BOOL WINAPI CreateDIBPalette(HDIB hDIB,CPalette* cPal);

LPSTR WINAPI FindDIBBits(LPSTR lpbi);

DWORD WINAPI DIBWidth(LPSTR lpDIB);

DWORD WINAPI DIBHeight(LPSTR lpDIB);

WORD WINAPI PaletteSize(LPSTR lpbi);

WORD WINAPI DIBNumColors(LPSTR lpbi);

HGLOBAL WINAPI CopyHandle(HGLOBAL h);

BOOL WINAPI SaveDIB(HDIB hDib,CFile& file);

HDIB WINAPI ReadDIBFile(CFile& file);

//在此处输入自己的函数声明

#endif//!_INC_DIBAPI

上面这些函数是实现图像的读取、存储等图像处理的基本功能的,你将自己需要的函数也输入到“//在此处输入自己的函数声明”的下面。

点开DIBAPI.cpp文件,里面是空白的,将如下代码加入其中:

//DIBAPI.cpp

#include "stdafx.h"

#include "DIBAPI.h"

WORD WINAPI DIBNumColors(LPSTR lpbi)

{

WORD wBitCount;

if(IS_WIN30_DIB(lpbi))

{

DWORD dwClrUsed;

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)

{

case 1:

return 2;

case 4:

return 16;

case 8:

return 256;

default:

return 0;

}

}

WORD WINAPI PaletteSize(LPSTR lpbi)

{

if(IS_WIN30_DIB(lpbi))

return (WORD)(DIBNumColors(lpbi)*sizeof(RGBQUAD));

else

return (WORD)(DIBNumColors(lpbi)*sizeof(RGBTRIPLE));

}

LPSTR WINAPI FindDIBBits(LPSTR lpbi)

{

return (lpbi+*(LPDWORD)lpbi+::PaletteSize(lpbi));

}

DWORD WINAPI DIBWidth(LPSTR lpDIB)

{

LPBITMAPINFOHEADER lpbmi;

LPBITMAPCOREHEADER lpbmc;

lpbmi=(LPBITMAPINFOHEADER)lpDIB;

lpbmc=(LPBITMAPCOREHEADER)lpDIB;

if(IS_WIN30_DIB(lpDIB))

return lpbmi->biWidth;

else

return (DWORD)lpbmc->bcWidth;

}

DWORD WINAPI DIBHeight(LPSTR lpDIB)

{

LPBITMAPINFOHEADER lpbmi;

LPBITMAPCOREHEADER lpbmc;

lpbmi=(LPBITMAPINFOHEADER)lpDIB;

lpbmc=(LPBITMAPCOREHEADER)lpDIB;

if(IS_WIN30_DIB(lpDIB))

return lpbmi->biHeight;

else

return (DWORD)lpbmc->bcHeight;

}

BOOL WINAPI PaintDIB(HDC hDC,LPRECT lpDCRect,HDIB hDIB,LPRECT lpDIBRect,CPalette* pPal)

{

LPSTR lpDIBHdr;

LPSTR lpDIBBits;

BOOL bSuccess=FALSE;

HPALETTE hPal=NULL;

HPALETTE hOldPal=NULL;

if(hDIB==NULL)

return FALSE;

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);

return bSuccess;

}

BOOL WINAPI CreateDIBPalette(HDIB hDIB,CPalette* pPal)

{

LPLOGPALETTE lpPal;

HANDLE hLogPal;

HPALETTE hPal=NULL;

LPSTR lpbi;

LPBITMAPINFO lpbmi;

LPBITMAPCOREINFO lpbmc;

BOOL bWinStyleDIB;

int i;

WORD wNumColors;

BOOL bResult=FALSE;

if(hDIB==NULL)

return FALSE;

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);

return FALSE;

}

lpPal=(LPLOGPALETTE)::GlobalLock(hLogPal);

lpPal->palVersion=PALVERSION;

lpPal->palNumEntries=(WORD)wNumColors;

bWinStyleDIB=IS_WIN30_DIB(lpbi);

for(i=0;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);

return bResult;

}

HGLOBAL WINAPI CopyHandle(HGLOBAL h)

{

if(h==NULL)

return NULL;

DWORD dwLen=::GlobalSize((HGLOBAL)h);

HGLOBAL hCopy=::GlobalAlloc(GHND,dwLen);

if(hCopy!=NULL)

{

void* lpCopy=::GlobalLock((HGLOBAL)hCopy);

void* lp=::GlobalLock((HGLOBAL)h);

memcpy(lpCopy,lp,dwLen);

::GlobalUnlock(hCopy);

::GlobalUnlock(h);

}

return hCopy;

}

BOOL WINAPI SaveDIB(HDIB hDib,CFile& file)

{

BITMAPFILEHEADER bmfHdr;

LPBITMAPINFOHEADER lpBI;

DWORD dwDIBSize;

if(!hDib)

return FALSE;

lpBI=(LPBITMAPINFOHEADER)::GlobalLock((HGLOBAL)hDib);

if(lpBI==NULL)

return FALSE;

if(!IS_WIN30_DIB(lpBI))

{

::GlobalUnlock((HGLOBAL)hDib);

return FALSE;

}

bmfHdr.bfType=DIB_HEADER_MARKER;

dwDIBSize=*(LPDWORD)lpBI+::PaletteSize((LPSTR)lpBI);

if((lpBI->biCompression==BI_RLE8)||(lpBI->biCompression==BI_RLE4))

dwDIBSize+=lpBI->biSizeImage;

else

{

DWORD dwBmBitsSize;

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);

return TRUE;

}

HDIB WINAPI ReadDIBFile(CFile& file)

{

BITMAPFILEHEADER bmfHeader;

DWORD dwBitsSize;

HDIB hDIB;

LPSTR pDIB;

dwBitsSize=file.GetLength();

if(file.Read((LPSTR)&bmfHeader,sizeof(bmfHeader))!=sizeof(bmfHeader))

return NULL;

if(bmfHeader.bfType!=DIB_HEADER_MARKER)

return NULL;

hDIB=(HDIB)::GlobalAlloc(GMEM_MOVEABLE|GMEM_ZEROINIT,dwBitsSize);

if(hDIB==0)

return NULL;

pDIB=(LPSTR)::GlobalLock((HGLOBAL)hDIB);

if(file.ReadHuge(pDIB,dwBitsSize-sizeof(BITMAPFILEHEADER))!=dwBitsSize-sizeof(BITMAPFILEHEADER))

{

::GlobalUnlock((HGLOBAL)hDIB);

::GlobalFree((HGLOBAL)hDIB);

return NULL;

}

::GlobalUnlock((HGLOBAL)hDIB);

return hDIB;

}

//在此处输入自己的函数定义

上面是DIBAPI.h头文件中声明的函数的定义,你将自己的函数定义加到“//在此处输入自己的函数定义”后面。

下面加相应的消息映射函数,点Ctrl+W键,会出现MFC ClassWizard对话框,点Message Maps,在Class name下面的框中选择CMy111Doc,在Messages里面选中OnOpenDocument,然后点击Add Function按钮就加入了相应的消息映射函数,同样的方法以此加入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)

delete m_palDIB;

在函数BOOL CMy111Doc::OnOpenDocument(LPCTSTR lpszPathName)里/ TODO: Add your specialized creation code here下面添加如下代码:

CFile file;

CFileException fe;

if(!file.Open(lpszPathName,CFile::modeRead|CFile::shareDenyWrite,&fe))

{

ReportSaveLoadException(lpszPathName,&fe,FALSE,AFX_IDP_FAILED_TO_OPEN_DOC);

return FALSE;

}

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;

return FALSE;

}

END_CATCH

InitDIBData();

EndWaitCursor();

if(m_hDIB==NULL)

{

CString strMsg;

strMsg="读取图像时出错!可能是不支持该类型的图像文件!";

MessageBox(NULL,strMsg,NULL,MB_ICONINFORMATION|MB_OK);

return FALSE;

}

SetPathName(lpszPathName);

SetModifiedFlag(FALSE);

在函数BOOL CMy111Doc::OnSaveDocument(LPCTSTR lpszPathName)里// TODO: Add your specialized code here and/or call the base class后面添加如下代码:

CFile file;

CFileException fe;

if(!file.Open(lpszPathName,CFile::modeCreate|CFile::modeReadWrite|CFile::shareExclusive,&fe))

{

ReportSaveLoadException(lpszPathName,&fe,TRUE,AFX_IDP_INVALID_FILENAME);

return FALSE;

}

BOOL bSuccess=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);

return FALSE;

}

END_CATCH

EndWaitCursor();

SetModifiedFlag(FALSE);

if(!bSuccess)

{

CString strMsg;

strMsg="无法保存BMP图像";

MessageBox(NULL,strMsg,NULL,MB_ICONINFORMATION|MB_OK);

}

点开ClassView,右键点击CMy111Doc类,点Add Member Variable出现添加成员变量对话框,在Variable Type下的框中输入变量类型名HDIB,在Variable Name中输入变量名m_hDIB,在Access中选中Public就在CMy111Doc中加入了公共成员变量m_hDIB;同样加入int类型的m_nColorIndex、COLORREF类型的m_refColorBKG公共成员变量,再添加保护成员变量(在Access中选中Protected)CSize类的m_sizeDoc、CPalette*类的m_palDIB变量。右键点击CMy111Doc类,点Add Member Function出现添加成员函数对话框,在Function Type下的框中输入函数类型名void,在Function Declaration中输入函数名InitDIBData(),在Access中选中Public就在CMy111Doc中加入了公共成员函数InitDIBData();同样方法加入void类型的公共成员函数ReplaceHDIB(HDIB hDIB)。在111Doc.cpp中加入函数的代码,InitDIBData()里加如下代码:

if(m_palDIB!=NULL)

{

delete m_palDIB;

m_palDIB=NULL;

}

if(m_hDIB==NULL)

return;

LPSTR lpDIB=(LPSTR)::GlobalLock((HGLOBAL)m_hDIB);

if(::DIBWidth(lpDIB)>INT_MAX||::DIBHeight(lpDIB)>INT_MAX)

{

::GlobalUnlock((HGLOBAL)m_hDIB);

::GlobalFree((HGLOBAL)m_hDIB);

m_hDIB=NULL;

CString strMsg;

strMsg="BMP图像太大!";

MessageBox(NULL,strMsg,NULL,MB_ICONINFORMATION|MB_OK);

return;

}

m_sizeDoc=CSize((int)::DIBWidth(lpDIB),(int)::DIBHeight(lpDIB));

::GlobalUnlock((HGLOBAL)m_hDIB);

m_palDIB=new CPalette;

if(m_palDIB==NULL)

{

::GlobalFree((HGLOBAL)m_hDIB);

m_hDIB=NULL;

return;

}

if(::CreateDIBPalette(m_hDIB,m_palDIB)==NULL)

{

delete m_palDIB;

m_palDIB=NULL;

return;

}

在函数ReplaceHDIB(HDIB hDIB)中加入如下代码:

if(m_hDIB!=NULL)

::GlobalFree((HGLOBAL)m_hDIB);

m_hDIB=hDIB;

在CMy111doc.h的

// Attributes

public:

下面加入如下代码:

HDIB GetHDIB() const

{

return m_hDIB;

}

CPalette* GetDocPalette() const

{

return m_palDIB;

}

CSize GetDocSize() const

{

return m_sizeDoc;

}

注意要在111Doc.h前加上#include "DIBAPI.h"语句(在class CMy111Doc:public CDocument语句前)

下面为CMy111View中的函数 void CMy111View::OnDraw(CDC* pDC)中添加如下代码:

BeginWaitCursor();

CMy111* pDoc = GetDocument();

ASSERT_VALID(pDoc);

// TODO: add draw code for native data here

HDIB hDIB=pDoc->GetHDIB();

if(hDIB!=NULL)

{

LPSTR lpDIB=(LPSTR)::GlobalLock((HGLOBAL)hDIB);

int cxDIB=(int)::DIBWidth(lpDIB);

int cyDIB=(int)::DIBHeight(lpDIB);

::GlobalUnlock((HGLOBAL)hDIB);

CRect rcDIB;

rcDIB.top=rcDIB.left=0;

rcDIB.right=cxDIB;

rcDIB.bottom=cyDIB;

CRect rcDest;

if(pDC->IsPrinting())

{

int cxPage=pDC->GetDeviceCaps(HORZRES);

int cyPage=pDC->GetDeviceCaps(VERTRES);

int cxInch=pDC->GetDeviceCaps(LOGPIXELSX);

int cyInch=pDC->GetDeviceCaps(LOGPIXELSY);

rcDest.top=rcDest.left=0;

rcDest.bottom=(int)(((double)cyDIB*cxPage*cyInch)/((double)cxDIB*cxInch));

rcDest.right=cxPage;

int temp=cyPage-(rcDest.bottom-rcDest.top);

rcDest.bottom+=temp/2;

rcDest.top+=temp/2;

}

else

{

rcDest=rcDIB;

}

::PaintDIB(pDC->m_hDC,&rcDest,pDoc->GetHDIB(),&rcDIB,pDoc->GetDocPalette());

}

EndWaitCursor();

以上是关于图像打开、显示、保存的有关步骤和代码。

在111.cpp文件的InitInstance()函数的ParseCommandLine(cmdInfo);语句下输入语句

cmdInfo.m_nShellCommand = CCommandLineInfo::FileNothing;

则启动时不自动打开一个空文档。

显示图像直方图步骤:

1、 点击ResourceView,右键点击Dialog,选Insert Dialog 在属性对话框中将ID改为ID_HIST,对话框名称改为“直方图”

2、 在工具栏中点“插入”-“新建类”,输入类名,并选Base Class为CDialog,Dialog ID为ID_HIST。这样就将对话框和类联系起来了,在该对话框中拖入一Edit控件,将其ID设为IDC_HISTSHOW;

3、 快捷键“Ctrl+W”,出现MFC ClassWizard对话框,在Messages栏中分别选WM_INITDIALOG和WM_Paint,再点击“Add Function”,即将对话框初始化和画图函数加入对话框类之中。

4、 在Hist.h文件“public:”下面输入如下变量定义:

LONG m_lCount[256];

char* m_lpDIBBits;

LONG m_lWidth;

LONG m_lHeight;

int m_iIsDraging;

CDlgIntensity(CWnd* pParent = NULL);

5、 打开Hist.cpp程序,在CHist::OnInitDialog()函数中“// TODO: Add extra initialization here”前将如下代码拷贝进去:

unsigned char* lpSrc;

LONG i;

LONG j;

6、 在“// TODO: Add extra initialization here”后将如下代码拷贝进去:

CWnd* pWnd=GetDlgItem(IDC_HISTSHOW);

CRect rect;

GetClientRect(rect);

ClientToScreen(&rect);

for(i=0;i<256;i++)

{

m_lCount[i]=0;

}

LONG lLineBytes;

lLineBytes=WIDTHBYTES(m_lWidth*8);

for(i=0;i

{

for(j=0;j

{

lpSrc=(unsigned char*)m_lpDIBBits+lLineBytes*i+j;

m_lCount[*(lpSrc)]++;

}

}

m_iIsDraging=0;

7、在CHist::OnPaint()函数“CPaintDC dc(this);”前将如下代码拷如其中:

CString str;

LONG i;

LONG lMaxCount=0;

LONG m_iLowGray=0;

LONG m_iUpGray=255;

在CHist::OnPaint()函数“// TODO: Add your message handler code here”后将如下代码拷如其中:

CWnd* pWnd=GetDlgItem(IDC_ HISTSHOW);

CDC* pDC=pWnd->GetDC();

pWnd->Invalidate();

pWnd->UpdateWindow();

pDC->Rectangle(0,0,330,300);

CPen* pPenRed=new CPen;

pPenRed->CreatePen(PS_SOLID,1,RGB(255,0,0));

CPen* pPenBlue=new CPen;

pPenBlue->CreatePen(PS_SOLID,1,RGB(0,0,255));

CPen* pPenGreen=new CPen;

pPenGreen->CreatePen(PS_SOLID,1,RGB(0,255,0));

CGdiObject* pOldPen=pDC->SelectObject(pPenRed);

pDC->MoveTo(10,10);

pDC->LineTo(10,280);

pDC->LineTo(320,280);

str.Format("0");

pDC->TextOut(10,283,str);

str.Format("50");

pDC->TextOut(60,283,str);

str.Format("100");

pDC->TextOut(110,283,str);

str.Format("150");

pDC->TextOut(160,283,str);

str.Format("200");

pDC->TextOut(210,283,str);

str.Format("255");

pDC->TextOut(265,283,str);

for(i=0;i<256;i+=5)

{

if((i&1)==0)

{

pDC->MoveTo(i+10,280);

pDC->LineTo(i+10,284);

}

else

{

pDC->MoveTo(i+10,280);

pDC->LineTo(i+10,282);

}

}

pDC->MoveTo(315,275);

pDC->LineTo(320,280);

pDC->LineTo(315,285);

pDC->MoveTo(10,10);

pDC->LineTo(5,15);

pDC->MoveTo(10,10);

pDC->LineTo(15,15);

for(i=m_iLowGray;i<=m_iUpGray;i++)

{

if(m_lCount[i]>lMaxCount)

{

lMaxCount=m_lCount[i];

}

}

pDC->MoveTo(10,25);

pDC->LineTo(14,25);

str.Format("%d",lMaxCount);

pDC->TextOut(11,26,str);

pDC->SelectObject(pPenGreen);

pDC->MoveTo(m_iLowGray+10,25);

pDC->LineTo(m_iLowGray+10,280);

pDC->MoveTo(m_iUpGray+10,25);

pDC->LineTo(m_iUpGray+10,280);

pDC->SelectObject(pPenBlue);

if(lMaxCount>0)

{

for(i=m_iLowGray;i<=m_iUpGray;i++)

{

pDC->MoveTo(i+10,280);

pDC->LineTo(i+10,281-(int)(m_lCount[i]*256/lMaxCount));

}

}

pDC->SelectObject(pOldPen);

delete pPenRed;

delete pPenBlue;

delete pPenGreen;

8、点开ResourceView中的Menu,出现IDR_MAINFRAME和 IDR_MY111TYPE,双击IDR_MY111TYPE就出现了程序界面,有文件、编辑、查看、窗口、帮助按钮。点“查看”下面的虚线框右键——点“属性”,输入标题(直方图),和ID(大写英文,如ID_VIEW_HIST),这样就将按钮和程序通过ID联系起来了,点击该按钮,就会执行相应的程序。下面为该按钮添加函数:点Ctrl+W ,出现MFC ClassWizard对话框,选Class name为CMy111View,在Object IDs对应的选项中选中设置的ID(如为ID_VIEW_HIST),在Messages选项中选中COMMAND,然后点击“Add Function”按钮,选默认设置,就为ID_VIEW_HIST添加了相应的函数OnViewHist()。该函数在111View.cpp文件中定义,在函数void CMy111View:: OnViewHist()添加如下代码:

// TODO: Add your command handler code here

CMy111Doc* pDoc=GetDocument();

if(pDoc->m_hDIB==NULL)

{

MessageBox("请先打开一幅256色的BMP图像!","系统提示",MB_ICONINFORMATION|MB_OK);

return;

}

LPSTR lpDIB;

LPSTR lpDIBBits;

lpDIB=(LPSTR)::GlobalLock((HGLOBAL)pDoc->GetHDIB());

lpDIBBits=::FindDIBBits(lpDIB);

if(::DIBNumColors(lpDIB)!=256)

{

MessageBox("目前只支持查看256色位图灰度直方图!","系统提示",MB_ICONINFORMATION|MB_OK);

::GlobalUnlock((HGLOBAL)pDoc->GetHDIB());

return;

}

BeginWaitCursor();

CHist dlgPara;

dlgPara.m_lpDIBBits=lpDIBBits;

dlgPara.m_lWidth=::DIBWidth(lpDIB);

dlgPara.m_lHeight=::DIBHeight(lpDIB);

// dlgPara.m_iLowGray=0;

// dlgPara.m_iUpGray=255;

if(dlgPara.DoModal()!=IDOK)

{

return;

}

::GlobalUnlock((HGLOBAL)pDoc->GetHDIB());

EndWaitCursor();

已赞过

已踩过<

你对这个回答的评价是?

评论

收起

vjc机器人灰度怎么编程_求用vc++编程实现显示灰度直方图的详细步骤,越详细越好...相关推荐

  1. python灰度图片格式_[Python图像处理] 十五.图像的灰度线性变换

    [Python图像处理] 十五.图像的灰度线性变换 发布时间:2019-03-28 00:08, 浏览次数:619 , 标签: Python 该系列文章是讲解Python OpenCV图像处理知识,前 ...

  2. ai人工智能编程_从人工智能动态编程:Q学习

    ai人工智能编程 A failure is not always a mistake, it may simply be the best one can do under the circumsta ...

  3. 如何在树莓派上进行python编程_《树莓派Python编程指南》怎么样_目录_pdf在线阅读 - 课课家教育...

    计算机已经不再只是用来工作的方盒子.任何拥有一个可编程处理中心的东西都可以称作计算机.游戏终端.智能手机.全球卫星定位系统(GPS)单元.平板电脑以及其他许多令人难以置信的设备都说明了这一点.它们都是 ...

  4. 基于spring cloud 的灰度发布实践_【收藏】基于spring cloud灰度发版方案

    简介 敏捷开发迭代周期短发布快,每周都可能面临版本发版上线,为最大可能的降低对用户的影响提高服务可用率,大部分团队都需要等到半夜做发布和支持.本文就如何基于spring cloud体系做灰度发版改造提 ...

  5. 学python编程_少儿学Python编程的一些思考

    自从孩子上了初中,孩子妈就开始盯着各种真假难辨的中考.高考新政传言.当她从铺天盖地的少儿编程广告里获悉,编程将纳入中考,高考范围,并且2018年高考,多个省份的数学卷甚至都出现了编程题时,就变得异常兴 ...

  6. 华兴数控g71外圆循环编程_数控车床加工编程典型实例分析(西门子802S数控系统)...

    这是一篇带有教学色彩的习作,文章对数控编程的方式和步骤进行了简明的阐述,并针对一个典型零件的数控车削加工给出了一套程序.程序是以西门子802S数控系统为例编写的. 数控机床是一种技术密集度及自动化程度 ...

  7. 机器人总动员cp图_求机器人总动员瓦力和伊娃的头像图片,各一个,情侣用,画风搭配最好...

    2016-10-10 回答 这些网上找的 http://hiphotos.baidu.com/king222/pic/item/6f54b91e2931d205403417b8.jpg http:// ...

  8. fp函数式编程_全面了解函数式编程(FP)

    fp函数式编程 This is the other major programming paradigm. If you are interested in Objected oriented pro ...

  9. 用python学编程_用Python学编程

    第1部分 引 论 第1章 关于本书 1.1 什么人要学编程 1.2 本书的内容 1.3 为什么选择Python 1.4 如何阅读本书 1.5 本书内容的组织 第2章 学习编程的要求 2.1 关于编程者 ...

  10. python数据结构编程_写给Python编程高手之 数据结构

    python视频教程栏目介绍Python编程需要注意的关键点. 如何在列表,字典,集合中根据条件筛选数据 案例:如何在下列列表data中筛选出大于0的数data = [1, -1, 2, 3, 4, ...

最新文章

  1. 菜鸟解读qt源码----qsqlfield.h
  2. [20180606]如何dump数据库里面的汉字.txt
  3. Xilinx IP核专题之PLL IP核介绍(Spartan-6)
  4. php和python对比-从PHP与Python的语言比较去了解什么是图灵完备
  5. 什么是URL?协议头、路径和端口是什么意思?
  6. linux查cpu命令4可以选择哪些运动,Linux 查看cpu 信息的命令及简单实例
  7. JuiceFS 你应该知道的一些事
  8. 苹果手机速度慢_安卓手机用户也想体验一下MagSafe充电器?还是算了吧!
  9. 计算机学院姚茜,武汉理工大学第三届届学位评定委员会
  10. 网件刷breed_网件R6220刷breed变砖的维修
  11. 【5G核心网】 GTP协议
  12. 【网络技术联盟站】瑞哥教你如何使用 Console 接口管理设备
  13. NLP - 词法分析
  14. 电脑所有的浏览器都上不了网怎么解决
  15. Linux-京东字节百度提前批,一面二面都被问到了awk——实例篇(3)查进程,kill指定进程
  16. qq邮箱邮件被拦截如何找回的方法
  17. world表格中画斜线
  18. #453 原汤话原食:除夕夜请热心市民陪我销毁一下烟花爆竹
  19. 思维之道:管理何必那么虚
  20. apipost生成word格式的接口文档,接口文档合并操作

热门文章

  1. pytorch F.conv2d(函数式接口)
  2. SPI总线接口与简单配置
  3. java怎样将多个list写入txt中并且不覆盖原有数据_深入理解JVM,Java程序猿必备修炼之路...
  4. node 没有界面的浏览器_了不起的Node-为什么要学习Nodejs
  5. qt制作漂亮的登录界面,仅供参考
  6. boost::enable_shared_from_this<T>用途
  7. 2020 dns排名_2020年度DNS年度全球直销排名
  8. 解决MobaXterm左侧没有文件列表,没有SCP,不显示文件夹
  9. 构建wifi破解所需的密码库文件
  10. Python3使用bencode库解析BT种子