D3D Learning_01_CreateWindow
// Learn_01_CreateWindow.cpp : Defines the entry point for the application.
// #include "stdafx.h"
#include < windows.h>
#include "resource.h" //--------------------------------------------------------------------------------------
// 全局变量
//-------------------------------------------------------------------------------------- //HINSTANCE 是“句柄型”数据类型。相当于装入到了内存的资源的ID。
//HINSTANCE对应的资源是instance.句柄实际上是一个无符号长整数。
//但它是“句柄型”,所以你不能把它当成真的无符号长整数,拿来派别的用处,例如,不能拿来做四则运算。
HINSTANCE g_hInst = NULL;
//h是类型描述,表示句柄(handle),Wnd 是变量对象描述,表示窗口,所以hWnd 表示窗口句柄
HWND g_hWnd = NULL; //--------------------------------------------------------------------------------------
// 函数声明
//-------------------------------------------------------------------------------------- //HRESULT=h+result(句柄结果)。如果这个函数是执行完返回的话将包含具有实际意义的数据,
//如果立即返回则包含状态信息--发送成功与否,并不能说明执行的如何。
HRESULT InitWindow(HINSTANCE hInstance, int nCmdShow);
//LRESULT就是longresult,也就是长整型
//之所以取名类LRESULT, 是因为L即long
//result表示结果, 说明这个函数的返回值是某个结果
//CALLBACK,回调函数就是一个通过函数指针调用的函数
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); //--------------------------------------------------------------------------------------
// 程序入口。初始化,并进入消息循环。空闲时间用来绘制场景。
//--------------------------------------------------------------------------------------
int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow)
{
UNREFERENCED_PARAMETER(hPrevInstance);//UNREFERENCED_PARAMETER 未引用的参数
UNREFERENCED_PARAMETER(lpCmdLine); if (FAILED(InitWindow(hInstance, nCmdShow))) //FAILED失败
return ; // 消息循环 /*
MSG是Windows程序中的结构体,
在Windows程序中,消息是由MSG结构体来表示的。MSG结构体的定义如下(参见MSDN):
typedef struct tagMSG {
HWND hwnd; //表示消息所属的窗口
UINT message; //制定了消息的标示符,在Windows中,消息是由一个数值来表示的,不同的消息对应不同的数值。
//但是由于数值不便于记忆,所以Windows将消息对应的数值定义为WM_XXX宏(WM是Windows message的缩写)的形式
//XXX对应某种消息的英文拼写的大写形式。例如,鼠标左键按下的消息是WM_LBUTTONDOWN,键盘按下消息是WM_KEYDOWN
//字符消息是WM_CHAR,等等。在程序中我们通常都是以WM_XXX宏的形式来使用消息的。
WPARAM wParam;
LPARAM lParam; //wParam和lParam,用于指定消息的附加信息。例如,当我们收到一个字符消息的时候,message成员变量的值就是WM_CHAR
//但是用户到底输入的是什么字符,那么就由wParam和lParam来说明。
DWORD time;
POINT pt; //time和pt分别表示消息投递到消息队列中的时间和鼠标的当前位置
} MSG;
*/
MSG msg = { };
while (GetMessage(&msg, NULL, , ))
{
TranslateMessage(&msg); //TranslateMessage将虚拟键消息转换为字符消息。字符消息被寄送到调用线程的消息队列里
//当下一次线程调用函数GetMessage或PeekMessage时被读出,函数原型BOOL TranslateMessage( CONST MSG*lpMsg );
DispatchMessage(&msg); //DispatchMessage表示分发一个消息给窗口程序。通常消息从GetMessage函数获得。消息被分发到回调函数(过程函数)
//作用是消协传递给操作系统,然后操作系统去操作我们的回调函数,也就是说我们在窗体的过程中处理消息
} return (int)msg.wParam;
} //--------------------------------------------------------------------------------------
// 注册窗口类并创建窗口
//--------------------------------------------------------------------------------------
HRESULT InitWindow(HINSTANCE hInstance, int nCmdShow)
{
/* WNDCLASSEX的原型如下:
typedef struct WNDCLASSEX {
UINT cbSize; //WNDCLASSEX的大小,我们可以用sizeof(WNDCLASSEX)来获得准确的值
UINT style; //从这个窗口类派生的窗口具有的风格。可以用“or”操作符来把几个风格或到一起
WNDPROC lpfnWndProc; //窗口处理函数的指针,lpfn前缀表示该成员是一个指向函数的长指针
int cbClsExtra; //指定紧跟在窗口结构后的附加字节数
int cbWndExtra; //指定紧跟在窗口实例的附加字节数。如果一个应用程序在资源中用CLASS伪指令注册一个对话框类是,
//则必须把这个成员设成DLGWINDOWEXTRA
HINSTANCE hInstance; //本模块的实例句柄
HICON hIcon; //图标的句柄
HCURSOR hCursor; //光标的句柄
HBRUSH hbrBackground; //背景画刷的句柄
LPCTSTR lpszMenuName; //指向菜单的指针
LPCTSTR lpszClassName; /指向类名的指针
HICON hIconSm; //和窗口类关联的小图标。如果该值为MULL。则把hlcon中的图标转换成大小合适的小图标
} WNDCLASSEX, *PWNDCLASSEX;
*/
// 注册窗口类
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX); //sizeof,判断数据类型长度符关键字,返回值为内存所占字节数
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = WndProc;
wcex.cbClsExtra = ;
wcex.cbWndExtra = ;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, nullptr);
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + );
wcex.lpszMenuName = NULL;
wcex.lpszClassName = L"TutorialWindowClass";
wcex.hIconSm = LoadIcon(wcex.hInstance, nullptr);
if (!RegisterClassEx(&wcex))
return E_FAIL; // 创建窗口
g_hInst = hInstance;
RECT rc = { , , , }; //RECT用于储存成对出现的参数,原型为 typedef struct _RECT {LONG left;LONG top;LONG right;LONG bottom;} RECT, *PRECT /*AdjustWindowRect依据所需客户矩形的大小,计算需要的窗口矩形的大小,计算出的窗口矩形随后可以传递给CreateWindows函数,
用于创建一个客户区所需大小的窗口
函数原型:BOOL AdjustWindowRect(LPRECT lpRect ,DWORD dwStyle,BOOL bMENU);
参数说明:
lpRect:指向RECT结构的指针,该结构包含所需客户区域的左上角和右下角的坐标。函数返回时,该结构容纳所需客户区域的窗口的左下角和右下角的坐标
dwStyle:指定将被计算尺寸的窗口的窗口风格
bMENU:指示窗口是否有菜单
*/
AdjustWindowRect(&rc, WS_OVERLAPPEDWINDOW, FALSE); /*CreateWindow
HWND CreateWindow(
LPCTSTR lpClassName, //指向一个空结束的字符串或整型数atom。如果该参数是一个整型量,
//它是由此前调用theGlobalAddAtom函数产生的全局量。
//这个小于0xC000的16位数必须是lpClassName参数字的低16位,该参数的高位必须是0。
//如果lpClassName是一个字符串,它指定了窗口的类名。
//这个类名可以是任何用函数RegisterClass注册的类名,或是任何预定义的控制类名。
LPCTSTR lpWindowName,//指向一个指定窗口名的空结束的字符串指针。
//如果窗口风格指定了标题条,由lpWindowName指向的窗口标题将显示在标题条上。
//当使用Createwindow函数来创建控制例如按钮,选择框和静态控制时,可使用lpWindowName来指定控制文本。 DWORD dwStyle, //窗口的风格,如WS_BORDER:创建一个带边框的窗口,WS_HSCROLL:创建一个有水平滚动条的窗口。
int x, //指定窗口的初始水平位置,如果该参数被设为CW_USEDEFAULT则系统为窗口选择缺省的左上角坐标并忽略Y参数
int y, //指定窗口的初始垂直位置
int nWidth, //以设备单元指明窗口的宽度
int nHeight,//以设备单元指明窗口的高度
HWND hWndParent, //指向被创建窗口的父窗口或所有者窗口的句柄
HMENU hMenu, //菜单句柄,或依据窗口风格指明一个子窗口标识。对于层叠或弹出式窗口,
//hMenu指定窗口使用的菜单:如果使用了菜单类,则hMenu可以为NULL。
//对于子窗口,hMenu指定了该子窗口标识(一个整型量),一个对话框使用这个整型值将事件通知父类。
//应用程序确定子窗口标识,这个值对于相同父窗口的所有子窗口必须是唯一的。
HANDLE hlnstance, //与窗口相关联的模块实例的句柄。
LPVOID lpParam //指向一个值的指针,该值传递给窗口WM_CREATE消息。该值通过在IParam参数中的CREATESTRUCT结构传递。
//如果应用程序调用CreateWindow创建一个MDI客户窗口,则lpParam必须指向一个CLIENTCREATESTRUCT结构。
);
//返回值:如果函数成功,返回值为新窗口的句柄:如果函数失败,返回值为NULL。若想获得更多错误信息,请调用GetLastError函数。
*/
g_hWnd = CreateWindow(L"TutorialWindowClass", L"Direct3D Learning 01: Create Window", WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, rc.right - rc.left, rc.bottom - rc.top, NULL, NULL, hInstance,
NULL);
if (!g_hWnd)
return E_FAIL; ShowWindow(g_hWnd, nCmdShow); return S_OK;
} //--------------------------------------------------------------------------------------
// 每次当应用程序接收消息时调用这个方法
//--------------------------------------------------------------------------------------
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
PAINTSTRUCT ps; //PAINTSTRUCT包含了某种应用程序用来绘制它所拥有的窗口客户区所需要的信息
HDC hdc; switch (message)
{
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
EndPaint(hWnd, &ps);
break; case WM_DESTROY:
PostQuitMessage();
break; default:
return DefWindowProc(hWnd, message, wParam, lParam);
} return ;
}
D3D Learning_01_CreateWindow的更多相关文章
- FFmpeg滤镜实现区域视频增强 及 D3D实现视频播放区的拉大缩小
1.区域视频增强 FFmpeg滤镜功能十分强大,用滤镜可以实现视频的区域增强功能. 用eq滤镜就可以实现亮度.对比度.饱和度等的常用视频增强功能. 推荐两篇写得不错的博文: (1)ffmpeg综合应用 ...
- D3D三层Texture纹理经像素着色器实现渲染YUV420P
简单记录一下这两天用Texture实现渲染YUV420P的一些要点. 在视频播放的过程中,有的时候解码出来的数据是YUV420P的.表面(surface)通过设置参数是可以渲染YUV420P的,但Te ...
- D3D的绘制
一.D3D中的绘制 顶点缓存和索引缓存:IDirect3DVertexBuffer9 IDirect3DIndexBuffer 使用这两缓存而不是用数组来存储数据的原因是,缓存可以被放置在显存中,进行 ...
- [ZZ] D3D中的模板缓存(3)
http://www.cppblog.com/lovedday/archive/2008/03/25/45334.html http://www.cppblog.com/lovedday/ D3D中的 ...
- D3D的内存类型
一.对D3D中AGP显存.内存.显存三种内存的解释 三种内存AGP内存(非本地显存),显存(本地内存),系统内存,其中我们都知道系统内存就是咱那内存条,那这AGP内存是个啥玩意啊?其实是因为在以前显卡 ...
- D3D depth buffer的预览
在使用D3D开发游戏的过程中,很多情况下都会用到depth buffer来完成特定的效果,比如DOF,Shadows,SSAO等等.在这些情况下我们就可能需要预览depth buffer来确定它是正确 ...
- D3D中深度测试和Alpha混合的关系
我在学习D3D的深度测试和Alpha混合的时候,有一些遗憾.书上提供的例子里说一定要先渲染不透明物体,再渲染透明物体,对渲染状态的设置也有特殊要求.我看的很晕.自己查图形学的书,上网找资料,结果还是糊 ...
- D3D渲染流程--转载
http://www.cnblogs.com/ixnehc/articles/1282350.html 先从最基础的写起吧,关于Device的渲染流程. D3D9的Device就是D3D给我们提供的一 ...
- 使用D3D渲染YUV视频数据
源代码下载 在PC机上,对于YUV格式的视频如YV12,YUY2等的显示方法,一般是采用DIRECTDRAW,使用显卡的OVERLAY表面显示.OVERLAY技术主要是为了解决在PC上播放VCD而在显 ...
随机推荐
- Java原生API操作XML
使用Java操作XML的开源框架比较多,如著名的Dom4J.JDOM等,但个人认为不管你用那个框架都要对JDK原生的API有所了解才能更得心应手的应用.本篇就来简单了解下原生的XML API. JAV ...
- Java垃圾回收学习笔记
通常来说,要写Java代码,你基本上都没必要听说垃圾回收这个概念的.这不,对于已经写了5年多Java代码的我来说,我还没有哪次经历说是需要使用垃圾回收方面的知识来解决问题的.但是,我依然督促自己花了几 ...
- ActiveMQ学习系列(四)----消息持久化到mysql
前记:目前学习还比较杂乱,还未找到系统化地学习ActiveMq的方法.在网上看到消息持久化的demo,了解了一下,在此记录. 一.目前ActiveMq支持的持久化方法 url:http://activ ...
- .NET 三层架构
三层架构简介: 三层架构(3-tier architecture) 通常意义上的三层架构就是将整个业务应用划分为:界面层(User Interface layer).业务逻辑层(Business Lo ...
- Implement Stack using Queues leetcode
Implement the following operations of a stack using queues. push(x) -- Push element x onto stack. po ...
- 在LaTeX 与 LyX 中设置“Contents”为“目录”
在 LaTeX 中,目录一般被显示为英文"Contents",因此需要设置成"目录". 通常在 Preamble 按照如下方式设置: \renewcommand ...
- (16)IO流之输入字节流FileInputStream和输出字节流FielOutputStream
IO流技术解决的问题:设备与设备之间的传输问题,内存-->硬盘,硬盘-->内存,等等 IO流技术 如果按照数据的流向划分可以划分为:输入流和输出流 输入输出的标准是以程序为参考物的,如果流 ...
- Hadoop2.7.3+Spark2.1.0完全分布式集群搭建过程
1.选取三台服务器(CentOS系统64位) 114.55.246.88 主节点 114.55.246.77 从节点 114.55.246.93 从节点 之后的操作如果是用普通用户操作的话也必须知道r ...
- pyqt样式表语法笔记(上) --原创
pyqt样式表语法笔记(上) pyqt QSS python 样式表 因为软件课设的原因开始学习使用pyqt4,才发现原来它也有样式表,而且语法跟css基本相同,而且一些功能实现起来感觉比js要简单方 ...
- 模块化规范Common.js,AMD,CMD
随着网站规模的不断扩大,嵌入网页中的javascript代码越来越大,开发过程中存在大量问题,如:协同开发,代码复用,大量文件引入,命名冲突,文件依赖. 模块化编程称为迫切的需求. 所谓的模块,就是实 ...