GDI对位图文件的基本处理

-

GDI的功能是十分强大的.而大多有人形容它就像VB与C/C++比较一样 但VB也是很优秀的东西 我是这么认为 所以 在你一般的图形编程中使用GDI应该是很不错的选择.

 

下面写了一个简单的GDI应用程序 实现对位图的基本操作 有助于GDI编程的入门.快速的了解对位图操作的功能.

 

 

 

示例源码下载

 

//最简单的贴图代码(将硬盘中的一个Bmp图像显示于窗体中)

{

 //创建内存DC
 CDC m_DC;
 m_DC.CreateCompatibleDC(NULL);

 BITMAP  btm;//图像信息

 //从硬盘载入位图
 HBITMAP hBitmap=(HBITMAP)::LoadImage(NULL,"WrWOLF.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);
 if (hBitmap)
 {

  ::GetObject(hBitmap,sizeof(btm),&btm);//获取图像信息
  //将位图选入内存DC
  SelectObject(m_DC,hBitmap);//将载入的图像选入DC(相当于绘制到DC对象)
  DeleteObject(hBitmap);//删除位图对象 否则会内存泄漏

  //CWnd* pWnd = AfxGetApp()->GetMainWnd();//如果这是与窗体无关函数 要使用全局函数来获取窗体DC
  //CClientDC dc(pWnd);//获取窗体DC
  CClientDC dc(this);//获取窗体DC(与窗体有关)

  dc.BitBlt(20,30,btm.bmWidth,btm.bmHeight,&m_DC,0,0,SRCCOPY);//这个函数是GDI处理中非常重要的函数 功能是将某个DC中的图像画到另一个DC中.


 }else{
  return;
 }

 

}

 

以上那段代码 只要指定里面的位图文件路径即可起效 这是最简单的一个窗体贴图过程.

 

 

程序中部分代码 分别实现了位图的载入,缩放,透明,背景透明,旋转,移动等基本操作.

//从硬盘载个一个BMP位图显示于窗体中
//[1]创建内存DC.[2]载入位图.[3].绘制到窗体

void CGDIDemoDlg::OnButtonShow() 
{
	OnButtonClear();

	CString filePath;
	m_comboName.GetLBText(m_comboName.GetCurSel(),filePath);

	//从硬盘载入位图
	HBITMAP hBitmap=(HBITMAP)::LoadImage(NULL/*AfxGetInstanceHandle()*/,filePath/*这里是图像文件的路径 现在为程序根目录*/,IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);
	if (hBitmap)
	{
		::GetObject(hBitmap,sizeof(btm),&btm);//获取图像信息
		//将位图选入内存DC
		SelectObject(m_DC,hBitmap);//将载入的图像选入DC(相当于绘制到DC对象)
		DeleteObject(hBitmap);//删除位图对象 否则会内存泄漏

		//CWnd* pWnd = AfxGetApp()->GetMainWnd();//如果这是与窗体无关函数 要使用全局函数来获取窗体DC
		//CClientDC dc(pWnd);//获取窗体DC
		CClientDC dc(this);//获取窗体DC(与窗体有关)

		dc.BitBlt(xX,yY,btm.bmWidth,btm.bmHeight/*这里使用了图像原始大小 你可以自己修改控制图像大小*/,&m_DC,0,0,SRCCOPY);//这个函数是GDI处理中非常重要的函数 功能是将某个DC中的图像画到另一个DC中.


	}else{
		return;
	}

}




void CGDIDemoDlg::OnButtonClear() 
{
	//ReleaseDC(&m_DC);//释放内存DC
	Invalidate();
	UpdateWindow();
}





void CGDIDemoDlg::OnCheck2() 
{
	OnButtonClear();

	CClientDC dc(this);

	if (((CButton*)GetDlgItem(IDC_CHECK2))->GetCheck())
	{
		TransparentBlt(dc,xX,yY,btm.bmWidth,btm.bmHeight,m_DC,0,0,btm.bmWidth,btm.bmHeight,RGB(0,0,0));	
	}else{
		dc.BitBlt(xX,yY,btm.bmWidth,btm.bmHeight/*这里使用了图像原始大小 你可以自己修改控制图像大小*/,&m_DC,0,0,SRCCOPY);//这个函数是GDI处理中非常重要的函数 功能是将某个DC中的图像画到另一个DC中.
	}
}




void CGDIDemoDlg::OnReleasedcaptureSlider1(NMHDR* pNMHDR, LRESULT* pResult) 
{
	//清除原来的图像
	OnButtonClear();

	CClientDC dc(this);//获取窗体DC

	BLENDFUNCTION rBlendProps; 
	rBlendProps.BlendOp = AC_SRC_OVER; 
	rBlendProps.BlendFlags = 0; 
	rBlendProps.AlphaFormat = 0;
	
	
	rBlendProps.SourceConstantAlpha = m_sliderCtrl.GetPos();//透明度,0表示不显示,255则完全显示
	
	AlphaBlend( dc, xX, yY,btm.bmWidth,btm.bmHeight,m_DC, 0, 0,btm.bmWidth,btm.bmHeight, rBlendProps );

	*pResult = 0;
}



void CGDIDemoDlg::OnReleasedcaptureSlider2(NMHDR* pNMHDR, LRESULT* pResult) 
{
	OnButtonClear();

	CClientDC dc(this);//获取窗体DC

	StretchBlt(dc,xX,yY,btm.bmWidth/2*m_sliderCtrlSize.GetPos(),btm.bmHeight/2*m_sliderCtrlSize.GetPos(),m_DC,0,0,btm.bmWidth,btm.bmHeight,SRCCOPY);	

	*pResult = 0;
}

void CGDIDemoDlg::OnReleasedcaptureSlider3(NMHDR* pNMHDR, LRESULT* pResult) 
{

	OnButtonClear();

	CClientDC dc(this);

	//反转图像
	switch(m_sliderCtrlChange.GetPos())
	{
	case 0:
		StretchBlt(dc, xX, yY, btm.bmWidth,btm.bmHeight, m_DC,btm.bmWidth-1, 0, -btm.bmWidth,btm.bmHeight, SRCCOPY );
		break;
	case 1:
		StretchBlt(dc, xX, yY, btm.bmWidth,btm.bmHeight, m_DC,0, btm.bmHeight-1, btm.bmWidth,-btm.bmHeight, SRCCOPY );
		break;
	default:;
	}


	*pResult = 0;
}



void CGDIDemoDlg::OnReleasedcaptureSlider4(NMHDR* pNMHDR, LRESULT* pResult) 
{
	OnButtonClear();

	CClientDC dc(this);

	dc.BitBlt(xX+m_sliderCtrlX.GetPos(),yY+m_sliderCtrlY.GetPos(),btm.bmWidth,btm.bmHeight,&m_DC,0,0,SRCCOPY);


	*pResult = 0;
}

void CGDIDemoDlg::OnReleasedcaptureSlider5(NMHDR* pNMHDR, LRESULT* pResult) 
{
	OnButtonClear();

	CClientDC dc(this);

	dc.BitBlt(xX+m_sliderCtrlX.GetPos(),yY+m_sliderCtrlY.GetPos(),btm.bmWidth,btm.bmHeight,&m_DC,0,0,SRCCOPY);

	*pResult = 0;
}
-

                
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值