阿辉DirectX 11学习笔记一

目标:

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);
}

运行结果:
这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值