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