DirectDraw创建Windows窗口
2015-10-09 13:01
447 查看
KWindow.h KWindow.cpp
KDDrawWindow.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(); }
相关文章推荐
- yum
- uitabBar上面的各定义选中时的图片颜色。不要渲染
- Linux下安装maven
- Android典型界面设计(8) ——ViewPager+PagerSlidingTabStrip实现双导航
- 使用C语言描述静态链表和动态链表
- CentOS忘记root用户密码,进入单用户模式修改密码
- Xen 和 KVM 下如何关闭 virbr0
- 2015-10-06 认识jQuery1
- 【PLSQL】如何对BLOB字段进行like操作
- CSS3选择器
- checkbox 全选和反选
- UVa 1208 - Oreon
- 快递100接口解析与Volley自定义XML解析
- 最全的安卓镜像和最全的android-studio
- 【编译原理】:简易的词法分析器
- 用Java语言实现单向链表的方法
- Arduino IDE的#ifdef bug
- SyncroSVN 使用手册
- wince开发环境搭建与全套教程
- JSP的九大内置对象