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;
}
- MFC 实现对话框 背景贴图的几种方式
- MFC 对话框背景贴图
- MFC对话框添加背景及按钮贴图
- 对话框的几种实现方式
- MFC访问对话框控件的几种方式
- MFC访问对话框控件的几种方式
- 设置对话框背景的几种方法
- java中弹出式对话框的几种实现方式
- mfc实现以图片作为对话框的背景
- 几种MFC对话框的隐藏方法
- MFC 对话框隐藏的几种办法
- 几种MFC对话框的隐藏方法
- mfc对话框隐藏的几种方法
- MFC 对话框隐藏的几种办法
- 几种MFC对话框的隐藏方法
- MFC提供的几种对话框类
- 几种MFC对话框的隐藏方法
- 几种MFC对话框的隐藏方法
- iOS如何过滤网络数据中的换行符
- php(2)——常量、变量和数据类型
- 网站搭建之路一:Windows下PHP环境的搭建
- 奥巴马筹款网站的制作过程
- MySQL 数据类型
- MFC 实现对话框 背景贴图的几种方式
- ios 输入框输入6位数字
- uvalive4256(DP)
- Gridview不会自动撑开
- Cocos2dx3.x 使用cocostudio导出的骨骼动画
- zoj 1311 poj 1144 Network(无向图顶点联通度)
- 解决ngui 粒子 层级显示问题
- 自学笔记之Quartz2D
- <Garry和图表第二次约会>HighCharts, Android传数据(可以不用ajax你造吗)