用MFC添加一张本地图片作为窗口背景,如何实现,求具体代码

用MFC添加一张本地图片作为窗口背景,如何实现,求具体代码,第1张

首先把图片格式转化为位图

以vs2010为例:

*.Dlg.cpp文件中添加

/////////////////////////////////////////////////////////////////

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[]=__FILE__

#define new DEBUG_NEW

#endif

HBITMAP bit

HDC MemDC

int w,h

CString cc

BOOL loadbmp(CString cc)

{

DeleteObject(bit)

bit=(HBITMAP)LoadImage(AfxGetInstanceHandle(),cc,IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION)

if(bit==NULL)return FALSE

DIBSECTION ds

BITMAPINFOHEADER &bm=ds.dsBmih

GetObject(bit,sizeof(ds),&ds)

w=bm.biWidth

h=bm.biHeight

return TRUE

}

//////////////////////////////////////////////////以上代码放在开头作为全局变量的定义和函数的定义

//在:OnPaint()函数的else中添加:

CClientDC dc(this)

MemDC=CreateCompatibleDC(dc.m_hDC)

cc="C:/bg3.bmp"//图片路径

if(loadbmp(cc)==FALSE)

{

AfxMessageBox(cc+" not finding!")

return

}

SelectObject(MemDC,bit)

BitBlt(dc.m_hDC,0,0,w,h,MemDC,0,0,SRCCOPY)

DeleteDC(MemDC)

即可

这个只是加载图片的方法,但还没涉及到图片的放大和缩小的问题。

如果放大和缩小都会对图片造成失真。

解决方法一:对于有复杂纹理的图片,只能用一张比窗口大的图片,来进行裁切,以适应该窗口的大小。注意是裁切,不是拉伸。

解决方法二:对于没有纹理的图片,就用裁切加图片重新组合的方式,来适应窗口大小。这个实现方式,请参考以下博客,图片格式的进度条:

http://blog.csdn.net/renstarone/article/details/9230763

方法一:

1、声明成员变量CBrush m_brush

2、在InitDialog中添加代码:

CBitmap bmp

bmp.LoadBitmap(IDB_BITMAP1)//这个IDB_BITMAP1要自己添加

m_brush.CreatePatternBrush(&bmp)

3、重载对话框的OnCtlColor,改最后的返回值:

return (HBRUSH)m_brush

方法二:

把下面这段代码加进OnPaint()里就行了

CPaintDC dc(this)

CBitmap bitmap

bitmap.LoadBitmap(IDB_BITMAP1)//这个IDB_BITMAP1要自己添加

CBrush brush

brush.CreatePatternBrush(&bitmap)

CBrush* pOldBrush =dc.SelectObject(&brush)

dc.Rectangle(0,0,200,200)// 这些参数可以调整图片添加位置和大小

dc.SelectObject(pOldBrush)

方法三:使用StretchBlt()函数,具有图像自适应窗体功能

CPaintDC dc(this)

CBitmap m_bmpBK

m_bmpBK.LoadBitmap(IDB_BITMAP1)

CRect rect

GetClientRect(&rect)//获得目标尺寸,即窗口客户区的坐标

BITMAP bitMap//位图结构体

m_bmpBK.GetBitmap(&bitMap)//获得原图片尺寸

CDC dcMem//目标DC

dcMem.CreateCompatibleDC(&dc)//创建与dc兼容的内存DC

dcMem.SelectObject(&m_bmpBK)//将位图对象m_bmpBK选入内存DC

dc.StretchBlt(0,0,rect.Width(),rect.Height(),&dcMem,0,0,bitMap.bmWidth,bitMap.bmHeight,SRCCOPY)


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

原文地址:https://54852.com/bake/11426134.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存