目标:

1.怎样创建一个工程
2.怎样建立窗口程序

创建工程:

打开Microsoft Visual C++ 2010 Express——>文件——新建——>项目——>空项目——>输入项目名称——>确定;

建立窗口程序:

在左侧的解决方案资源管理器窗口下右键单击源文件——>添加——>新建项——>C++文件——>输入文件名称(main)——>确定;

主函数的入口点:

具体代码:

#include<Windows.h>
int WINAPI wWinMain(HINSTANCE hinstance,HINSTANCE previnstance,LPWSTR cmdline,int cmdShow)
{
return 0;
}

解释:

WINAPI:调用约定,约定如何产生机械码以在堆栈中放置函数的参数(在计算机中,它不知道函数调用了几次,如何分配给函数参数,这就需要我们人为作出一些约定)
wWinMain:主函数,与WinMain的区别在于他们的第三个参数LPWSTR cmdline,因为他们使用了命令行,所以在输入时计算机会根据主函数的类别判断使用何种编码(wWinMain使用的是Unicode,WinMain使用的是ANSI)
HINSTANCE hinstance:应用程序当前实例句柄;
HINSTANCE prevlnstance:应用程序前一个实例句柄(通常为NULL);
LPSWSTR cmdline:应用程序的命令行由程序外部输入,LP的前缀代表长指针。
int cmdShow:窗口被显示为那个模式的ID号(例如最小化,正常化,最大化等);

窗口初始化:

步骤:消除警告——>初始化窗口类——>注册窗口——>计算窗口尺寸——>创建窗口——>显示窗口;
具体代码及其解释:

#include<Windows.h>
int WINAPI wWinMain(HINSTANCE hinstance,HINSTANCE previnstance,LPWSTR cmdline,int cmdShow)
{
//消除警告(unreferenced:未引用的,parameter:参数)
UNREFERENCED_PARAMETER(previnstance);
UNREFERENCED_PARAMETER(cmdline);
//初始化窗口类
WNDCLASSEX wndClass={0};
wndClass.cbSize=sizeof(WNDCLASSEX);//该结构占用的字节数w ndClass.style=CS_HREDRAW|CS_VREDRAW;//窗口样式
wndClass.lpfnWndProc=WndProc;//回调函数,函数指针
wndClass.hInstance=hinstance;//实例句柄
wndClass.hCursor=LoadCursor(NULL,IDC_ARROW);//鼠标形状的ID号
wndClass.hbrBackground=(HBRUSH)(COLOR_WINDOW+1);//绘制窗口背景的背景画刷句柄
wndClass.lpszMenuName=NULL;//菜单名
wndClass.lpszClassName="阿辉";
//注册窗口
if(!RegisterClassEx(&wndClass))
return -1;
//计算窗口尺寸
RECT rc={0,0,640,480};
AdjustWindowRect(&rc,WS_OVERLAPPEDWINDOW,false);
//创建窗口
HWND hwnd=CreateWindow("张?辉?","Blank Win32 Window",WS_OVERLAPPEDWINDOW,0,0,rc.right-rc.left,rc.bottom-rc.top,NULL,NULL,hinstance,NULL);
if(!hwnd) return -1;
//显示窗口
ShowWindow(hwnd,cmdShow);
return 0;
}

补充:函数CreatWindow()的参数定义:
lpClassName:窗口类名字;
lpWindowName:窗口标题栏名称;
dwStyle:窗口风格标志;
X:窗口的水平位置;
Y:窗口的垂直位置;
NWidth:窗口的宽度;
nHeight:窗口的高度;
hWndParent:窗口的父亲句柄;
hMenu:窗口的菜单资源句柄;
Hinstance:程序的实例句柄;
lpParam:传给窗口的数据;
在编译器上运行时,这行代码会产生一个错误,来自WndProc,在回调函数时,因为我们并没有定义WndProc,所以会出错;

WndProc函数

LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
PAINTSTRUCT ps;
HDC hDC;
switch(message)
{
case WM_PAINT:
hDC=BeginPaint(hwnd,&ps);
EndPaint(hwnd,&ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:return DefWindowProc(hwnd,message,wParam,lParam);
}
return 0;
}

解释:
LRESULT:long result,长整型;
CALLBACK:回调;
UINT:无符号短整型;
WPARAM/LPARAM:补充数据;
PAINTSTRUCT:包含了绘制窗口客户区的信息;
HDC:用于绘制的句柄;
WM_PAINT/VM_DESTROY:响应/退出绘制消息;
PostQuitMessage:会使得循环消息中的MSG得到WM_QUIT消息,然后按照我们的设定结束应用程序循环并且退出程序;
DefWindowProc:具有和wndProc相同的参数,它调用默认行为处理所有wndProc没处理的消息,确保我们响应每一个消息;
写好了wndProc函数后我们就得到了一段无错的代码了,这是如果运行就会得到一个一闪而逝的窗口;这是因为我们只有一个消息处理了,重复消息循环才可以得到我们想要的。

消息循环:

具体代码:
//消息循环

MSG msg={0};
while(msg.message!=WM_QUIT)
{
if(PeekMessage(&msg,0,0,0,PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}

return static_cast(msg.wParam);
解释:
MSG:消息结构;
PeekMessage:如果得到消息,则返回1;如果没有,则返回0;参数依次代表的含义是:接受消息信息的MSG结构的指针,其消息被检查的窗口句柄,被检查消息范围内的第一个消息,被检查消息范围内的最后一个消息,消息如何处理;
TranslateMessage:win32函数,将虚拟键消息翻译为字符消息;
DispatchMessage:调度函数,将消息传给窗口过程处理;
所有代码完结。
完整代码:

#include<Windows.h>
LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
PAINTSTRUCT ps;
HDC hDC;
switch(message)
{
case WM_PAINT:
hDC=BeginPaint(hwnd,&ps);
EndPaint(hwnd,&ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:return DefWindowProc(hwnd,message,wParam,lParam);
}
return 0;
}
int WINAPI wWinMain(HINSTANCE hinstance,HINSTANCE previnstance,LPWSTR cmdline,int cmdShow)
{
UNREFERENCED_PARAMETER(previnstance);
UNREFERENCED_PARAMETER(cmdline);
WNDCLASSEX wndClass={0};
wndClass.cbSize=sizeof(WNDCLASSEX);
wndClass.style=CS_HREDRAW|CS_VREDRAW;
wndClass.lpfnWndProc=WndProc;
wndClass.hInstance=hinstance;
wndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
wndClass.hbrBackground=(HBRUSH)(COLOR_WINDOW+1);
wndClass.lpszMenuName=NULL;
wndClass.lpszClassName="张?辉?";
if(!RegisterClassEx(&wndClass))
return -1;
RECT rc={0,0,640,480};
AdjustWindowRect(&rc,WS_OVERLAPPEDWINDOW,false);
HWND hwnd=CreateWindow("张?辉?","阿恪?辉?",WS_OVERLAPPEDWINDOW,0,0,rc.right-rc.left,rc.bottom-rc.top,NULL,NULL,hinstance,NULL);
if(!hwnd) return -1;
ShowWindow(hwnd,cmdShow);
MSG msg={0};
while(msg.message!=WM_QUIT)
{
if(PeekMessage(&msg,0,0,0,PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{}
}
return static_cast<int>(msg.wParam);
}

运行结果:

阿辉DirectX 11学习笔记一相关推荐

  1. DirectX 11 学习笔记-Part2-4【Cubemap/贴图置换/阴影/屏幕空间环境光遮蔽】【原理篇】

    代码已上传至GitHub,这部分对应的项目为NormalDisplacementSsao.运行项目时可以使用数字键1-3切换渲染的shader,另外按下z键可以看到SSAO生成的遮罩贴图. 这部分内容 ...

  2. Introduction to 3D Game Programming with DirectX 11学习笔记 6 Direct3D中的绘制(一)

    顶点和顶点布局 在Direct3D中,顶点由空间位置和各种附加属性组成,Direct3D可以让我们灵活地建立属于我们自己的顶点格式:换句话说,它允许我们定义顶点的分量.要创建一个自定义的顶点格式,我们 ...

  3. DirectX 11 学习笔记(3)- 创建交换链

    填充DXGI_SWAP_CHAIN_DESC结构体来描述我们将要创建的交换链的特性. Typedef struct DXGI_SWAP_CHAIN_DESC {DXGI_MODE_DESC Buffe ...

  4. Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十三章:计算着色器(The Compute Shader)...

    Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十三章:计算着色器(The Compute Shader) 原文: Int ...

  5. Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十五章:第一人称摄像机和动态索引...

    Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十五章:第一人称摄像机和动态索引 原文:Introduction to 3 ...

  6. main 函数解析(二)—— Linux-0.11 学习笔记(六)

    main函数解析(二)--Linux-0.11 学习笔记(六) 4.6 blk_dev_init函数 void blk_dev_init(void) {int i;for (i=0 ; i<NR ...

  7. main函数解析(一)——Linux-0.11 学习笔记(五)

    main()函数解析(一)--Linux-0.11 学习笔记(五) 经过了前面的各种铺垫,终于来到了main函数.这篇博客的任务是把init/main.c讲清楚.由于牵扯到很多的函数调用,要想一次就说 ...

  8. kernel_mktime() 详解 —— Linux-0.11 学习笔记(四)

    题目:kernel_mktime() 详解 -- Linux-0.11 学习笔记(四) 在init/main.c文件中,有一个函数static void time_init(void) 该函数读取 C ...

  9. setup.s 分析—— Linux-0.11 学习笔记(二)

    更新记录 版本 时间 修订内容 1.0 2018-4-14 增加了"获取显示模式"这一节,AL取值的表格 标题: setup.s 分析-- Linux-0.11 学习笔记(二) 老 ...

  10. DirectX 3D学习笔记(一)

    DirectX 3D学习笔记(一) Ⅰ.渲染状态 设备的渲染状态控制Direct3D设备的光栅化组件的行为.通过改变光栅渲染状态属性,可以设置使用何种方式来进行渲染着色,以及如何进行雾化等. 在Dir ...

最新文章

  1. MIT发布白皮书:美国欲重返世界半导体霸主!
  2. jsp的<a>标签中怎么传递参数
  3. redisson redlock(基于redisson框架和redis集群使用分布式锁)
  4. 服务器能安装ios系统吗,想给iPhone重装iOS,怎能不用iMazing
  5. 如何在 SAP CRM WebClient UI 里在 Context node 上下文里访问其他 Context Node 的数据
  6. Linux 混合编译opencv与opencv_contrib的android版本
  7. LeetCode 1155. 掷骰子的N种方法(DP)
  8. 元素上下层叠关系总结
  9. mysql命令查找失效索引_mysql查询时无效索引的简单总结
  10. 输出素数和排序后的数组和杨辉三角
  11. 大家好,我就是那个提【换手机壳颜色变app主题】需求的“产品经理”
  12. 【物理应用】基于matlab GUI工程供配电系统【含Matlab源码 1051期】
  13. 多元统计分析(笔记更新中...)
  14. Linux笔记(十二) Linux集群搭建(附带视频详解)
  15. 自定义 Bean 作用域
  16. 中医针灸学综合练习题库【10】
  17. 想考阿里云ACE需要做什么准备?考下来难不难?
  18. 开发和常用工具推荐清单
  19. 学习Chrome Devtools 调试
  20. 数据采集_化妆品生产许可信息管理系统服务平台

热门文章

  1. c++filt 命令
  2. 数据结构实验之二叉树二:遍历二叉树(中序后序遍历)
  3. POJ 2112 Optimal Milking(最大流)
  4. 使用定时器时遇到warning: #188-D: enumerated type mixed with another type警告
  5. php日历排班表,如何用Word制作超精美的日历、值班表、计划表?
  6. 论文阅读笔记:Weakly-supervised Semantic Segmentation in Cityscape via Hyperspectral Image
  7. linux服务篇-Squid服务
  8. C# NPOI Excel 合并单元格和取消单元格
  9. 结构体定义的三种方法总结
  10. 为什么网站总显示服务器不能创建对象,automation服务器不能创建对象”的问题的解决方案总结大全...