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;
}
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;
}
相关文章推荐
- 基于对话框的MFC程序实现RTL风格的一种方式
- android几种不同对话框的实现方式
- MFC对话框背景贴图
- MFC 中 Tooltip 实现的几种方式
- MFC 中 Tooltip 实现的几种方式
- MFC程序实现给对话框加入�背景图片
- Flex程序实现背景贴图的两种方式 Two ways to implement sexy background/border for containers
- java中弹出式对话框的几种实现方式
- MFC访问对话框控件的几种方式
- MFC 中 Tooltip 实现的几种方式
- MFC几种给对话框添加背景图的方法
- MFC 中 Tooltip 实现的几种方式
- MFC如何用正确的方式来实现鼠标移动对话框。
- MFC对话框控件和背景图片自适应窗口最大化和拉伸缩放的实现
- MFC 中 Tooltip 实现的几种方式
- MFC实现登录对话框连接access数据库方式
- MFC访问对话框控件的几种方式
- MFC 中 Tooltip 实现的几种方式
- MFC几种给对话框添加背景图的方法
- MFC 中 Tooltip 实现的几种方式