您的位置:首页 > 其它

DirectDraw创建Windows窗口

2015-10-09 13:01 447 查看
KWindow.h KWindow.cpp

KDDrawWindow.cpp

#define STRICT
#define WIN32_LEAN_AND_MEAN

#include <windows.h>
#include <assert.h>
#include <tchar.h>
#include <ddraw.h>

#include "KWindow.h"
#pragma comment(lib,"ddraw")

const TCHAR szMessage[] = _T("Hello World!");
const TCHAR szFace[] = _T("Times New Roman");
const TCHAR szHint[] = _T("press ESC to quit.");
const TCHAR szProgram[] = _T("HelloWorld4");

class KDDrawWindow : public KWindow
{
LPDIRECTDRAW    lpdd;
LPDIRECTDRAWSURFACE        lpddsprimary;

void OnKeyDown(WPARAM wParam, LPARAM lParam)
{
if(wParam == VK_ESCAPE)
{
PostMessage(m_hWnd, WM_CLOSE, 0, 0);
}
}

void Blend(int left, int right, int top, int bottom);

void OnDraw(HDC hdc)
{
TextOut(hdc, 0, 0, szHint, lstrlen(szHint));
CenterText(hdc, GetSystemMetrics(SM_CXSCREEN) / 2,
GetSystemMetrics(SM_CYSCREEN) / 2,
szFace, szMessage, 48);
Blend(80, 560, 160, 250);
}

public:
KDDrawWindow()
{
lpdd = NULL;
lpddsprimary = NULL;
}

~KDDrawWindow()
{
if(lpddsprimary)
{
lpddsprimary->Release();
lpddsprimary = NULL;
}

if(lpdd)
{
lpdd->Release();
lpdd = NULL;
}
}

bool CreateSurface();
};

bool KDDrawWindow::CreateSurface()
{
HRESULT hr;
hr = DirectDrawCreate(NULL, &lpdd, NULL);
if(hr != DD_OK)
return false;

hr = lpdd->SetCooperativeLevel(m_hWnd, DDSCL_FULLSCREEN | DDSCL_EXCLUSIVE);
if(hr != DD_OK)
return false;

hr = lpdd->SetDisplayMode(640, 480, 32);
if(hr != DD_OK)
return false;

DDSURFACEDESC ddsd;
memset(&ddsd, 0, sizeof(ddsd));
ddsd.dwSize = sizeof(ddsd);
ddsd.dwFlags = DDSD_CAPS;
ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;

return lpdd->CreateSurface(&ddsd, &lpddsprimary, NULL) == DD_OK;
}

void inline Blend(unsigned char* dest, unsigned char* src)
{
if(!dest || !src)
return;

dest[0] = (dest[0] + src[0]) / 2;
dest[1] = (dest[1] + src[1]) / 2;
dest[2] = (dest[2] + src[2]) / 2;
}

void KDDrawWindow::Blend(int left, int right, int top, int bottom)
{
DDSURFACEDESC ddsd;
memset(&ddsd, 0, sizeof(ddsd));
ddsd.dwSize = sizeof(ddsd);

HRESULT hr = lpddsprimary->Lock(NULL, &ddsd, DDLOCK_SURFACEMEMORYPTR | DDLOCK_WAIT, NULL);
assert(hr == DD_OK);

unsigned char* screen = (unsigned char*)ddsd.lpSurface;

for(int y = top; y < bottom; ++y)
{
unsigned char* pixel = screen + y * ddsd.lPitch + left * 4;
for(int x = left; x < right; ++x, pixel += 4)
{
if(pixel[0] != 255 || pixel[1] != 255 || pixel[2] != 255)
{
::Blend(pixel - 4, pixel);    //left
::Blend(pixel + 4, pixel);    //right
::Blend(pixel - ddsd.lPitch, pixel); //up
::Blend(pixel + ddsd.lPitch, pixel); //down
}
}
}

lpddsprimary->Unlock(ddsd.lpSurface);
}

int WINAPI WinMain( _In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPSTR lpCmdLine, _In_ int nShowCmd )
{
KDDrawWindow win;
win.CreateEx(0, szProgram, szProgram, WS_POPUP, GetSystemMetrics(SM_CXSCREEN) / 4, GetSystemMetrics(SM_CXSCREEN) / 4,
GetSystemMetrics(SM_CXSCREEN) / 2, GetSystemMetrics(SM_CYSCREEN) / 2,
NULL, NULL, hInstance);

win.CreateSurface();
win.ShowWindow(nShowCmd);
win.UpdateWindow();

return win.MessageLoop();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: