頭文件
-
-
-
std;
-
-
-
-
-
CDXImage
- {
-
:
-
CDXImage();
-
~CDXImage();
-
-
:
-
-
LoadImageFromFile( *pFileName, cx, cy);
-
-
LoadDXImage(* pBits, cx, cy);
-
-
Display(CDC *pDC);
-
-
InitDraw( hWnd);
-
-
RestoreAll( hWnd);
-
:
-
-
ReleaseObject();
-
-
:
-
IDirectDraw7 *m_lpDD;
-
IDirectDrawSurface7 *m_lpDDSPrimary;
-
IDirectDrawSurface7 *m_lppDDSBackBuffer;
-
-
:
-
vector<> m_vpBMPs;
-
m_hWnd;
- };
#pragma once
#include <vector>
using namespace std;
#include <DShow.h>
#include <uuids.h>
#define DXIMAGE_WIDTH 1024
#define DXIMAGE_HEIGHT 768
class CDXImage
{
public:
CDXImage(void);
~CDXImage(void);
//
public:
// 文件中載入位圖
BOOL LoadImageFromFile(char *pFileName, int cx, int cy);
// 載入圖像
void LoadDXImage(char* pBits, int cx, int cy);
// 顯示圖像
void Display(CDC *pDC);
// 初始化DirectDraw
void InitDraw(HWND hWnd);
// 恢複丟失的圖麵
void RestoreAll(HWND hWnd);
protected:
// 釋放對象
void ReleaseObject();
// DX objects
private:
IDirectDraw7 *m_lpDD; // DirectDraw Object
IDirectDrawSurface7 *m_lpDDSPrimary; // Primary Surface Object
IDirectDrawSurface7 *m_lppDDSBackBuffer; // BackBuffer Surface Object
// Image Object
private:
vector<HBITMAP> m_vpBMPs; // BMP Objects Array
HWND m_hWnd;
};
源文件
-
-
-
CDXImage::CDXImage()
- {
-
-
->m_lpDD = NULL;
-
->m_lpDDSPrimary = NULL;
-
->m_lppDDSBackBuffer = NULL;
-
->m_hWnd = NULL;
- }
-
CDXImage::~CDXImage()
- {
- ReleaseObject();
- }
-
-
-
-
-
-
-
-
-
-
CDXImage::LoadDXImage( *pBits, cx, cy)
- {
-
- }
-
-
-
-
-
-
-
-
-
-
-
-
CDXImage::LoadImageFromFile( *pFileName, cx, cy)
- {
-
hbmp;
-
hbmp = ()LoadImage(AfxGetInstanceHandle(), pFileName, IMAGE_BITMAP, cx, cy, LR_LOADFROMFILE);
-
(hbmp == NULL)
- {
-
AfxMessageBox();
-
FALSE;
- }
- m_vpBMPs.push_back(hbmp);
-
TRUE;
- }
-
-
-
-
-
-
-
-
CDXImage::InitDraw( hWnd)
- {
- ASSERT(m_lpDD == NULL);
- ASSERT(m_lpDDSPrimary == NULL);
- ASSERT(m_lppDDSBackBuffer == NULL);
- ASSERT(m_vpBMPs.size() == 0);
- ASSERT(m_hWnd == NULL);
- m_hWnd = hWnd;
-
-
hr;
-
hr = DirectDrawCreateEx(NULL, (**)&m_lpDD, IID_IDirectDraw7, NULL);
-
(FAILED(hr))
- {
-
AfxMessageBox();
-
;
- }
- hr = m_lpDD->SetCooperativeLevel(m_hWnd, DDSCL_NORMAL);
-
(FAILED(hr))
- {
-
AfxMessageBox();
-
;
- }
-
- DDSURFACEDESC2 ddsd;
-
memset(&ddsd, 0, (ddsd));
-
ddsd.dwSize = (ddsd);
- ddsd.dwFlags = DDSD_CAPS;
- ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
- hr = m_lpDD->CreateSurface(&ddsd, &m_lpDDSPrimary, NULL);
-
(FAILED(hr))
- {
-
AfxMessageBox();
-
;
- }
-
- IDirectDrawClipper *lpClipper = NULL;
- hr = m_lpDD->CreateClipper(NULL, &lpClipper, NULL);
-
(FAILED(hr))
- {
-
AfxMessageBox();
-
;
- }
- hr = lpClipper->SetHWnd(0, hWnd);
-
(FAILED(hr))
- {
-
AfxMessageBox();
-
;
- }
- hr = m_lpDDSPrimary->SetClipper(lpClipper);
-
(FAILED(hr))
- {
-
AfxMessageBox();
-
;
- }
- lpClipper->Release();
-
-
memset(&ddsd, 0, (ddsd));
-
ddsd.dwSize = (ddsd);
- ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH;
- ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
- ddsd.dwWidth = DXIMAGE_WIDTH;
- ddsd.dwHeight = DXIMAGE_HEIGHT;
- hr = m_lpDD->CreateSurface(&ddsd, &m_lppDDSBackBuffer, NULL);
-
(FAILED(hr))
- {
-
AfxMessageBox();
-
;
- }
- }
-
-
-
-
-
-
-
-
CDXImage::Display(CDC *pDC = NULL)
- {
-
-
hr;
- DDSURFACEDESC2 desc;
-
memset(&desc, 0, (desc));
-
desc.dwSize = (desc);
- hr = m_lppDDSBackBuffer->GetSurfaceDesc(&desc);
-
(FAILED(hr))
- {
-
AfxMessageBox();
-
;
- }
-
-
(vector<>::iterator it = m_vpBMPs.begin(); it != m_vpBMPs.end(); it++)
- {
-
-
hDC;
-
(m_lppDDSBackBuffer->GetDC(&hDC) != DD_OK)
- {
-
;
- }
-
-
CDC dc;
- dc.m_hDC = hDC;
-
nSavedDC = dc.SaveDC();
- CDC memDC;
- memDC.CreateCompatibleDC(&dc);
-
hbmp = *it;
- memDC.SelectObject(hbmp);
- dc.BitBlt(0, 0, DXIMAGE_WIDTH, DXIMAGE_HEIGHT, &memDC, 0, 0, SRCCOPY);
- memDC.DeleteDC();
- DeleteObject(hbmp);
-
-
- CRect rcClient;
- GetClientRect(m_hWnd, &rcClient);
- ClientToScreen(m_hWnd, &rcClient.TopLeft());
- ClientToScreen(m_hWnd, &rcClient.BottomRight());
- dc.RestoreDC(nSavedDC);
- dc.m_hDC = NULL;
- m_lppDDSBackBuffer->ReleaseDC(hDC);
- m_lpDDSPrimary->Blt(&rcClient, m_lppDDSBackBuffer, NULL, DDBLT_WAIT, NULL);
- }
- }
-
-
-
-
-
-
-
CDXImage::ReleaseObject()
- {
-
-
(m_lpDDSPrimary != NULL)
- {
- m_lpDDSPrimary->Release();
- m_lpDDSPrimary = NULL;
- }
-
(m_lppDDSBackBuffer != NULL)
- {
- m_lppDDSBackBuffer->Release();
- m_lppDDSBackBuffer = NULL;
- }
-
(m_lpDD != NULL)
- {
- m_lpDD->Release();
- m_lpDD = NULL;
- }
- }
-
-
-
-
-
-
-
-
CDXImage::RestoreAll( hWnd)
- {
-
hr;
- hr = m_lpDDSPrimary->Restore();
-
(hr == DDERR_WRONGMODE)
- {
-
TRACE();
- ReleaseObject();
- m_hWnd = hWnd;
- InitDraw(m_hWnd);
-
;
- }
-
(FAILED(hr))
- {
-
;
- }
-
(FAILED(m_lppDDSBackBuffer->Restore()))
- {
-
;
- }
- }
#include "StdAfx.h"
#include "DXImage.h"
CDXImage::CDXImage(void)
{
// 成員變量初始化
this->m_lpDD = NULL;
this->m_lpDDSPrimary = NULL;
this->m_lppDDSBackBuffer = NULL;
this->m_hWnd = NULL;
}
CDXImage::~CDXImage(void)
{
ReleaseObject();
}
/************************************************************************
* 函數名稱:LoadDXImage
* 函數功能:從DSP端接收圖像數據
* 函數參數:
* char *pBits : 圖像數據
* int cx : 圖像寬度
* int cy : 圖像高度
* 返回值:void
************************************************************************/
void CDXImage::LoadDXImage(char *pBits, int cx,int cy)
{
}
/************************************************************************
* 函數名稱:LoadImageFromFile
* 函數功能:從硬盤文件中讀取圖像
* 函數參數:
* char *pFileName : 圖像文件名
* int cx : 圖像寬度
* int cy : 圖像高度
* 返回值類型:BOOL
true : 文件載入成功
false: 文件載入失敗
************************************************************************/
BOOL CDXImage::LoadImageFromFile(char *pFileName, int cx, int cy)
{
HBITMAP hbmp;
hbmp = (HBITMAP)LoadImage(AfxGetInstanceHandle(), pFileName, IMAGE_BITMAP, cx, cy, LR_LOADFROMFILE);
if (hbmp == NULL)
{
AfxMessageBox("Failed to Load Image /n Please Check the File Path!");
return FALSE;
}
m_vpBMPs.push_back(hbmp);
return TRUE;
}
/************************************************************************
* 函數名稱:InitDraw
* 函數功能:初始化DirectDraw
* 函數參數:
* HWND hWnd : 圖像顯示窗口句柄
* 返回值類型:void
************************************************************************/
void CDXImage::InitDraw(HWND hWnd)
{
ASSERT(m_lpDD == NULL);
ASSERT(m_lpDDSPrimary == NULL);
ASSERT(m_lppDDSBackBuffer == NULL);
ASSERT(m_vpBMPs.size() == 0);
ASSERT(m_hWnd == NULL);
m_hWnd = hWnd;
// 創建DirectDraw對象
HRESULT hr;
hr = DirectDrawCreateEx(NULL, (VOID**)&m_lpDD, IID_IDirectDraw7, NULL);
if (FAILED(hr))
{
AfxMessageBox("Failed to Create DirectDraw Object!");
return;
}
hr = m_lpDD->SetCooperativeLevel(m_hWnd, DDSCL_NORMAL);
if (FAILED(hr))
{
AfxMessageBox("Failed to Initialize DirectDraw");
return;
}
// 創建主圖麵
DDSURFACEDESC2 ddsd;
memset(&ddsd, 0, sizeof(ddsd));
ddsd.dwSize = sizeof(ddsd);
ddsd.dwFlags = DDSD_CAPS;
ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
hr = m_lpDD->CreateSurface(&ddsd, &m_lpDDSPrimary, NULL);
if (FAILED(hr))
{
AfxMessageBox("Failed to Create primary surface!");
return;
}
// 創建裁剪
IDirectDrawClipper *lpClipper = NULL;
hr = m_lpDD->CreateClipper(NULL, &lpClipper, NULL);
if (FAILED(hr))
{
AfxMessageBox("Failed to Create Clipper!");
return;
}
hr = lpClipper->SetHWnd(0, hWnd);
if (FAILED(hr))
{
AfxMessageBox("Failed to Create Window Clipper!");
return;
}
hr = m_lpDDSPrimary->SetClipper(lpClipper);
if (FAILED(hr))
{
AfxMessageBox("Failed to Set Clipper of Primary Surface!");
return;
}
lpClipper->Release();
// 創建輔助畫麵
memset(&ddsd, 0, sizeof(ddsd));
ddsd.dwSize = sizeof(ddsd);
ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH;
ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
ddsd.dwWidth = DXIMAGE_WIDTH;
ddsd.dwHeight = DXIMAGE_HEIGHT;
hr = m_lpDD->CreateSurface(&ddsd, &m_lppDDSBackBuffer, NULL);
if (FAILED(hr))
{
AfxMessageBox("Failed to Create Assistant Surface!");
return;
}
}
/************************************************************************
* 函數名稱:Display
* 函數功能:顯示圖像
* 函數參數:
* CDC pDC : 圖像顯示設備上下文
* 返回值類型:void
************************************************************************/
void CDXImage::Display(CDC *pDC = NULL)
{
// 繪製輔助圖麵
HRESULT hr;
DDSURFACEDESC2 desc;
memset(&desc, 0, sizeof(desc));
desc.dwSize = sizeof(desc);
hr = m_lppDDSBackBuffer->GetSurfaceDesc(&desc);
if (FAILED(hr))
{
AfxMessageBox("Failed to Get Assistant Surface Descriptor");
return;
}
for (vector<HBITMAP>::iterator it = m_vpBMPs.begin(); it != m_vpBMPs.end(); it++)
{
// 獲取設備DC
HDC hDC;
if (m_lppDDSBackBuffer->GetDC(&hDC) != DD_OK)
{
return;
}
// 保存DC
CDC dc; //dbg
dc.m_hDC = hDC;
int nSavedDC = dc.SaveDC();
CDC memDC;
memDC.CreateCompatibleDC(&dc);
HBITMAP hbmp = *it;
memDC.SelectObject(hbmp);
dc.BitBlt(0, 0, DXIMAGE_WIDTH, DXIMAGE_HEIGHT, &memDC, 0, 0, SRCCOPY);
memDC.DeleteDC();
DeleteObject(hbmp);
//m_vpBMPs.erase(it);
CRect rcClient;
GetClientRect(m_hWnd, &rcClient);
ClientToScreen(m_hWnd, &rcClient.TopLeft());
ClientToScreen(m_hWnd, &rcClient.BottomRight());
dc.RestoreDC(nSavedDC);
dc.m_hDC = NULL;
m_lppDDSBackBuffer->ReleaseDC(hDC);
m_lpDDSPrimary->Blt(&rcClient, m_lppDDSBackBuffer, NULL, DDBLT_WAIT, NULL);
}
}
/************************************************************************
* 函數名稱:ReleaseObject
* 函數功能:釋放DirectDraw對象
* 函數參數:無
* 返回值類型:void
************************************************************************/
void CDXImage::ReleaseObject()
{
// 刪除對象
if (m_lpDDSPrimary != NULL)
{
m_lpDDSPrimary->Release();
m_lpDDSPrimary = NULL;
}
if (m_lppDDSBackBuffer != NULL)
{
m_lppDDSBackBuffer->Release();
m_lppDDSBackBuffer = NULL;
}
if (m_lpDD != NULL)
{
m_lpDD->Release();
m_lpDD = NULL;
}
}
/************************************************************************
* 函數名稱:RestoreAll
* 函數功能:所有DirectDraw對象複位
* 函數參數:
HWND hWnd : 圖像顯示設備句柄
* 返回值類型:void
************************************************************************/
void CDXImage::RestoreAll(HWND hWnd)
{
HRESULT hr;
hr = m_lpDDSPrimary->Restore();
if (hr == DDERR_WRONGMODE)
{
TRACE("Dispaly model changed");
ReleaseObject();
m_hWnd = hWnd;
InitDraw(m_hWnd);
return;
}
else if (FAILED(hr))
{
return;
}
if (FAILED(m_lppDDSBackBuffer->Restore()))
{
return;
}
}
用法:
適用於Win32平台
一、創建一個CDXImage類對象
CDXImage m_DXImage;
二、初始化並載入位圖
- m_DXImage.InitDraw(GetSafeHwnd());
-
m_DXImage.LoadImageFromFile(, 1024, 768);
-
m_DXImage.LoadImageFromFile(, 1024, 768);
m_DXImage.InitDraw(GetSafeHwnd()); // 初始化DX圖像對象
m_DXImage.LoadImageFromFile("pics//0.bmp", 1024, 768);
m_DXImage.LoadImageFromFile("pics//2.bmp", 1024, 768);
三、顯示位圖
m_DXImage.Display(NULL);
然後可借助定時器使用。