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

来源:互联网 发布:华为手机数据迁移 编辑:程序博客网 时间:2024/04/30 04:08

注意:

  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;


}


0 0