MFC中如何载入bmp和jpeg格式的图片,并作为文件背景

MFC中如何载入bmp和jpeg格式的图片,并作为文件背景,第1张

通过资源加载BMP位图的方法: CDC m_MemDc//定义一个DC CBitmap m_BkBmp//定义个位图对象 BITMAP m_BmpInfo//定义一个位图信息结构体 CDC *pDc = GetDC()//定义一个DC指针,并指向屏幕DC /*首先在资源里添加位图,此行函数用于将位图数据加载到类对象中*/ m_BkBmp.LoadBitmap(IDB_TEST1/*此处为刚刚添加进来的位图资源ID*/)m_BkBmp.GetBitmap(&m_BmpInfo)//获取位图高宽等信息,保存在位图结构体中 m_MemDc.CreateCompatibleDC(pDc)//创建一个兼容屏幕DC的内存DC:m_MemDc。 m_MemDc.SelectObject(&m_BkBmp)//将该位图选择到刚创建的内存DC中。 /*将内存DC里的东西贴到屏幕DC上去*/ pDc->BitBlt(0,0,m_BmpInfo.bmWidth,m_BmpInfo.bmHeight,&m_MemDc,0,0,SRCCOPY) //这个贴图只贴一次,当你最小化后再还原,刚才的贴图就没了。 以下是通过文件加载BMP位图的方法 CDC m_bgDC//定义一个DC CBitmap m_bgBmp//定义个位图对象 BITMAP m_bgBmpInfo//定义一个位图信息结构体 CRect m_CliRect//定义一个矩形对象,用来保存窗口客户区大小 CDC *pDc = GetDC()//定义一个DC指针,并指向屏幕DC GetClientRect(&m_CliRect)//获取客户去大小,并保存到m_CliRect对象中 /*下面这行为读取位图文件,可以是相对路径,也可以是绝对路径, 如果是相对路径,调试时指相对于工程所在目录,直接执行EXE时,该位图就是相对于该EXE所在目录 */ HBITMAP h_bgBmp = (HBITMAP)::LoadImage(NULL,"位图文件名.bmp",IMAGE_BITMAP,0,0,LR_DEFAULTSIZE|LR_LOADFROMFILE)if (h_bgBmp == NULL) { MessageBox("加载位图失败")return} m_bgBmp.Attach(h_bgBmp)//将读取到的位图数据保存到位图对象中 m_bgBmp.GetBitmap(&m_bgBmpInfo)//获取该位图的大小 m_bgDC.CreateCompatibleDC(pDc)//创建一个兼容于屏幕DC的内存DC m_bgDC.SelectObject(&m_bgBmp)//将该位图选入到刚刚创建的内存DC中。 /*下行函数为将内存DC中的内容贴到屏幕DC中,这里与上面不同的是,先择拉伸贴图,比如你的位图非常小, 而屏幕很大,用上面哪种bitblt函数只是将位图贴在屏幕的左上角,如果用以下函数,会将位图拉伸 铺满整个窗口*/ pDc->StretchBlt(0,0,m_CliRect.Width(),m_CliRect.Height(),&m_bgDC,0,0,m_bgBmpInfo.bmWidth,m_bgBmpInfo.bmHeight,SRCCOPY)//如果想把该位图作为背景一直显示, //针对MFC写的基于对话框的程序, //那么只要在对话框的OnPaint();这个函数中执行StretchBlt或者bitblt //在OnInitDialog();这个函数中做以上的那些初始化,将变量作为对话框类的成员变量; //如此这般就可以在窗口上一直显示你选择的图片了。 //如果是基于文档的程序,方法类似, 总之思路就是: //1 在窗口类中定义以上必须的变量(对象) //2 在窗口的初始化函数中 初始化以上这些变量(对象) //3 在窗口的刷新响应函数中将选择的位图贴图到窗口上 至于加载JPG的,貌似就需要专门的组建了,个人认为jpg那个可以理解为压缩了的位图。想要得到JPG图片中各个点的RGB信息比较麻烦点。

1、把你要加载的图片拷贝到VC的资源文件夹,图片后缀.bmp,然后按Ctrl+R组合键,选择Bitmap,点击import按钮下载图片资源,ID为IDB_BITMAP;

2、添加Picture控件,在属性框中的Type:Bitmap,Image:IDB_BITMA,这样就可以简单的设置界面背景;执行结果无法拷贝!

3、然后把你的代码改为如下的代码:

CDC *memDC=new CDC()

CPaintDC pDC(this)

CBitmap *pBitmap=(CBitmap *)GetDlgItem(IDB_BITMAP)

CRect ChildRect

GetClientRect(&ChildRect)

pBitmap->CreateCompatibleBitmap(pDC,ChildRect.Width(),ChildRect.Height())

memDC->CreateCompatibleDC(pDC)

memDC->SelectObject(pBitmap)

pDC->BitBlt(ChildRect.left,ChildRect.top,ChildRect.Width(),ChildRect.Height(),

memDC,ChildRect.left,ChildRect.top,SRCCOPY)

memDC->DeleteDC()

pDC->DeleteDC()

调试看看有没有错误,若有问题也许是LoadBitmap(),请参考MSDN文档,否则与我联系。

重写WM_ERASEBKGND消息,如下:

头文件:

afx_msg BOOL OnEraseBkgnd(CDC* pDC)

cpp文件:

添加消息映射

BEGIN_MESSAGE_MAP(CxxDialog, CDialog)

ON_WM_ERASEBKGND()

END_MESSAGE_MAP()

重写消息

BOOL CxxDialog::OnEraseBkgnd(CDC* pDC)

{

// CDialog::OnEraseBkgnd(pDC)//忘记要不要执行父类的这个了.

CDC memdc

memdc.CreateCompatibleDC(pDC)

CBitmap bmp

CBitmap *pOldBmp

BITMAP bm//用来保存图片的长宽等信息

bmp.LoadBitmap(IDB_BITMAP1)

bmp.GetBitmap(&bm)

//将图片选进缓冲区

pOldBmp = (CBitmap *)memdc.SelectObject(&bmp)

//如果图片跟对话框的客户区一样大,直接用BitBlt就可以

//pDC->BitBlt(0, 0, rcWnd.Width(), rcWnd.Height(), &memdc, 0, 0, SRCCOPY)

//如果图片比对话框的背景小,就要用StrechBlt来拉伸图片

pDC->StrechBlt(0, 0, rcWnd.Width, rcWnd.Height(), &memdc, 0, 0, bm.bmWidth,bm.bmHeight, SRCCOPY)

//释放DC

memdc.SelectObject(pOldBmp)

memdc.DeleteDC()

return TRUE

}

只是根据记忆写的,你可以自己调试下。推荐学做界面很好的网站给你,上面都是些例子的源码。http://www.vckbase.com/code/


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11693230.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-18
下一篇 2023-05-18

发表评论

登录后才能评论

评论列表(0条)

保存