您的位置:首页 > 其它

MFC 实现对话框 背景贴图的几种方式

2015-03-23 18:21 411 查看
注意:

1.使用软件为VS2010

2.头文件包含如下定义

//背景图存放路劲

#define BACK_GROUND_BMP TEXT("res\\BACKGROUND.bmp")

#define WBACK_GROUND_BMP L"res\\BACKGROUND.bmp"

#define BACK_GROUND_PNG TEXT("res\\BACKGROUND.png")

#define WBACK_GROUND_PNG L"res\\BACKGROUND.png"

3.使用GDI作图的部分,需在程序的相应地方初始化GDI,具体代码这里百度搜一下,很多的。

4.代码中CSkingDlg继承自CDialogEX,MFC的对话框都继承自CSKingDlg

部分代码如下:(DirectX在实现中,其它几种经验证,成功)

void CSkinDlg::OnPaint()

{

CPaintDC dc(this);

DrawBackGround(&dc); //绘画背景

}

void CSkinDlg::DrawBackGround(CPaintDC* dc)

{

try

{

//WINDOW API(静态加载)

//DrawBackGround_Static(dc);

//WINDOW API(动态加载)

//DrawBackGround_Dynamic(dc);

//GDI image

//DrawBackGround_GdiImage(dc);

//GDI CImage

//DrawBackGround_GdiCImage(dc);

//GDI stream

//DrawBackGround_GdiStream(dc);

//DirectX

}

catch(...)

{

}

void CSkinDlg::DrawBackGround_Static(CPaintDC* dc)

{

if(NULL==dc) return;

CDC dcMem;

if(!dcMem.CreateCompatibleDC(dc)) return;

CBitmap bitMap;

if(!bitMap.LoadBitmap(IDB_BACKGROUND)) return;

CRect rect;

GetClientRect(&rect);

BITMAP bitMapInfo;

if(0==bitMap.GetBitmap(&bitMapInfo)) return;

CBitmap *OldBitMap=dcMem.SelectObject(&bitMap);

dc->StretchBlt(0,0,rect.Width(),rect.Height(),&dcMem,0,0,bitMapInfo.bmWidth,bitMapInfo.bmHeight,SRCCOPY);

dcMem.SelectObject(OldBitMap);

dcMem.DeleteDC();

bitMap.DeleteObject();

}

void CSkinDlg::DrawBackGround_Dynamic(CPaintDC* dc)

{

if(NULL==dc) return;

CDC dcMem;

if(!dcMem.CreateCompatibleDC(dc)) return;

CBitmap BitMap;

BitMap.m_hObject=(HBITMAP)LoadImage( NULL, BACK_GROUND_BMP, IMAGE_BITMAP, 0, 0,

LR_CREATEDIBSECTION | LR_DEFAULTSIZE | LR_LOADFROMFILE );

if(NULL==BitMap.m_hObject) return;

BITMAP bitMapInfo;

if(GetObject(BitMap.m_hObject,sizeof(BITMAP),&bitMapInfo)==0) return;

CRect rect;

GetClientRect(&rect);

CBitmap* pOldBitMap=dcMem.SelectObject(&BitMap);

dc->StretchBlt(0,0,rect.Width(),rect.Height(),&dcMem,0,0,bitMapInfo.bmWidth,bitMapInfo.bmHeight,SRCCOPY);

dcMem.SelectObject(pOldBitMap);

dcMem.DeleteDC();

BitMap.DeleteObject();

}

void CSkinDlg::DrawBackGround_GdiImage(CPaintDC* dc)

{

if(NULL==dc) return;

CDC *dcGdi=dc;

Graphics graphics(dcGdi->m_hDC);

Image image(WBACK_GROUND_BMP);

CRect rect;

GetClientRect(&rect);

graphics.DrawImage(&image,0,0,rect.Width(),rect.Height());

}

void CSkinDlg::DrawBackGround_GdiCImage(CPaintDC* dc)

{

if(NULL==dc) return;

CDC *dcGdi=dc;

CRect rect;

GetClientRect(&rect);

CImage image;

if(image.Load(BACK_GROUND_PNG)!=S_OK) return;

image.Draw(dcGdi->GetSafeHdc(),0,0,rect.Width(),rect.Height());

image.ReleaseDC();

}

void CSkinDlg::DrawBackGround_GdiStream(CPaintDC* dc)

{

if(NULL==dc) return;

//变量定义

Image *image=NULL;

HRSRC hResource=NULL;

HGLOBAL hGlobal=NULL;

IStream * pIStream=NULL;

HMODULE hInstance=GetModuleHandle(NULL);

//加载位图

try

{

//查找资源

hResource=FindResource(hInstance,MAKEINTRESOURCE(IDB_BACKGROUND_PNG),TEXT("PNG"));

if (hResource==NULL) throw 0;

//加载资源

hGlobal=LoadResource(hInstance,hResource);

if (hGlobal==NULL) throw 0;

//读取资源

LPVOID pImageBuffer=LockResource(hGlobal);

DWORD dwImageSize=SizeofResource(hInstance,hResource);

//创建数据

CreateStreamOnHGlobal(NULL,TRUE,&pIStream);

if (pIStream==NULL) throw 0;

//写入数据

pIStream->Write(pImageBuffer,dwImageSize,NULL);

//创建位图

image=Image::FromStream(pIStream);

if ((image==NULL)||(image->GetLastStatus()!=Ok)) throw 0;

//释放资源

if (pIStream!=NULL) pIStream->Release();

//是否资源

if (hGlobal!=NULL)

{

UnlockResource(hGlobal);

FreeResource(hGlobal);

}

}

catch (...)

{

//释放资源

if (pIStream!=NULL) pIStream->Release();

//是否资源

if (hGlobal!=NULL)

{

UnlockResource(hGlobal);

FreeResource(hGlobal);

}

return;

}

CDC *dcGdi=dc;

Graphics graphics(dcGdi->GetSafeHdc());

CRect rect;

GetClientRect(&rect);

graphics.DrawImage(image,0,0,rect.Width(),rect.Height());

}

void CSkinDlg::DrawBackGround_DX(CPaintDC* dc)

{

if(NULL==dc) return;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: