?? hdirectdraw.cpp
字號:
// HDirectDraw.cpp: implementation of the CDirectDraw class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "HDirectDraw.h"
#include "resource.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
#pragma comment (lib,"ddraw.lib")
#pragma comment (lib,"dxguid.lib")
CDirectDraw::CDirectDraw()
{
GetDCOK=FALSE;
Created=FALSE;
GDISurf=NULL;
lpDD=NULL;
lpDDSPrimary=NULL;
lpDDSBack=NULL;
lpDDPal=NULL;
m_bPaletteCreated=FALSE;//沒有創建Palette;
}
CDirectDraw::~CDirectDraw()
{
}
BOOL CDirectDraw::InitDDraw(
DWORD w, //顯示模式寬度
DWORD h, //顯示模式高度
DWORD bpp, //象素顏色深度
DWORD CoLevel,//協作程度
DWORD bbn //后備緩沖區數目
)
{
HRESULT ddrval;
DDSURFACEDESC2 ddsd;
DDSCAPS2 ddcaps;
if(Created==FALSE)
{
DestroyWindow(hWnd);
SaveInfo("創建窗口失敗.dat","Created=FALSE");
return FALSE;
}
ddrval=DirectDrawCreateEx(NULL,(VOID **)&lpDD,IID_IDirectDraw7,NULL);
if(ddrval!= DD_OK)
{
SaveInfo("創建DirectDraw對象失敗.dat",ddrval);
return FALSE;
}
ddrval = lpDD->SetCooperativeLevel(hWnd, CoLevel);
if(ddrval != DD_OK)
{
SaveInfo("設置合作層失敗.dat",ddrval);
return FALSE;
}
ddrval = lpDD->SetDisplayMode(w,h,bpp,0,0);
if(ddrval != DD_OK)
{
// The display mode changed successfully.
SaveInfo("設置顯示模式失敗.dat",ddrval);
return FALSE;
}
// 創建具有一個后備表面的主表面:
ZeroMemory(&ddsd, sizeof(ddsd));
ddsd.dwSize = sizeof(ddsd);
ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE|
DDSCAPS_FLIP|
DDSCAPS_COMPLEX;
ddsd.dwBackBufferCount=bbn;
ddrval = lpDD->CreateSurface(&ddsd, &lpDDSPrimary, NULL);
if(ddrval != DD_OK)
{
return FALSE;
}
ZeroMemory(&ddcaps,sizeof(ddcaps));
ddcaps.dwCaps = DDSCAPS_BACKBUFFER;
ddrval = lpDDSPrimary->GetAttachedSurface(&ddcaps,
&lpDDSBack);
if(ddrval != DD_OK)
{
return FALSE;
}
WindowWidth=w;
WindowHeight=h;
BPP=bpp;
return TRUE;
}
BOOL CDirectDraw::CloseDDraw()
{
if(lpDD != NULL)
{
if(lpDDSPrimary != NULL)
{
lpDDSPrimary->Release();
lpDDSPrimary = NULL;
}
if(lpDDPal!=NULL)
{
lpDDPal->Release();
lpDDPal=NULL;
}
lpDD->Release();
lpDD = NULL;
}
return TRUE;
}
void CDirectDraw::GetDC(LPDIRECTDRAWSURFACE7 sf)
{
GetDCOK=FALSE;
GDISurf=sf;
if (GDISurf->GetDC(&hDC)!= DD_OK)
{
return ;
}
GetDCOK=TRUE;
return ;
}
void CDirectDraw::TextOut(int x, int y, LPCTSTR str)
{
if(GetDCOK)
{
::TextOut(hDC,x,y,str,lstrlen(str));
}
}
void CDirectDraw::ReleaseDC()
{
if(GetDCOK==TRUE)
{
GDISurf->ReleaseDC(hDC);
GetDCOK=FALSE;
}
}
void CDirectDraw::SetTextColor(COLORREF clr)
{
if(GetDCOK)
{
::SetTextColor(hDC,clr);
}
}
void CDirectDraw::SetBkColor(COLORREF clr)
{
if(GetDCOK)
{
::SetBkColor(hDC,clr);
}
}
BOOL CDirectDraw::Flip()
{
HRESULT ddrval;
while(TRUE)
{
ddrval = lpDDSPrimary->Flip(NULL,0);
if(ddrval==DD_OK)
{
return TRUE;
}
if(ddrval==DDERR_SURFACELOST)
{
ddrval=lpDDSPrimary->Restore();
if(ddrval!=DD_OK)
{
return FALSE;
}
}
if(ddrval!= DDERR_WASSTILLDRAWING)
{
return FALSE;
}
}
return TRUE;
}
//HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam
BOOL CDirectDraw::CreateDDrawWnd(
HINSTANCE hInstance,
long (FAR PASCAL * WindowProc)
(
HWND,
UINT,
WPARAM,
LPARAM
),
LPCTSTR Title
)
{
// Set up and register window class
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WindowProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON1));
wc.hCursor = LoadCursor(NULL, MAKEINTRESOURCE(IDC_POINTER));
wc.hbrBackground = (HBRUSH )GetStockObject(BLACK_BRUSH);
wc.lpszMenuName = NULL;
wc.lpszClassName = Title;
RegisterClass(&wc);
//創建一個窗口:
hWnd = CreateWindowEx(WS_EX_TOPMOST,
Title,
Title,
WS_POPUP,
0,
0,
GetSystemMetrics(SM_CXSCREEN),
GetSystemMetrics(SM_CYSCREEN),
NULL,
NULL,
hInstance,
NULL);
if (!hWnd)
return FALSE;
//顯示窗口:
ShowWindow(hWnd, nCmdShow);
//更新窗口:
UpdateWindow(hWnd);
SetFocus(hWnd);
Created=TRUE;
return TRUE;
}
BOOL CDirectDraw::SetTimer(UINT tid, UINT dly)
{
UINT ntid;
ntid=::SetTimer(hWnd,tid,dly,NULL);
if(ntid!=tid)
{
SaveInfo("設置時鐘失敗.dat","ntid!=tid");
return FALSE;
}
return TRUE;
}
BOOL CDirectDraw::ClearBackBuffer()
{
HRESULT ddrval;
DDBLTFX ddbltfx;
ZeroMemory(&ddbltfx, sizeof(ddbltfx));
ddbltfx.dwSize = sizeof(ddbltfx);
ddbltfx.dwFillColor = 0;
ddrval=lpDDSBack->Blt(NULL, NULL, NULL,
DDBLT_COLORFILL | DDBLT_WAIT,
&ddbltfx);
if(ddrval!=DD_OK)
{
return FALSE;
}
return TRUE;
}
void CDirectDraw::GetClientRect(RECT &rc)
{
::GetClientRect(hWnd,&rc);
}
BOOL CDirectDraw::MoveTo(int x, int y)
{
if(GetDCOK)
{
return ::MoveToEx(hDC,x,y,NULL);
}
else
{
return FALSE;
}
}
BOOL CDirectDraw::SetPalette(LPCSTR fn)
{
if(BPP!=8)
{
SaveInfo("色彩深度不是8.txt",BPP);
return FALSE;
}
if(strcmp(fn,"")==0)
{
SaveInfo("創建調色板文件名為空.txt",fn);
return FALSE;
}
int i;
int n;
int fh;
HRSRC h;
LPBITMAPINFOHEADER lpbi;
PALETTEENTRY ape[256];
RGBQUAD *prgb;
for (i = 0; i < 256; i++)
{
ape[i].peRed = (BYTE) (((i >> 5) & 0x07) * 255 / 7);
ape[i].peGreen = (BYTE) (((i >> 2) & 0x07) * 255 / 7);
ape[i].peBlue = (BYTE) (((i >> 0) & 0x03) * 255 / 3);
ape[i].peFlags = (BYTE) 0;
}
if (fn && (h = FindResource(NULL, fn, RT_BITMAP)))
{
lpbi = (LPBITMAPINFOHEADER) LockResource(LoadResource(NULL, h));
if (!lpbi)
OutputDebugString("lock resource failed\n");
prgb = (RGBQUAD *) ((BYTE *) lpbi + lpbi->biSize);
if (lpbi == NULL || lpbi->biSize < sizeof(BITMAPINFOHEADER))
n = 0;
else if (lpbi->biBitCount > 8)
n = 0;
else if (lpbi->biClrUsed == 0)
n = 1 << lpbi->biBitCount;
else
n = lpbi->biClrUsed;
for (i = 0; i < n; i++)
{
ape[i].peRed = prgb[i].rgbRed;
ape[i].peGreen = prgb[i].rgbGreen;
ape[i].peBlue = prgb[i].rgbBlue;
ape[i].peFlags = 0;
}
}
else if (fn && (fh = _lopen(fn, OF_READ)) != -1)
{
BITMAPFILEHEADER bf;
BITMAPINFOHEADER bi;
_lread(fh, &bf, sizeof(bf));
_lread(fh, &bi, sizeof(bi));
_lread(fh, ape, sizeof(ape));
_lclose(fh);
if (bi.biSize != sizeof(BITMAPINFOHEADER))
n = 0;
else if (bi.biBitCount > 8)
n = 0;
else if (bi.biClrUsed == 0)
n = 1 << bi.biBitCount;
else
n = bi.biClrUsed;
for (i = 0; i < n; i++)
{
BYTE r = ape[i].peRed;
ape[i].peRed = ape[i].peBlue;
ape[i].peBlue = r;
}
}
lpDD->CreatePalette(DDPCAPS_8BIT, ape, &m_Palette, NULL);
if (m_Palette)
{
lpDDSPrimary->SetPalette(m_Palette);
}
else
{
return FALSE;
}
return TRUE;
}
BOOL CDirectDraw::Restore()
{
if(lpDDSPrimary->IsLost())
{
if(lpDDSPrimary->Restore()!=DD_OK)
{
return FALSE;
}
}
if(lpDDSBack->IsLost())
{
if(lpDDSBack->Restore()!=DD_OK)
{
return FALSE;
}
}
return TRUE;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -