http://blog.csdn.net/lanyzh0909/article/details/6363378
DirectDraw在window下支持全屏模式(也叫独占模式)和窗口模式。DirectDraw基于全屏模式的编程例子在%_WINCEROOT%PUBLIC/DIRECTX/SDK/SAMPLES/DDRAW下有,读者可以去自己去查看,但是基于窗口下的DirectDraw编程例子确是很找到。下面我一步步介绍一下基于窗口的DirectDraw编程。
1、既然是基于窗口,首先我们就必须先创建一个窗口,先调用RegisterClass注册窗口类,再调用CreateWindowsEx创建一个窗口,用m_hAttach保存窗口句柄。
2、调用DirectDrawCreate创建一个DirectDraw对象
- //创建DirectDraw对象
- hRet = DirectDrawCreate(NULL, &m_pDD, NULL);
- if (hRet != DD_OK)
- {
- goto Err;
- }
3、设置协作级别,通过m_pDD调用SetCooperativeLevel接口,将俩个参数设置为m_hAttach和DDSCL_NORMAL
- //设置协作级别
- hRet = m_pDD->SetCooperativeLevel(m_hAttach, DDSCL_NORMAL);
- if (hRet != DD_OK)
- {
- goto Err;
- }
4、创建主屏页和离屏页,主屏页就相当与显示器,当你往主屏上绘制什么东西显示器上将显示相应的东西。离屏也就相当于内存DC,我们首先在离屏页上绘制好图形,然后通过Blt到主页上去。
- DDSURFACEDESC ddsd;
- memset(&ddsd, 0, sizeof(ddsd));
- ddsd.dwSize = sizeof(ddsd);
- ddsd.dwFlags = DDSD_CAPS;
- ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
- //创建主页
- hRet = m_pDD->CreateSurface(&ddsd, &m_pDDSPrimary, NULL);
- if (hRet != DD_OK)
- {
- goto Err;
- }
- //创建离屏页时,必须指定页面的长、宽
- RECT rcClient ={0};
- GetClientRect(m_hAttach,&rcClient);
- ddsd.dwFlags = DDSD_HEIGHT | DDSD_WIDTH;
- ddsd.ddsCaps.dwCaps = DDSCAPS_VIDEOMEMORY ;
- ddsd.dwHeight = rcClient.bottom - rcClient.top;
- ddsd.dwWidth = rcClient.right - rcClient.left;
- hRet = m_pDD->CreateSurface(&ddsd, &m_pDDSBack, NULL);
- if (hRet != DD_OK)
- {
- goto Err;
- }
5、创建裁剪器,裁剪器的作用就是将显示的内容限制在窗口区域内,超出的将不能显示。
- //创建裁剪器
- hRet = m_pDD->CreateClipper(0, &m_lpddClipper, NULL);
- if (hRet != DD_OK)
- {
- goto Err;
- }
- //将裁剪器和窗口关联
- m_lpddClipper->SetHWnd(0,m_hAttach);
- //将裁剪器与图面相关联
- m_pDDSPrimary->SetClipper(m_lpddClipper);
6、完成上面步骤后,我们就可以开始在绘图了。在处理WM_PAINT消息时调用OnPaint()
现在可以编译和运行程序了,能看到Test.bmp已经显示在窗口的客户区域中。
- void OnPaint()
- {
- HRESULT hRet;
- HBITMAP hbm;
- BITMAP bmInfo;
- DDSURFACEDESC ddsd;
- LPDIRECTDRAWSURFACE pDDSBitmap;
- DDBLTFX ddbltfx;
- memset(&ddbltfx, 0, sizeof(ddbltfx));
- ddbltfx.dwSize = sizeof(ddbltfx);
- ddbltfx.dwROP = SRCCOPY;
- ddbltfx.ddckSrcColorkey;
- // Load our bitmap resource.
- //hbm = DDGetBitmapHandle(GetModuleHandle(NULL),pszFileName);
- hbm = SHLoadDIBitmap(TEXT("Test.bmp"));
- if (hbm == NULL)
- {
- return;
- }
- GetObject(hbm,sizeof(bmInfo),&bmInfo);
- memset(&ddsd, 0, sizeof(ddsd));
- ddsd.dwSize = sizeof(ddsd);
- ddsd.dwFlags = DDSD_HEIGHT | DDSD_WIDTH;
- ddsd.ddsCaps.dwCaps = DDSCAPS_VIDEOMEMORY ;
- ddsd.dwHeight = bmInfo.bmHeight;
- ddsd.dwWidth = bmInfo.bmWidth;
- //创建位图离屏页
- hRet = m_pDD->CreateSurface(&ddsd, &pDDSBitmap, NULL);
- if (hRet != DD_OK)
- {
- return;
- }
- DDCopyBitmap(pDDSBitmap, hbm, 0, 0, bmInfo.bmWidth, bmInfo.bmHeight);
- if(pcol != NULL)
- {
- DDSetColorKey(pDDSBitmap,*pcol);
- m_pDDSBack->Blt(prcDes,pDDSBitmap,prcSrc,DDBLT_KEYSRC,NULL);
- }
- else
- {
- m_pDDSBack->Blt(prcDes,pDDSBitmap,prcSrc,DDBLT_ROP ,&ddbltfx);
- }
- ReleaseRes(pDDSBitmap);
- if(FAILED(m_pDDSPrimary->IsLost()))
- {
- //在其它程序改变显示模式导致页的丢失时,要对页面的恢复
- if(!RestoreResource())
- {
- return;
- }
- }
- //注意,这里应该将窗口坐标转化为屏幕坐标
- RECT rcClient = {0};
- ChangeClientToSreen(rcClient);
- //调用以下这句就能显示在屏幕上
- m_pDDSPrimary->Blt(&rcClient,m_pDDSBack,NULL,DDBLT_ROP ,&ddbltfx);
- return;
- }
下面是我自己封装的一个DirectDraw类,
//DirectDraw.h
- #pragma once
- #include <windows.h>
- #include <Ddraw.h>
- #include "D://OS//WINCE600//PUBLIC//DIRECTX//SDK//SAMPLES//DDRAW//INCLUDE//ddutil.h"
- #define ReleaseRes(x) if(x != NULL){ x->Release(); x = NULL;}
- class CDirectDraw
- {
- public:
- /******************************************************
- *函数介绍:初始化类成员变量
- *入口参数:hWnd,隶属于的窗口句柄
- dwMode,模式
- *出口参数:无
- *返回值: TRUE - 成功, FALSE - 失败
- ******************************************************/
- BOOL Init(HWND hWnd,DWORD dwMode);
- /******************************************************
- *函数介绍:将指定的图片加载到后台缓冲页中
- *入口参数:prcDes, 目标显示图片区域
- pFileName,显示图片名称
- prcSrc, 显示图片中区域
- pcolTra, 透明颜色
- *出口参数:无
- *返回值: TRUE - 成功, FALSE - 失败
- ******************************************************/
- BOOL DrawImageToBackSurface(LPRECT prcDes,LPCTSTR pszFileName,LPRECT prcSrc,LPCOLORREF pcolTra = NULL);
- /******************************************************
- *函数介绍:将文本绘制到后台缓冲页中
- *入口参数:prcDes, 目标显示文本区域
- pszText, 显示文本内容
- pfName, 字体名称
- ifSize, 字体大小
- uFormat, 对齐方式
- pcol, 字体颜色指针
- *出口参数:无
- *返回值: TRUE - 成功, FALSE - 失败
- ******************************************************/
- BOOL DrawTextToBackSuface(LPRECT prcDes,LPCTSTR pszText,LPCTSTR pfName, int ifSize,UINT uFormat = DT_LEFT,LPCOLORREF pcol = NULL);
- /******************************************************
- *函数介绍:创建一个离屏页
- *入口参数:
- iWidth, 宽度
- iHeight,高度
- *出口参数:pDDS,保存离屏页的指针
- *返回值: TRUE - 成功, FALSE - 失败
- ******************************************************/
- BOOL CreateOffScreenSuface(LPDIRECTDRAWSURFACE *pDDS, int iWidth, int iHeight);
- /******************************************************
- *函数介绍:图片加到指定的页中
- *入口参数:pDDS, 页指针
- prcDes, 目标显示图片区域
- pFileName,显示图片名称
- prcSrc, 显示图片中区域
- pcolTra, 透明颜色
- *出口参数:无
- *返回值: TRUE - 成功, FALSE - 失败
- ******************************************************/
- BOOL DrawImageToSurface(LPDIRECTDRAWSURFACE pDDS,LPRECT prcDes,LPCTSTR pszFileName,LPRECT prcSrc,LPCOLORREF pcolTra = NULL);
- /******************************************************
- *函数介绍:将文本绘制到指定的页中
- *入口参数:pDDS, 指定的页指针
- prcDes, 目标显示文本区域
- pszText, 显示文本内容
- pfName, 字体名称
- ifSize, 字体大小
- uFormat, 对齐方式
- pcol, 字体颜色指针
- *出口参数:无
- *返回值: TRUE - 成功, FALSE - 失败
- ******************************************************/
- BOOL DrawTextToSuface(LPDIRECTDRAWSURFACE pDDS,LPRECT prcDes,LPCTSTR pszText,LPCTSTR pfName, int ifSize,UINT uFormat = DT_LEFT,LPCOLORREF pcol = NULL);
- /******************************************************
- *函数介绍:将指定的页中的内容绘制到后台缓冲页
- *入口参数:
- prcDes, 目标显示图片区域
- pDDS, 页指针
- prcSrc, 显示图片中区域
- pcolTra, 透明颜色
- *出口参数:无
- *返回值: TRUE - 成功, FALSE - 失败
- ******************************************************/
- BOOL BltBackSurface(LPRECT prcDes,LPDIRECTDRAWSURFACE pDDS,LPRECT prcSrc,LPCOLORREF pcolTra = NULL);
- /******************************************************
- *函数介绍:拷贝后台页到指定的页中
- *入口参数:
- pDDS, 目标页指针
- prcDes, 目标页区域
- prcSrc, 源页区域
- *出口参数:无
- *返回值: TRUE - 成功, FALSE - 失败
- ******************************************************/
- BOOL CopyBackSurface(LPDIRECTDRAWSURFACE pDDS, LPRECT prcDes, LPRECT prcSrc);
- /******************************************************
- *函数介绍:获取后台页指针
- *入口参数:无
- *出口参数:无
- *返回值: 成功 - 返回后台页指针,失败 - 返回NULL
- ******************************************************/
- LPDIRECTDRAWSURFACE GetBufferSurface();
- /******************************************************
- *函数介绍:获取主页指针
- *入口参数:无
- *出口参数:无
- *返回值: 成功 - 返回主页指针,失败 - 返回NULL
- ******************************************************/
- LPDIRECTDRAWSURFACE GetPrimarySurface();
- /******************************************************
- *函数介绍:更新主页
- *入口参数:无
- *出口参数:无
- *返回值: 无
- ******************************************************/
- void UpDatePrimarySurface();
- public:
- CDirectDraw();
- virtual ~CDirectDraw();
- protected:
- /******************************************************
- *函数介绍:释放资源
- *入口参数:无
- *出口参数:无
- *返回值: 无
- ******************************************************/
- void ReleaseResource();
- /******************************************************
- *函数介绍:恢复资源
- *入口参数:无
- *出口参数:无
- *返回值: 无
- ******************************************************/
- HRESULT RestoreResource();
- /******************************************************
- *函数介绍:将客户坐标转换为屏幕坐标
- *入口参数:rc,客户坐标区域
- *出口参数:rc,屏幕坐标区域
- *返回值: 无
- ******************************************************/
- void ChangeClientToSreen(RECT &rc);
- /************************************************************************/
- /*
- 函数名: CreateFont
- 描 述: 获取字体句柄
- 参 数: TCHAR* : [in] 字体类型
- UINT8 : [in] 字体大小
- 返 回: HFONT
- */
- /************************************************************************/
- HFONT CreateFont(LPCTSTR pszFaceName, UINT8 nSize, BOOL bBold, BOOL bAntiAliasing);
- private:
- LPDIRECTDRAW m_pDD ; // DirectDraw object
- LPDIRECTDRAWSURFACE m_pDDSPrimary;// DirectDraw primary surface
- LPDIRECTDRAWSURFACE m_pDDSBack; // DirectDraw back surface
- LPDIRECTDRAWCLIPPER m_lpddClipper;// DirectDraw clipper
- HWND m_hAttach;
- };
//DirectDraw.cpp
- #include "DirectDraw.h"
- #pragma comment(lib,"ddraw.lib")
- #pragma comment(lib,"D://OS//WINCE600//PUBLIC//DIRECTX//SDK//LIB//ARMV4I//RETAIL//ddutil.lib")
- CDirectDraw::CDirectDraw():
- m_pDD(NULL),
- m_pDDSPrimary(NULL),
- m_pDDSBack(NULL),
- m_lpddClipper(NULL),
- m_hAttach(NULL)
- {
- }
- CDirectDraw::~CDirectDraw()
- {
- ReleaseResource();
- }
- BOOL CDirectDraw::Init(HWND hWnd,DWORD dwMode)
- {
- HRESULT hRet;
- DDSURFACEDESC ddsd;
- RECT rcClient ={0};
- //保存窗口句柄
- m_hAttach = hWnd;
- //创建DirectDraw对象
- hRet = DirectDrawCreate(NULL, &m_pDD, NULL);
- if (hRet != DD_OK)
- {
- goto Err;
- }
- //设置协作级别
- hRet = m_pDD->SetCooperativeLevel(m_hAttach,dwMode );
- if (hRet != DD_OK)
- {
- goto Err;
- }
- memset(&ddsd, 0, sizeof(ddsd));
- ddsd.dwSize = sizeof(ddsd);
- ddsd.dwFlags = DDSD_CAPS;
- ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
- //创建主页
- hRet = m_pDD->CreateSurface(&ddsd, &m_pDDSPrimary, NULL);
- if (hRet != DD_OK)
- {
- goto Err;
- }
- GetClientRect(m_hAttach,&rcClient);
- ddsd.dwFlags = DDSD_HEIGHT | DDSD_WIDTH;
- ddsd.ddsCaps.dwCaps = DDSCAPS_VIDEOMEMORY ;
- ddsd.dwHeight = rcClient.bottom - rcClient.top;
- ddsd.dwWidth = rcClient.right - rcClient.left;
- //创建离屏页
- hRet = m_pDD->CreateSurface(&ddsd, &m_pDDSBack, NULL);
- if (hRet != DD_OK)
- {
- goto Err;
- }
- //创建裁剪器
- hRet = m_pDD->CreateClipper(0, &m_lpddClipper, NULL);
- if (hRet != DD_OK)
- {
- goto Err;
- }
- //将裁剪器和窗口关联
- m_lpddClipper->SetHWnd(0,m_hAttach);
- //将裁剪器与图面相关联
- m_pDDSPrimary->SetClipper(m_lpddClipper);
- return TRUE;
- Err: //错误处理,释放内存
- m_hAttach = NULL;
- ReleaseResource();
- return FALSE;
- }
- BOOL CDirectDraw::DrawImageToBackSurface(LPRECT prcDes,LPCTSTR pszFileName,LPRECT prcSrc,LPCOLORREF pcol)
- {
- HRESULT hRet;
- HBITMAP hbm;
- BITMAP bmInfo;
- DDSURFACEDESC ddsd;
- LPDIRECTDRAWSURFACE pDDSBitmap;
- DDBLTFX ddbltfx;
- memset(&ddbltfx, 0, sizeof(ddbltfx));
- ddbltfx.dwSize = sizeof(ddbltfx);
- ddbltfx.dwROP = SRCCOPY;
- ddbltfx.ddckSrcColorkey;
- // Load our bitmap resource.
- //hbm = DDGetBitmapHandle(GetModuleHandle(NULL),pszFileName);
- hbm = SHLoadDIBitmap(pszFileName);
- if (hbm == NULL)
- {
- return FALSE;
- }
- GetObject(hbm,sizeof(bmInfo),&bmInfo);
- memset(&ddsd, 0, sizeof(ddsd));
- ddsd.dwSize = sizeof(ddsd);
- ddsd.dwFlags = DDSD_HEIGHT | DDSD_WIDTH;
- ddsd.ddsCaps.dwCaps = DDSCAPS_VIDEOMEMORY ;
- ddsd.dwHeight = bmInfo.bmHeight;
- ddsd.dwWidth = bmInfo.bmWidth;
- //创建位图离屏页
- hRet = m_pDD->CreateSurface(&ddsd, &pDDSBitmap, NULL);
- if (hRet != DD_OK)
- {
- return FALSE;
- }
- DDCopyBitmap(pDDSBitmap, hbm, 0, 0, bmInfo.bmWidth, bmInfo.bmHeight);
- if(pcol != NULL)
- {
- DDSetColorKey(pDDSBitmap,*pcol);
- m_pDDSBack->Blt(prcDes,pDDSBitmap,prcSrc,DDBLT_KEYSRC,NULL);
- }
- else
- {
- m_pDDSBack->Blt(prcDes,pDDSBitmap,prcSrc,DDBLT_ROP ,&ddbltfx);
- }
- ReleaseRes(pDDSBitmap);
- return TRUE;
- }
- BOOL CDirectDraw::DrawTextToBackSuface(LPRECT prcDes,LPCTSTR pszText,LPCTSTR pfName, int ifSize,UINT uFormat,LPCOLORREF pcol)
- {
- HFONT hf = CreateFont(pfName,ifSize,FALSE,TRUE);
- HDC hdc;
- m_pDDSBack ->GetDC(&hdc);
- HGDIOBJ hOldf = SelectObject(hdc,hf);
- SetBkMode(hdc,TRANSPARENT);
- pcol == NULL ? SetTextColor(hdc,RGB(0,0,0)) : SetTextColor(hdc,*pcol);
- DrawText(hdc,pszText,-1,prcDes,uFormat);
- SelectObject(hdc,hOldf);
- m_pDDSBack->ReleaseDC(hdc);
- DeleteObject(hf);
- return TRUE;
- }
- void CDirectDraw::UpDatePrimarySurface()
- {
- if(FAILED(m_pDDSPrimary->IsLost()))
- {
- if(!RestoreResource())
- {
- return;
- }
- }
- DDBLTFX ddbltfx;
- memset(&ddbltfx, 0, sizeof(ddbltfx));
- ddbltfx.dwSize = sizeof(ddbltfx);
- ddbltfx.dwROP = SRCCOPY;
- ddbltfx.ddckSrcColorkey;
- //注意,这里应该将窗口坐标转化为屏幕坐标
- RECT rcClient = {0};
- ChangeClientToSreen(rcClient);
- m_pDDSPrimary->Blt(&rcClient,m_pDDSBack,NULL,DDBLT_ROP ,&ddbltfx);
- }
- LPDIRECTDRAWSURFACE CDirectDraw::GetBufferSurface()
- {
- return m_pDDSBack;
- }
- LPDIRECTDRAWSURFACE CDirectDraw::GetPrimarySurface()
- {
- return m_pDDSPrimary;
- }
- void CDirectDraw::ChangeClientToSreen(RECT &rc)
- {
- GetClientRect(m_hAttach,&rc);
- ClientToScreen(m_hAttach,(LPPOINT)&rc);
- ClientToScreen(m_hAttach,(LPPOINT)&rc + 1);
- }
- HRESULT CDirectDraw::RestoreResource()
- {
- HRESULT hRet;
- hRet = m_pDDSPrimary->Restore();
- if (hRet == DD_OK)
- {
- hRet = m_pDDSBack->Restore();
- }
- return hRet;
- }
- void CDirectDraw::ReleaseResource()
- {
- //释放离屏页
- ReleaseRes(m_pDDSBack);
- //解除裁剪器和主页的关联
- if (m_pDDSPrimary != NULL)
- {
- m_pDDSPrimary ->SetClipper(NULL);
- }
- //是否裁剪器
- ReleaseRes(m_lpddClipper);
- //释放主屏页
- ReleaseRes(m_pDDSPrimary);
- //释放DirectDraw
- ReleaseRes(m_pDD);
- }
- HFONT CDirectDraw::CreateFont(LPCTSTR pszFaceName, UINT8 nSize, BOOL bBold, BOOL bAntiAliasing)
- {
- LOGFONT LogFont;
- LogFont.lfHeight = nSize;
- LogFont.lfWidth = 0;
- LogFont.lfEscapement = 0;
- LogFont.lfOrientation = 0;
- if( bBold ) LogFont.lfWeight = FW_BOLD;
- else LogFont.lfWeight = FW_NORMAL;
- LogFont.lfItalic = 0;
- LogFont.lfUnderline = 0;
- LogFont.lfStrikeOut = 0;
- LogFont.lfCharSet = DEFAULT_CHARSET;
- LogFont.lfOutPrecision = 0;
- LogFont.lfClipPrecision = 0;
- if( bAntiAliasing ) LogFont.lfQuality = ANTIALIASED_QUALITY;
- else LogFont.lfQuality = 0;
- LogFont.lfPitchAndFamily = 0;
- wcscpy(LogFont.lfFaceName, pszFaceName);
- return CreateFontIndirect(&LogFont);
- }
- BOOL CDirectDraw::CreateOffScreenSuface(LPDIRECTDRAWSURFACE *pDDS, int iWidth, int iHeight)
- {
- HRESULT hRet;
- DDSURFACEDESC ddsd;
- memset(&ddsd, 0, sizeof(ddsd));
- ddsd.dwSize = sizeof(ddsd);
- ddsd.dwFlags = DDSD_HEIGHT | DDSD_WIDTH;
- ddsd.ddsCaps.dwCaps = DDSCAPS_VIDEOMEMORY ;
- ddsd.dwHeight = iHeight;
- ddsd.dwWidth = iWidth;
- //创建位图离屏页
- hRet = m_pDD->CreateSurface(&ddsd,pDDS, NULL);
- if (hRet != DD_OK)
- {
- return FALSE;
- }
- return TRUE;
- }
- BOOL CDirectDraw::DrawImageToSurface(LPDIRECTDRAWSURFACE pDDS,LPRECT prcDes,LPCTSTR pszFileName,LPRECT prcSrc,LPCOLORREF pcol)
- {
- if(pDDS == NULL)
- return FALSE;
- HRESULT hRet;
- HBITMAP hbm;
- BITMAP bmInfo;
- DDSURFACEDESC ddsd;
- LPDIRECTDRAWSURFACE pDDSBitmap;
- DDBLTFX ddbltfx;
- memset(&ddbltfx, 0, sizeof(ddbltfx));
- ddbltfx.dwSize = sizeof(ddbltfx);
- ddbltfx.dwROP = SRCCOPY;
- ddbltfx.ddckSrcColorkey;
- hbm = SHLoadDIBitmap(pszFileName);
- if (hbm == NULL)
- {
- return FALSE;
- }
- GetObject(hbm,sizeof(bmInfo),&bmInfo);
- memset(&ddsd, 0, sizeof(ddsd));
- ddsd.dwSize = sizeof(ddsd);
- ddsd.dwFlags = DDSD_HEIGHT | DDSD_WIDTH;
- ddsd.ddsCaps.dwCaps = DDSCAPS_VIDEOMEMORY ;
- ddsd.dwHeight = bmInfo.bmHeight;
- ddsd.dwWidth = bmInfo.bmWidth;
- //创建位图离屏页
- hRet = m_pDD->CreateSurface(&ddsd, &pDDSBitmap, NULL);
- if (hRet != DD_OK)
- {
- return FALSE;
- }
- DDCopyBitmap(pDDSBitmap, hbm, 0, 0, bmInfo.bmWidth, bmInfo.bmHeight);
- if(pcol != NULL)
- {
- DDSetColorKey(pDDSBitmap,*pcol);
- pDDS->Blt(prcDes,pDDSBitmap,prcSrc,DDBLT_KEYSRC,NULL);
- }
- else
- {
- pDDS->Blt(prcDes,pDDSBitmap,prcSrc,DDBLT_ROP ,&ddbltfx);
- }
- ReleaseRes(pDDSBitmap);
- return TRUE;
- }
- BOOL CDirectDraw::DrawTextToSuface(LPDIRECTDRAWSURFACE pDDS,LPRECT prcDes,LPCTSTR pszText,LPCTSTR pfName, int ifSize,UINT uFormat,LPCOLORREF pcol)
- {
- if(pDDS == NULL)
- return FALSE;
- HFONT hf = CreateFont(pfName,ifSize,FALSE,TRUE);
- HDC hdc;
- pDDS ->GetDC(&hdc);
- HGDIOBJ hOldf = SelectObject(hdc,hf);
- SetBkMode(hdc,TRANSPARENT);
- pcol == NULL ? SetTextColor(hdc,RGB(0,0,0)) : SetTextColor(hdc,*pcol);
- DrawText(hdc,pszText,-1,prcDes,uFormat);
- SelectObject(hdc,hOldf);
- pDDS->ReleaseDC(hdc);
- DeleteObject(hf);
- return TRUE;
- }
- BOOL CDirectDraw::BltBackSurface(LPRECT prcDes,LPDIRECTDRAWSURFACE pDDS,LPRECT prcSrc,LPCOLORREF pcol)
- {
- if(pDDS == NULL)
- return FALSE;
- DDBLTFX ddbltfx;
- memset(&ddbltfx, 0, sizeof(ddbltfx));
- ddbltfx.dwSize = sizeof(ddbltfx);
- ddbltfx.dwROP = SRCCOPY;
- if(pcol != NULL)
- {
- DDSetColorKey(pDDS,*pcol);
- m_pDDSBack->Blt(prcDes,pDDS,prcSrc,DDBLT_KEYSRC,NULL);
- }
- else
- {
- m_pDDSBack->Blt(prcDes,pDDS,prcSrc,DDBLT_ROP ,&ddbltfx);
- }
- return TRUE;
- }
- BOOL CDirectDraw::CopyBackSurface(LPDIRECTDRAWSURFACE pDDS, LPRECT prcDes, LPRECT prcSrc)
- {
- if(pDDS == NULL || m_pDDSBack == NULL)
- return FALSE;
- DDBLTFX ddbltfx;
- memset(&ddbltfx, 0, sizeof(ddbltfx));
- ddbltfx.dwSize = sizeof(ddbltfx);
- ddbltfx.dwROP = SRCCOPY;
- pDDS->Blt(prcDes,m_pDDSBack,prcSrc,DDBLT_ROP ,&ddbltfx);
- return TRUE;
- }
测试例子:
- #include "stdafx.h"
- #include "MyDDraw.h"
- #include <windows.h>
- #include <commctrl.h>
- #include "DirectDraw.h"
- // Global Variables:
- HINSTANCE g_hInst;
- CDirectDraw g_DDraw;
- ATOM MyRegisterClass(HINSTANCE, LPTSTR);
- BOOL InitInstance(HINSTANCE, int);
- LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
- int WINAPI WinMain(HINSTANCE hInstance,
- HINSTANCE hPrevInstance,
- LPTSTR lpCmdLine,
- int nCmdShow)
- {
- MSG msg;
- if (!InitInstance(hInstance, nCmdShow))
- {
- return FALSE;
- }
- while (GetMessage(&msg, NULL, 0, 0))
- {
- TranslateMessage(&msg);
- DispatchMessage(&msg);
- }
- return (int) msg.wParam;
- }
- ATOM MyRegisterClass(HINSTANCE hInstance, LPTSTR szWindowClass)
- {
- WNDCLASS wc;
- wc.style = CS_HREDRAW | CS_VREDRAW;
- wc.lpfnWndProc = WndProc;
- wc.cbClsExtra = 0;
- wc.cbWndExtra = 0;
- wc.hInstance = hInstance;
- wc.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MYDDRAW));
- wc.hCursor = 0;
- wc.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
- wc.lpszMenuName = 0;
- wc.lpszClassName = szWindowClass;
- return RegisterClass(&wc);
- }
- BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
- {
- HWND hWnd;
- TCHAR szTitle[255]; // title bar text
- TCHAR szWindowClass[255]; // main window class name
- g_hInst = hInstance; // Store instance handle in our global variable
- if (!MyRegisterClass(hInstance, szWindowClass))
- {
- return FALSE;
- }
- hWnd = CreateWindow(szWindowClass, szTitle, WS_VISIBLE,
- 0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN), NULL, NULL, hInstance, NULL);
- if (!hWnd)
- {
- return FALSE;
- }
- ShowWindow(hWnd, nCmdShow);
- UpdateWindow(hWnd);
- //
- g_DDraw.Init(hWnd,DDSCL_NORMAL);
- g_DDraw.DrawImageToBackSurface(NULL,L"//NANDDisk//MSD6_951V1.0.1-HASE//APP//UI//BT_Background.bmp",NULL);
- g_DDraw.UpDatePrimarySurface();
- return TRUE;
- }
- LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
- {
- PAINTSTRUCT ps;
- HDC hdc;
- switch (message)
- {
- case WM_LBUTTONDOWN:
- {
- RECT rc ={90, 153, 90+142, 153+174};
- RECT rc1 ={0,0,142, 174};
- COLORREF cr = RGB(255,255,255);
- g_DDraw.DrawImageToBackSurface(&rc,L"//NANDDisk//MSD6_951V1.0.1-HASE//APP//UI//Search_BT_Down.bmp",&rc1);
- g_DDraw.DrawTextToBackSuface(&rc,L"搜索",L"方正兰亭黑简体",30, DT_CENTER |DT_BOTTOM,&cr);
- g_DDraw.UpDatePrimarySurface();
- break;
- }
- case WM_LBUTTONUP:
- {
- RECT rc ={90, 153, 90+142, 153+174};
- RECT rc1 ={0,0,142, 174};
- COLORREF cr = RGB(255,255,255);
- g_DDraw.DrawImageToBackSurface(&rc,L"//NANDDisk//MSD6_951V1.0.1-HASE//APP//UI//Search_BT_Normal.bmp",&rc1);
- g_DDraw.DrawTextToBackSuface(&rc,L"搜索",L"方正兰亭黑简体",30, DT_CENTER |DT_BOTTOM,&cr);
- g_DDraw.UpDatePrimarySurface();
- break;
- }
- case WM_CREATE:
- case WM_ERASEBKGND:
- return 0;
- break;
- case WM_PAINT:
- hdc = BeginPaint(hWnd, &ps);
- // TODO: Add any drawing code here...
- EndPaint(hWnd, &ps);
- g_DDraw.UpDatePrimarySurface();
- break;
- default:
- return DefWindowProc(hWnd, message, wParam, lParam);
- }
- return 0;