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, , );
}
} 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窗口的更多相关文章

  1. Direct3D 12 创建windows窗口

    之前列出了计算机图形学的计划,现在开始这一阶段的学习,首先是Windows窗口的创建. 创建windows窗口 环境: 1. Visual Studio 2015 新建项目 创建工程项目完成,确定为窗 ...

  2. win32手动创建windows窗口的,小记

    摘抄自文档,其中的函数需要以后花时间看 向 WinMain 添加功能 首先,在 WinMain 函数内部创建 WNDCLASSEX 类型的窗口类结构. 此结构包含有关窗口的信息,如应用程序图标.窗口的 ...

  3. 创建windows窗口

    from tkinter import * win=Tk()                                       #创建窗口对象 win.title("我的第一个gu ...

  4. win32 api Windows窗口的创建

    windows窗口的创建有以下几个步骤: 1.创建注册窗口类 2.创建窗口句柄 3.显示更新窗口 4.消息循环 1.创建注册窗口类 所谓创建窗口类就是定义一个WNDCLASS类对象,并将该对象进行初始 ...

  5. Windows窗口的创建

    Windows窗口创建的基本代码: #include <Windows.h> LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); i ...

  6. Windows窗口创建的具体步骤

    /*实现窗口创建的六步骤:第一步:创建入口函数WinMain第二步:注册窗口类第三部:实现回调函数的功能第四步:显示窗口第五步:更新窗口第六步:消息循环*/ #include "stdafx ...

  7. 深入解析Windows窗口创建和消息分发(三个核心问题:怎么将不同的窗口过程勾到一起,将不同的hwnd消息分发给对应的CWnd类去处理,CWnd如何简单有效的去处理消息,由浅入深,非常清楚) good

    笔记:争取不用看下面的内容,只看自己的笔记,就能记住这个流程,就算明白了: _tWinMain-->AfxWinMain,它调用四个函数: -->AfxWinInit用于做一些框架的初始化 ...

  8. java最简单的知识之创建一个简单的windows窗口,利用Frame类

    作者:程序员小冰,CSDN博客:http://blog.csdn.net/qq_21376985 QQ986945193 微博:http://weibo.com/mcxiaobing 首先给大家看一下 ...

  9. 【转】Windows 窗口层次关系

    原文链接:undefined! 相信在Windows 下面编程的很多兄弟们都不是很清楚Windows 中窗口的层次关系是怎么样的,这个东西很久已经研究过一下,后来又忘记了,今天又一次遇到了这个问题,所 ...

随机推荐

  1. java 给指定时间加上天数or给当前日期加天数

    给指定日期加上天数: /** * 指定日期加上天数后的日期 * @param num 为增加的天数 * @param newDate 创建时间 * @return * @throws ParseExc ...

  2. HTTP常见头域

    近期没需求,也没什么心情去看书,就总结一下自己以前看的HTTP协议基础内容吧.(会很乱,可能不适合一点都没接触过HTTP协议的人观看) 一.HTTP Request header 1.Cache头域 ...

  3. placeholder文字颜色与是否显示兼容性

    1.ie显示问题 <script type="text/javascript"> $(document).ready(function(){ var doc=docum ...

  4. 我理解的IOC技术在Java和C#中比较分析

    一直想用心写这个系列的文章,其实看得越多,也就越觉得自己在这方面的功力太浅,也就越不想班门弄斧啦,作为一个开篇,我想把这个技术深层次化,在之前的.net的一个MVC系列文章其实已经涉及到了,只是.ne ...

  5. Linux下查看Nginx安装目录、版本号信息?

    Linux环境下,怎么确定Nginx是以那个config文件启动的? 输入命令行: ps  -ef | grep nginx 摁回车,将出现如下图片: master process 后面的就是 ngi ...

  6. windows update一直卡住:“正在此计算机上搜索更新”

    参考:http://blog.163.com/smile_big/blog/static/35710579201611875333164/ 解决办法: 管理员运行cmd,输入以下命令 net stop ...

  7. Redis在Linux下的安装和启动和配置

    第一步:下载Redis安装包,下载版本:3.0.5 在所在目录右键打开终端输入命令: wget http://download.redis.io/releases/redis-3.0.5.tar.gz ...

  8. 在设置app icon时的问题

    APP 运行时遇到 the app icon set named appicon did not have any applicable content 是应该考虑是icon可能偏大

  9. C++数组实现的循环队列

    #include<iostream> #include <string> /* 功能:数组实现的循环队列,C++实现,学习参考 */ using namespace std; ...

  10. 彻底弄懂css中单位px和em,rem的区别

    国内的设计师大都喜欢用px,而国外的网站大都喜欢用em和rem,那么三者有什么区别,又各自有什么优劣呢? PX特点 -1. IE无法调整那些使用px作为单位的字体大小: -2. 国外的大部分网站能够调 ...