⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 drawview.cpp

📁 陈建春<用VC++开发GIS系统>源码.适合于GIS学习者,以及学习图形图象编程的朋友.
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	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 + -