-
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;
}
-
本文介绍了一个简单的GDI应用程序,演示了如何使用GDI进行位图的基本操作,包括位图的加载、缩放、透明处理、背景透明、旋转及移动等功能。通过示例代码帮助初学者快速上手。
636

被折叠的 条评论
为什么被折叠?



