
以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)
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)