DirectDraw创建Windows窗口
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, , );
}
} void Blend(int left, int right, int top, int bottom); void OnDraw(HDC hdc)
{
TextOut(hdc, , , szHint, lstrlen(szHint));
CenterText(hdc, GetSystemMetrics(SM_CXSCREEN) / ,
GetSystemMetrics(SM_CYSCREEN) / ,
szFace, szMessage, );
Blend(, , , );
} 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(, , );
if(hr != DD_OK)
return false; DDSURFACEDESC ddsd;
memset(&ddsd, , 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[] = (dest[] + src[]) / ;
dest[] = (dest[] + src[]) / ;
dest[] = (dest[] + src[]) / ;
} void KDDrawWindow::Blend(int left, int right, int top, int bottom)
{
DDSURFACEDESC ddsd;
memset(&ddsd, , 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 * ;
for(int x = left; x < right; ++x, pixel += )
{
if(pixel[] != || pixel[] != || pixel[] != )
{
::Blend(pixel - , pixel); //left
::Blend(pixel + , 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(, szProgram, szProgram, WS_POPUP, GetSystemMetrics(SM_CXSCREEN) / , GetSystemMetrics(SM_CXSCREEN) / ,
GetSystemMetrics(SM_CXSCREEN) / , GetSystemMetrics(SM_CYSCREEN) / ,
NULL, NULL, hInstance); win.CreateSurface();
win.ShowWindow(nShowCmd);
win.UpdateWindow(); return win.MessageLoop();
}
DirectDraw创建Windows窗口的更多相关文章
- Direct3D 12 创建windows窗口
之前列出了计算机图形学的计划,现在开始这一阶段的学习,首先是Windows窗口的创建. 创建windows窗口 环境: 1. Visual Studio 2015 新建项目 创建工程项目完成,确定为窗 ...
- win32手动创建windows窗口的,小记
摘抄自文档,其中的函数需要以后花时间看 向 WinMain 添加功能 首先,在 WinMain 函数内部创建 WNDCLASSEX 类型的窗口类结构. 此结构包含有关窗口的信息,如应用程序图标.窗口的 ...
- 创建windows窗口
from tkinter import * win=Tk() #创建窗口对象 win.title("我的第一个gu ...
- win32 api Windows窗口的创建
windows窗口的创建有以下几个步骤: 1.创建注册窗口类 2.创建窗口句柄 3.显示更新窗口 4.消息循环 1.创建注册窗口类 所谓创建窗口类就是定义一个WNDCLASS类对象,并将该对象进行初始 ...
- Windows窗口的创建
Windows窗口创建的基本代码: #include <Windows.h> LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); i ...
- Windows窗口创建的具体步骤
/*实现窗口创建的六步骤:第一步:创建入口函数WinMain第二步:注册窗口类第三部:实现回调函数的功能第四步:显示窗口第五步:更新窗口第六步:消息循环*/ #include "stdafx ...
- 深入解析Windows窗口创建和消息分发(三个核心问题:怎么将不同的窗口过程勾到一起,将不同的hwnd消息分发给对应的CWnd类去处理,CWnd如何简单有效的去处理消息,由浅入深,非常清楚) good
笔记:争取不用看下面的内容,只看自己的笔记,就能记住这个流程,就算明白了: _tWinMain-->AfxWinMain,它调用四个函数: -->AfxWinInit用于做一些框架的初始化 ...
- java最简单的知识之创建一个简单的windows窗口,利用Frame类
作者:程序员小冰,CSDN博客:http://blog.csdn.net/qq_21376985 QQ986945193 微博:http://weibo.com/mcxiaobing 首先给大家看一下 ...
- 【转】Windows 窗口层次关系
原文链接:undefined! 相信在Windows 下面编程的很多兄弟们都不是很清楚Windows 中窗口的层次关系是怎么样的,这个东西很久已经研究过一下,后来又忘记了,今天又一次遇到了这个问题,所 ...
随机推荐
- 《javascript高级程序设计》第三章学习笔记
Undefined类型 该类型只有一个值,即undefined. 对未初始化的变量和未定义的变量,用typeof检测,都会返回'undefined' Null类型 该类型只有一个值,null.并且从逻 ...
- GIT 配置管理
git版本控制开发流程小结笔记(一) 收藏 何良瑞Nyanko君 ...
- iOS开发中的权限
权限分类 联网权限 相册权限 相机.麦克风权限 定位权限 推送权限 通讯录权限 日历.备忘录权限 联网权限 引入头文件 @import CoreTelephony; 应用启动后,检测应用中是否有联网权 ...
- JSON字符串与JSON对象的区别
Q:什么是"JSON字符串",什么是"JSON对象",两者的区别? a.JSON对象是直接可以使用JQuery操作的格式,如C#中可以用对象(类名)点出属性(方 ...
- 用BlazeMeter录制JMeter测试脚本
工具: 1,JMeter 2,Chrome 3,BlazeMeter 4,SwitchyOmega(如果需要代理) 步骤: 以上工具准备好以后就可以录制JMeter的测试脚本了, 在Chrome中点击 ...
- Testlink与Redmine关联
TestLink是一个开源的测试管理工具,它可以有效地管理整个测试流程(测试需求, 测试计划, 测试用例, 测试执行, 测试结果分析),但不能和开发流程统一起来,从而不能及时参与到开发中去,不能使项目 ...
- UDP server & client
Server: import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; ...
- Rational Rose2007下载安装教程以及问题处理
Rational Rose2007详细安装步骤 学习了UML,那么Rational rose画图软件当然就是必不可少的了.我的电脑是win7 64位的系统.下面的链接是安装软件以及破解方法.该软件是B ...
- Windows Phone 四、控件模版
控件模版的概念 Windows Phone中每一个控件都有一个默认的模版,用于描述控件的内部组成结构和外观样式 相对于原本的样式外观操作,自定义模版的可自定义性更强 最基本的重写控件模版 <Gr ...
- 据库都有哪些锁 然后 Kill session
当某个数据库用户在数据库中插入.更新.删除一个表的数据,或者增加一个表的主键时或者表的索引时,常常会出现ora-00054:resource busy and acquire with nowait ...