📄 drawview.cpp
字号:
if(!OpenClipboard())
return;
HBitmap=::GetClipboardData(CF_BITMAP);
if(HBitmap==NULL)
{
CloseClipboard();
return;
}
Bitmap.Attach(HBitmap);
Bitmap.GetObject(sizeof(BITMAP),&BitmapInfo);
MemDC.CreateCompatibleDC(&ht);
MemDC.SelectObject(&Bitmap);
ht.BitBlt(0,0,BitmapInfo.bmWidth,BitmapInfo.bmHeight,&MemDC,0,0,SRCCOPY);
Bitmap.Detach();
::CloseClipboard();
}
void CDrawView::OnUpdateEditPaste(CCmdUI* pCmdUI)
{
}
void CDrawView::OnActivateView(BOOL bActivate, CView* pActivateView, CView* pDeactiveView)
{
char p1[6];
p_View=this;
CDrawDoc *pDoc=(CDrawDoc *)GetDocument();
p_Screen=pDoc->m_Screen;
CMainFrame* p_Wnd=(CMainFrame *)(AfxGetApp()->m_pMainWnd);
CComboBox* plist=(CComboBox*)(p_Wnd->m_wndDlgBar.GetDlgItem(IDC_COMBO1));
plist->SetCurSel(m_LineType);
sprintf(p1,"%d",(int)m_LineWide);
p_Wnd->m_wndDlgBar.SetDlgItemText(IDC_EDIT1,p1);
CView::OnActivateView(bActivate, pActivateView, pDeactiveView);
}
void CDrawView::OnPrepareDC(CDC* pDC, CPrintInfo* pInfo)
{
if(pInfo==NULL) //如果是屏幕显示
return;
//当前打印页所在的行
pDC->SetMapMode(m_MapMode);
int nRow=pInfo->m_nCurPage/nPageX+(pInfo->m_nCurPage%nPageX);
//当前打印页所在的列
int nCol=(pInfo->m_nCurPage-1)%nPageX+1;
m_xStart=xLeft+(nCol-1)*xPage; //当前页输出的图形左下角的实际横坐标
m_yStart=yTop-nRow*yPage; //当前页输出的图形左下角的实际纵坐标
pDC->SetWindowOrg(0,0);
CView::OnPrepareDC(pDC, pInfo);
}
void CDrawView::OnPrint(CDC* pDC, CPrintInfo* pInfo)
{
char p1[4];
CString strHeader=GetDocument()->GetTitle();
sprintf(p1,"%d",pInfo->m_nCurPage);
strHeader+=" 第";
strHeader+=p1;
strHeader+="页";
POINT point;
m_MapMode=pDC->GetMapMode();
point.x=0;point.y=25;
pDC->DPtoLP(&point);
pDC->SetTextAlign(TA_LEFT);
pDC->TextOut(0,point.y,strHeader);
TEXTMETRIC textMetric;
pDC->GetTextMetrics(&textMetric);
int y;
if(m_MapMode==1)
y=point.y+textMetric.tmHeight;
else
y=point.y-textMetric.tmHeight;
pDC->MoveTo(0,y);
pDC->LineTo(pInfo->m_rectDraw.right,y);
OnDraw(pDC);
}
void CDrawView::DrawBmp1(CDC* pDC,int x,int y,int wide,int high,UINT idCBitmap,int DrawMode)
{
int wide1,high1;
int w_CBitmap,h_CBitmap;
CBitmap Bitmap;
BITMAP BM; //定义一个BITMAP型的结构
CDC pDC1; //定义一个绘图设备对象
//将资源文件中定义的位图资源选入位图对象
Bitmap.LoadBitmap(idCBitmap);
Bitmap.GetObject(sizeof(BM),&BM); //得到位图对象的信息
w_CBitmap=BM.bmWidth; //得到位图的宽度(像素)
h_CBitmap=BM.bmHeight; //得到位图的高度(像素)
if(DrawMode==1) //原样大小显示
{
wide1=w_CBitmap;
high1=h_CBitmap;
}
else if(DrawMode==2)//按参数给定的区域显示,纵横伸缩比例一样
{
float bl1=(float)wide/w_CBitmap;
float bl2=(float)high/h_CBitmap;
if(bl1>bl2)
{
high1=high;
wide1=(int)(bl2*wide);
}
else
{
wide1=wide;
high1=(int)(bl1*high);
}
}
else if(DrawMode==3) //严格按参数给定的区域显示
{
wide1=wide;
high1=high;
}
//创建一个与绘图设备兼容的内存设备描述对象
pDC1.CreateCompatibleDC(pDC);
pDC1.SelectObject(&Bitmap); //将位图选入内存设备描述对象
//将内存设备描述对象的位图拷贝到屏幕上
pDC->StretchBlt(x,y,wide1,high1,&pDC1,0,0,w_CBitmap,h_CBitmap,SRCCOPY);
Bitmap.DeleteObject(); //删除位图对象
}
void CDrawView::DrawBmp2(CDC* pDC,int x,int y,int wide,int high,char *fName,int DrawMode)
{
char p1[80];
BITMAPFILEHEADER fileh; //定义一个文件标题结构
LPBITMAPINFOHEADER fileh1; //定义一个信息标题结构
CFile FileBmp;
CBitmap* pOldMap;
CDC pDC1; //定义一个设备描述表
int i,wide1,high1,maxread;
short int bytes_per_line;
unsigned char *BmpChar;
long bmpsize;
maxread=64*512;
BOOL YN=FileBmp.Open(fName,CFile::typeBinary|CFile::modeRead);
if(YN==0) //如果文件打开错误,给出出错信息
{
strcpy(p1,"位图文件");
strcpy(p1,fName);
strcat(p1,"不存在");
AfxMessageBox(p1);
return;
}
//以下读入位图的文件标题
FileBmp.Read((unsigned char *)&fileh,sizeof(fileh));
if(fileh.bfType!=19778) //判断是否是一个位图文件,19778是"BM"的数值
{
//如果不是一个位图文件,加入提示信息,关闭文件退出
FileBmp.Close();
strcpy(p1,"文件");
strcat(p1,fName);
strcat(p1,"不是一个位图文件");
AfxMessageBox(p1);
return;
}
bmpsize=fileh.bfSize-sizeof(BITMAPFILEHEADER);
bmpdata=GlobalAllocPtr(GHND,bmpsize);
if(bmpdata==0)
return;
BmpChar=new unsigned char[maxread];
if(BmpChar==NULL)
{
GlobalFreePtr(bmpdata);
return;
}
unsigned char *data=(unsigned char *)bmpdata;
int chunksize;
while(bmpsize)
{
if(bmpsize>maxread)
chunksize=maxread;
else
chunksize=bmpsize;
FileBmp.Read(BmpChar,chunksize);
for(i=0;i<chunksize;i++)
data[i]=BmpChar[i];
bmpsize-=chunksize;
data+=chunksize;
}
fileh1=(LPBITMAPINFOHEADER)bmpdata;
bytes_per_line=((long)fileh1->biWidth*(long)fileh1->biBitCount+31L)/32*4;
if(fileh1->biSize==12)
return;
if(fileh1->biClrUsed!=0)
nPalate=fileh1->biClrUsed;
else
{
switch(fileh1->biBitCount)
{
case 1:
nPalate=2;
break;
case 4:
nPalate=16;
break;
case 8:
nPalate=256;
break;
case 24:
nPalate=0;
break;
default:
nPalate=2;
break;
}
}
bhm_ddb=0;
if(fileh1!=NULL)
{
if(hpal==0&&nPalate>0)//如果调色板颜色数量大于0
{
make_palette();
}
if(bhm_ddb==0)
DIBtoDDB(pDC->GetSafeHdc());
}
if(DrawMode==1) //原样大小显示
{
wide1=fileh1->biWidth;
high1=fileh1->biHeight;
}
else if(DrawMode==2)//按参数给定的区域显示,纵横伸缩比例一样
{
float bl1=(float)wide/fileh1->biWidth;
float bl2=(float)high/fileh1->biHeight;
if(bl1>bl2)
{
high1=high;
wide1=(int)(bl2*wide);
}
else
{
wide1=wide;
high1=(int)(bl1*high);
}
}
else if(DrawMode==3) //严格按参数给定的区域显示
{
wide1=wide;
high1=high;
}
if(bhm_ddb!=0)
{
pDC1.CreateCompatibleDC(pDC);
pOldMap=pDC1.SelectObject(CBitmap::FromHandle(bhm_ddb));
//将内存设备描述对象中的图像映射到在屏幕中的显示区域
pDC->StretchBlt(x,y,wide1,high1,&pDC1,0,0,fileh1->biWidth,fileh1->biHeight,SRCCOPY);
pDC1.SelectObject(pOldMap);
}
delete BmpChar; //释放字符串空间
FileBmp.Close(); //关闭文件
return ;
}
void CDrawView::DIBtoDDB(HDC hdc)
{
LPBITMAPINFOHEADER p_bminfo=(LPBITMAPINFOHEADER)(bmpdata);
if(p_bminfo==0)
return;
if(bhm_ddb!=0)
DeleteBitmap(bhm_ddb);
LPSTR p_image=(LPSTR)p_bminfo+sizeof(BITMAPINFOHEADER)+nPalate*sizeof(RGBQUAD);
HPALETTE hpalold=NULL;
if(hpal)
{
hpalold=SelectPalette(hdc,hpal,FALSE);
RealizePalette(hdc);
}
bhm_ddb=CreateDIBitmap(hdc,p_bminfo,CBM_INIT,p_image,(LPBITMAPINFO)p_bminfo,DIB_RGB_COLORS);
if(hpalold)
SelectPalette(hdc,hpalold,FALSE);
}
void CDrawView::make_palette()
{
LPBITMAPINFOHEADER p_bminfo=(LPBITMAPINFOHEADER)bmpdata;
if(hpal!=0)DeletePalette(hpal);
if(nPalate>0)
{
LPLOGPALETTE cp=(LPLOGPALETTE)GlobalAllocPtr(GHND,sizeof(LOGPALETTE)+nPalate*sizeof(PALETTEENTRY));
if(cp!=NULL)
{
cp->palVersion=0x0300;
cp->palNumEntries=nPalate; //设置调色板入口
LPBITMAPINFO p_bi=(LPBITMAPINFO)p_bminfo;
for(int i=0;i<nPalate;i++) //将调色板信息装入RGBQUAD结构,注意颜色的顺序变化
{
cp->palPalEntry[i].peRed=p_bi->bmiColors[i].rgbRed;
cp->palPalEntry[i].peGreen=p_bi->bmiColors[i].rgbGreen;
cp->palPalEntry[i].peBlue=p_bi->bmiColors[i].rgbBlue;
}
hpal=CreatePalette(cp); //创建逻辑调色板
GlobalFreePtr(cp);
}
}
}
void CDrawView::DrawBmp3(CDC* pDC,int x,int y,int wide,int high,char *fName,int DrawMode)
{
char p1[80];
CRect r;
BITMAPFILEHEADER fileh; //定义一个文件标题结构
BITMAPINFOHEADER fileh1; //定义一个信息标题结构
CBitmap Bitmap,*pOldMap; //定义一个位图对象
CDC pDC1; //定义一个设备描述表
unsigned char *BmpChar;
int minx,miny,maxx,maxy,BmpStartX,BmpStartY,BmpEndX,BmpEndY;
int i,j,xh,i1,j1,c1,c2,c3,nPalate;
int IsCompress,bicount,bytes_per_line,wide1,high1;
long filecd,boff,boxmfile1;
float pbX,pbY;
CPalette palatte,*pOldPalatte; //定义一个调色板结构
LOGPALETTE* cp; //定义一个逻辑调色板结构
RGBQUAD bmicolors[256]; //
CFile FileBmp;
BOOL YN=FileBmp.Open(fName,CFile::typeBinary|CFile::modeRead);
if(YN==0) //如果文件打开错误,给出出错信息
{
strcpy(p1,"位图文件"); strcpy(p1,fName);
strcat(p1,"不存在");
AfxMessageBox(p1);
return;
}
//以下读入位图的文件标题
FileBmp.Read((unsigned char *)&fileh,sizeof(fileh));
if(fileh.bfType!=19778) //判断是否是一个位图文件,19778是"BM"的数值
{
FileBmp.Close();
strcpy(p1,"文件"); strcat(p1,fName);
strcat(p1,"不是一个位图文件");
AfxMessageBox(p1);
return;
}
boff=fileh.bfOffBits; //文件头的长度,文件从开始到实际位图起点的字节偏移量
filecd=fileh.bfSize; //位图文件的大小
FileBmp.Read((unsigned char *)&fileh1,sizeof(fileh1));//读入信息标题
GetClientRect(&r);
if(DrawMode==1) //原样大小显示
{
wide1=fileh1.biWidth;
high1=fileh1.biHeight;
}
else if(DrawMode==2)//按参数给定的区域显示,纵横伸缩比例一样
{
float pbX=(float)wide/fileh1.biWidth;
float pbY=(float)high/fileh1.biHeight;
if(pbX>pbY)
{
high1=high;
wide1=(int)(pbY*wide);
}
else
{
wide1=wide;
high1=(int)(pbX*high);
}
}
else if(DrawMode==3) //严格按参数给定的区域显示
{
wide1=wide;
high1=high;
}
bicount=fileh1.biBitCount; //位图的位面数
IsCompress=fileh1.biCompression; //是否进行压缩
filecd=fileh1.biSizeImage; //图像尺寸大小
bytes_per_line=((long)fileh1.biWidth*bicount+31L)/32*4;
if(fileh1.biClrUsed==0) //如果颜色索引数等于0
{
if(bicount!=24) //如果不是24位位图
nPalate=(int)(pow(2,bicount)); //得到调色板颜色数
else
nPalate=0; //如果是24位位图,调色板颜色数为0
}
else //如果颜色索引数不等于0
{
if(bicount!=24)
nPalate=fileh1.biClrUsed;//直接得到调色版数量
else
nPalate=0;
}
if(nPalate>0)//如果调色板颜色数量大于0
{
for(i=0;i<nPalate;i++) //读入调色板信息
FileBmp.Read((unsigned char *)&bmicolors[i],sizeof(bmicolors[i]));
//以下是装入逻辑调色板的工作
cp=(LOGPALETTE *)malloc(sizeof(LOGPALETTE)+nPalate*sizeof(PALETTEENTRY));
cp->palNumEntries=nPalate; //设置调色板入口
cp->palVersion=0x0300;
for(i=0;i<nPalate;i++) //将调色板信息装入RGBQUAD结构,注意颜色的顺序变化
{
cp->palPalEntry[i].peRed=bmicolors[i].rgbRed;
cp->palPalEntry[i].peGreen=bmicolors[i].rgbGreen;
cp->palPalEntry[i].peBlue=bmicolors[i].rgbBlue;
}
palatte.CreatePalette(cp); //
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -