📄 dibdoc.cpp
字号:
// DIBDoc.cpp : implementation of the CDIBDoc class
//
#include "stdafx.h"
#include "DIB.h"
#include "DIBView.h"
//#include "AttributiDia.h "
#include "DIBDoc.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CDIBDoc
IMPLEMENT_DYNCREATE(CDIBDoc, CDocument)
BEGIN_MESSAGE_MAP(CDIBDoc, CDocument)
//{{AFX_MSG_MAP(CDIBDoc)
ON_COMMAND(ID_FILE_OPEN, OnFileOpen)
ON_COMMAND(ID_8TO24, On8to24)
ON_COMMAND(ID_SAVE, OnSave)
ON_COMMAND(ID_BACK, OnBack)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CDIBDoc construction/destruction
CDIBDoc::CDIBDoc()
{
pdib=NULL;
pdib=NULL;
Flag=0;
pfileheader=NULL;
// TODO: add one-time construction code here
}
CDIBDoc::~CDIBDoc()
{
}
BOOL CDIBDoc::OnNewDocument()
{
if (!CDocument::OnNewDocument())
return FALSE;
// TODO: add reinitialization code here
// (SDI documents will reuse this document)
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
// CDIBDoc serialization
void CDIBDoc::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
// TODO: add storing code here
}
else
{
// TODO: add loading code here
}
}
/////////////////////////////////////////////////////////////////////////////
// CDIBDoc diagnostics
#ifdef _DEBUG
void CDIBDoc::AssertValid() const
{
CDocument::AssertValid();
}
void CDIBDoc::Dump(CDumpContext& dc) const
{
CDocument::Dump(dc);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CDIBDoc commands
void CDIBDoc::OnFileOpen()
{
CFile file;
CFileException fe;
CString filename;
CString strOpenFilter="位图文件(*.bmp;*.dib)|*.bmp;*dib|所有文件(*.*)|*.*||";
CFileDialog FileDlg(TRUE,"*.bmp",NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,strOpenFilter);
if(FileDlg.DoModal()==IDOK)
{
filename.Format("%s",FileDlg.GetPathName());
file.Open(filename,CFile::modeRead|CFile::shareDenyWrite,&fe);
BITMAPFILEHEADER bmfHeader;
dwBitsSize=file.GetLength();
file.Read((LPSTR)&bmfHeader,sizeof(bmfHeader));//读入数据
if(bmfHeader.bfType!=0x4d42)
{
CString strMsg;
strMsg="这不是BMP图";
MessageBox(NULL,strMsg,NULL,MB_ICONINFORMATION|MB_OK);
file.Close();
return;
}
file.Close();
if(!file.Open(filename,CFile::modeRead|CFile::shareDenyWrite,&fe))
{
return;
}
// pdib=(LPSTR)malloc(dwBitsSize*sizeof(LPSTR));
pdib=(LPSTR)malloc(dwBitsSize*sizeof(BYTE));
file.Read((BYTE*)pdib,dwBitsSize);
file.Close();
// WORD w=bitinfo->bfType;
Width=DIBWidth();
Height=DIBHeight();
BitData=FindData();
BitInfo=pdib+sizeof(BITMAPFILEHEADER);
Oldpdib=pdib;
OldInfo=BitInfo;
OldData=BitData;
Flag=1;
CString str;
str.Format("这是文档");
UpdateAllViews(NULL);
return;
}
return;
}
LONG CDIBDoc::DIBWidth()
{
BITMAPINFOHEADER *bitinfo=(BITMAPINFOHEADER*)(pdib+sizeof(BITMAPFILEHEADER));
return bitinfo->biWidth;
}
LONG CDIBDoc::DIBHeight()
{
BITMAPINFOHEADER *bitinfo=(BITMAPINFOHEADER*)(pdib+sizeof(BITMAPFILEHEADER));
return bitinfo->biHeight;
}
BYTE* CDIBDoc::FindData()
{
int num;
BITMAPINFOHEADER *bitinfo=(BITMAPINFOHEADER*)(pdib+sizeof(BITMAPFILEHEADER));
bitnum=bitinfo->biBitCount;
/* switch(bitnum)
{
case 1 : num=2;
case 4 : num=16;
case 8 : num=256;
default : num=0;
}*/
num=(int)((BITMAPFILEHEADER*)pdib)->bfOffBits;
return (BYTE*)pdib+num;
// return pdib+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+num*sizeof(RGBQUAD);
}
void CDIBDoc::On8to24()
{
BITMAPFILEHEADER *pbitfile=(BITMAPFILEHEADER*)pdib;
BITMAPINFOHEADER *pbitinfo=(BITMAPINFOHEADER*)BitInfo;
if((pbitinfo->biBitCount)!=8)
{
AfxMessageBox("这不是256色位图!");
return;
}
// BITMAPFILEHEADER
pfileheader=(BITMAPFILEHEADER*) malloc(sizeof(BITMAPFILEHEADER));
pfileheader->bfType=0X4D42;
pfileheader->bfSize=Height*Width*3+(Width*3)%4*Height+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);
pfileheader->bfReserved1=0;
pfileheader->bfReserved2=0;
pfileheader->bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);
// BITMAPINFOHEADER
pinfoheader=(BITMAPINFOHEADER*) malloc(sizeof(BITMAPINFOHEADER));
pinfoheader->biSize=sizeof(BITMAPINFOHEADER);
pinfoheader->biWidth=Width;
pinfoheader->biHeight=Height;
pinfoheader->biPlanes=1;
pinfoheader->biBitCount=24;
pinfoheader->biCompression=0;
pinfoheader->biSizeImage=Height*Width*3+(Width*3)%4*Height;
pinfoheader->biXPelsPerMeter=pinfoheader->biXPelsPerMeter;
pinfoheader->biYPelsPerMeter=pinfoheader->biYPelsPerMeter;
pinfoheader->biClrUsed=0;
pinfoheader->biClrImportant=0;
LPSTR palette=pdib+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);
pdata=(BYTE*)malloc(sizeof(BYTE)*Width*Height*3+(Width*3)%4*Height);
BYTE r,g,b,l;
int ih,iw,sum,num1,num2,i;
num1=Width%4;
for(ih=0;ih<Height;ih++)
{
for(iw=0;iw<Width;iw++)
{
l=*(BitData+ih*Width+iw+num1*ih);
b=*(palette+l*4);
g=*(palette+l*4+1);
r=*(palette+l*4+2);
*pdata++=b;
*pdata++=g;
*pdata++=255;
}
for(i=0;i<(Width*3)%4;i++)
{
*pdata++=0;
}
}
pdata=pdata-Width*Height*3-(Width*3)%4*Height;
pdib=(LPSTR)pfileheader;
BitData=pdata;
BitInfo=(LPSTR)pinfoheader;
UpdateAllViews(NULL);
return;
}
void CDIBDoc::OnSave()
{
if(pfileheader==NULL)
{
AfxMessageBox("还没有经过处理");
return;
}
CString filename;
CString strOpenFilter="位图文件(*.bmp)|*.bmp|所有文件(*.*)|*.*||";
CFileDialog FileDlg(FALSE,"*.bmp",NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,strOpenFilter);
if(FileDlg.DoModal()==IDOK)
{
filename.Format("%s",FileDlg.GetPathName());
CFile file;
CFileException fe;
if(!file.Open(filename,CFile::modeCreate|CFile::modeReadWrite|CFile::shareExclusive,&fe))
{
return;
}
CString str;
str.Format(filename);
file.Write((LPSTR)pfileheader,sizeof(BITMAPFILEHEADER));
file.Write((LPSTR)pinfoheader,sizeof(BITMAPINFOHEADER));
file.Write((LPSTR)pdata, sizeof(BYTE)*Width*Height*3+(Width*3)%4*Height);
file.Close();
return;
}
return;
}
void CDIBDoc::OnBack()
{
pdib=Oldpdib;
BitData=OldData;
BitInfo=OldInfo;
UpdateAllViews(NULL);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -