文章内容来自:http://www.codeproject.com/gdi/gdionbitmaps.asp
介绍:
本文描述了如何在位图上画线、图形或者文字。要求很简单,可以给初学者的一个方便快速的参考。
用HBITMAP操作位图
首先我们需要一个背景位图,这个位图是通过一个hbitmap句柄引用的。至于hbitmap是如何得到,可以有多种方法:先前操作得到的hbitmap;用CreateBitmap函数创建返回的;或者是通过资源导入的:
HBITMAP hbitmap = ::LoadBitmap(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_BITMAP1));
//LoadBitmap从工程的资源里装载位图,位图的ID为IDB_BITMAP1
然后通过hbitmap句柄,我们可以得到一些关于位图的基本信息:
BITMAP bm; //位图对象结构
GetObject(hbitmap,sizeof(BITMAP),&bm); //返回hbitmap所指位图的基本信息到结构对象bm里
long width=bm.bmWidth;
long height=bm.bmHeight; //得到位图的高度、宽度
接着创建一个内存DC,同时选入一个新的位图
BITMAPINFO bmInfo; //定义位图头结构对象
memset(&bmInfo.bmiHeader,0,sizeof(BITMAPINFOHEADER));
bmInfo.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
bmInfo.bmiHeader.biWidth=width;
bmInfo.bmiHeader.biHeight=height;
bmInfo.bmiHeader.biPlanes=1;
bmInfo.bmiHeader.biBitCount=24;
//创建临时的内存DC对象
HDC pDC = ::GetDC(0);
HDC TmpDC=CreateCompatibleDC(pDC);
//利用位图头结构对象bmInfo创建一个新的位图,同时选入创建的内存DC
BYTE *pbase;
HBITMAP TmpBmp=CreateDIBSection(pDC,&bmInfo,DIB_RGB_COLORS,(void**)&pbase,0,0);
HGDIOBJ TmpObj=SelectObject(TmpDC,TmpBmp);
在创建的TmpDC上我们就可以画线、写文字或者画图。下面的代码就是如何在一个背景位图上写文字:
//把背景位图选入DC设备
HDC dcBmp=CreateCompatibleDC(TmpDC);
HGDIOBJ TmpObj2 = SelectObject(dcBmp,hbitmap); //把hbitmap选入内存DC
BitBlt(TmpDC,0,0,width,height,dcBmp,0,0,SRCCOPY);//复制图片到内存DC
SelectObject(TmpDC,TmpObj2);
DeleteDC(dcBmp);
//选择创建字体
CFont m_Font;
LOGFONT* m_pLF;
m_pLF=(LOGFONT*)calloc(1,sizeof(LOGFONT));
strncpy(m_pLF->lfFaceName,"Times New Roman",31);
m_pLF->lfHeight=64;
m_pLF->lfWeight=600;
m_pLF->lfItalic=1;
m_pLF->lfUnderline=0;
m_Font.CreateFontIndirect(m_pLF);
//用LOGFONT结构创建一种字体
//把创建的字体对象选入DC
CDC dc;
dc.Attach(TmpDC);
CFont* pOldFont=NULL;
if(m_Font.m_hObject) //判断字体创建是否成功
{
//如果创建成功就选入DC
pOldFont = dc.SelectObject(&m_Font);
}
else
{
//如果创建没成功则选入默认的字体
dc.SelectObject(GetStockObject(DEFAULT_GUI_FONT));
}
//设置文本颜色
dc.SetTextColor(RGB(60,120,240));
//设置添加文字的位置
RECT pos = {40,40,0,0};
//添加文字
dc.SetBkMode(TRANSPARENT);
dc.DrawText("Test",4,&pos,DT_CALCRECT);
dc.DrawText("Test",4,&pos,0);
//释放和清除
if (pOldFont)
{
dc.SelectObject(pOldFont);
}
m_Font.DeleteObject();
dc.Detach();
free(m_pLF);
这里有两个两个位图对象:hbitmap和TmpBmp,就能同时保存新旧两个图象,或者用TmpBmp替代
hbitmap:
DeleteObject(hbitmap);
hbitmap=TmpBmp;
最后,我们就能删除临时DC。此时不要删除hbitmap和TmpBmp,否则就可能丢失位图。
//最后的资源清除
SelectObject(TmpDC,TmpObj);
DeleteDC(TmpDC);
结论:
文章开始用一个保存在HBITMAP里的背景图象,最后形成一个新图象,保存在一个新的HBITMAP里。这在操作过程中给了我们很大的灵活性: 可以利用所有的GDI函数创建图象,比如CBitmap,象FreeImage和CxImage这些图形处理库,还可以给图片添加效果或者保存图片到文件。
分享到:
相关推荐
在按钮上使用位图和文字在按钮上使用位图和文字
如今,仍有部分同志在用VC开发大量的程序,但Wwindows自带的实在是简单,在工具条上显示位图,使程序美观,有独到见解
24位彩图转为8位灰度图的C++代码,通过修改位图文件信息头来实现位图转换。
触摸屏位图,需要的看看交流。我也需要位图 触摸屏位图,需要的看看交流。我也需要位图
android 多位图转化为单色位图。32位深图转1位深图。24位深转1位
VC下彩色位图转单色位图,可实现截图,生成位图数据文件。
vc++实现在对话框中预览位图小程序vc++实现在对话框中预览位图小程序vc++实现在对话框中预览位图小程序vc++实现在对话框中预览位图小程序vc++实现在对话框中预览位图小程序vc++实现在对话框中预览位图小程序
易语言位图句柄和位图数据转换源码,位图句柄和位图数据转换,NotifySys,运行时错误,取执行的文件名,位图句柄取数据,数据取位图句柄
易语言位图句柄取位图模块源码,位图句柄取位图模块,NotifySys,运行时错误,取执行的文件名,位图句柄取数据,数据取位图句柄,解锁内存块,释放内存块,取内存块长度,锁定内存块,删除对象,取屏幕句柄
平台:DEV-C++ 5.8.3 语言:C++ 功能: ...就是想用程序在坐标层次控制位图。 2)可用C++在源码级别生成位图,画个小画;读入位图数据,转换位图格式。 3)将图片转化为单片机开发能用到的液晶坐标文件。
VB 翻转放大位图 VB 翻转放大位图 VB 翻转放大位图
在对话框上动态更新位图的程序 程序中用OnTimer定时更新显示的图形
在VC中显示256位图.
vc中如何显示位图vc中如何显示位图vc中如何显示位图vc中如何显示位图vc中如何显示位图
当你把鼠标移动到一个按钮位图上,这个位图变成了另一个位图。
昆仑通泰触摸屏MCGS、MCGS Pro 位图可以直接使用。按钮,指示灯,水泵,阀门,管道等都有
位图工具,用于8583的位图直观显示。 位图工具,用于8583的位图直观显示。 位图工具,用于8583的位图直观显示。
位图操作支持库|位图操作支持库
昆仑通态触摸屏位图图片,包括按钮,背景,眉头一些风格的按键。大约有十几种不同类型的位图。仅供大家参考
改位图类是基于VC++6.0基础上开发的,可以直接使用,也可在其基础上进行开发