在Visual Studio中,要创建一个窗口,可以利用Windows API进行开发。Windows API是微软为了方便开发基于Windows的应用程序所提供的一种函数,这是操作系统提供给应用程序的接口,即:Application Programming Interface,简称API。
要在创建一个窗体,需要一下步骤
1.设计窗口类:一个完整的窗口具有许多特征,所以在创建一个Windows应用程序的窗口之前,也必须对该类型的窗口进行设计,所以需要设计窗口类。Windows 中控制窗口的特征的结构体有两个:WNDCLASS和WNDCLASSEX。
2.窗口类的注册:在生活中,设计完一辆跑车,需要报有关国家部门的审批,只有通过审批才可以合法的生产这种类型的跑车。同理,我们设计完窗口类后,需要调用RegisterClass函数对其进行注册。
3.窗口的正式创建:当设计好并且将其成功注册后,就可以使用CreateWindows函数来创建设计好的窗口
4.窗口的显示与更新:这一步里面用到了三个函数,首先是用于设定窗口位置的MoveWindows函数,然后是用于显示函数的ShowWindows函数,最后是用与更新窗口的UpdateWindows函数。
5.消息循环体统:在经过窗口创建以后,还需要一个消息循环,不断的从消息队列中取出消息,并且进行响应。这里有两个函数进行选择,分别是GetMessage和PeekMessage
6.创建窗口过程函数:窗口过程函数是Windows函数的中枢神经。窗口过程函数,主要用于处理发送给窗口的消息。一般的Windows应用程序的主要代码部分就集中在窗口过程函数中。而对于游戏程序而言,在窗口过程函数中式很少去写大量代码的。
7.做好善后工作—窗口类的注销
以下就是简单的创建一个窗口的程序:
要在创建一个窗体,需要一下步骤
1.设计窗口类:一个完整的窗口具有许多特征,所以在创建一个Windows应用程序的窗口之前,也必须对该类型的窗口进行设计,所以需要设计窗口类。Windows 中控制窗口的特征的结构体有两个:WNDCLASS和WNDCLASSEX。
2.窗口类的注册:在生活中,设计完一辆跑车,需要报有关国家部门的审批,只有通过审批才可以合法的生产这种类型的跑车。同理,我们设计完窗口类后,需要调用RegisterClass函数对其进行注册。
3.窗口的正式创建:当设计好并且将其成功注册后,就可以使用CreateWindows函数来创建设计好的窗口
4.窗口的显示与更新:这一步里面用到了三个函数,首先是用于设定窗口位置的MoveWindows函数,然后是用于显示函数的ShowWindows函数,最后是用与更新窗口的UpdateWindows函数。
5.消息循环体统:在经过窗口创建以后,还需要一个消息循环,不断的从消息队列中取出消息,并且进行响应。这里有两个函数进行选择,分别是GetMessage和PeekMessage
6.创建窗口过程函数:窗口过程函数是Windows函数的中枢神经。窗口过程函数,主要用于处理发送给窗口的消息。一般的Windows应用程序的主要代码部分就集中在窗口过程函数中。而对于游戏程序而言,在窗口过程函数中式很少去写大量代码的。
7.做好善后工作—窗口类的注销
以下就是简单的创建一个窗口的程序:
#define WINDOW_WIDTH 800 //宏定义窗口的宽度
#define WINDOW_HEIGHT 600 //宏定义窗口的高度
#define WINDOW_TITLE L"我们永远不放弃的梦想" //为窗口标题定义的宏
//------------------------------------------------------
//全局函数声明
//------------------------------------------------------
LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
//描述Windows应用程序的入口函数,程序从这里开始
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nShowCmd )
{
//窗口创建的四部曲之一:开始设计一个完整的窗口类
WNDCLASSEX wndClass={0}; //用WNDCLASSEX定义了一个窗口类
wndClass.cbSize=sizeof(WNDCLASSEX); //设置结构体的字节数大小
wndClass.style=CS_HREDRAW|CS_VREDRAW; //设置窗口的样式
wndClass.lpfnWndProc=WndProc;//设置指向窗口过程函数的指针
wndClass.cbClsExtra=0;
wndClass.cbWndExtra=0;
wndClass.hInstance=hInstance;//制定包含窗口过程函数的程序的实例句柄。
wndClass.hIcon=(HICON)::LoadImage(NULL,L"icon.ico",IMAGE_ICON,0,0,LR_DEFAULTSIZE|LR_LOADFROMFILE);//本地加载自定义ico图标
wndClass.hCursor=LoadCursor(NULL,IDC_ARROW);//指定窗口类的光标句柄
wndClass.hbrBackground=(HBRUSH)GetStockObject(GRAY_BRUSH);//为hbrBackground成员指定一个灰色画刷句柄
wndClass.lpszMenuName=NULL;
wndClass.lpszClassName=L"ForTheDreamOfGameDevelop";//用一个以空终止的字符,指定窗口类的名字
//窗口的创建四部曲之二:注册窗口类
if(!RegisterClassEx(&wndClass))
{
return -1;
}
//窗口的创建四部曲之三:正式创建窗口
HWND hwnd=CreateWindow(L"ForTheDreamOfGameDevelop",WINDOW_TITLE,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,
CW_USEDEFAULT,WINDOW_WIDTH,WINDOW_HEIGHT,NULL,NULL,hInstance,NULL);//喜闻乐见的CreateWindow函数
//窗口的创建四部曲之四:窗口的移动、显示与更新
MoveWindow(hwnd,250,80,WINDOW_WIDTH,WINDOW_HEIGHT,true);
ShowWindow(hwnd,nShowCmd);
UpdateWindow(hwnd);
//消息循环系统
MSG msg={0};
while(msg.message!=WM_QUIT)//使用WHILE循环,如果消息不是WM_QUIT时,就继续循环
{
if(PeekMessage(&msg,0,0,0,PM_REMOVE))//查看应用消息队列,有消息是将消息派发出去
{
TranslateMessage(&msg);//将虚拟键的消息转换为字符消息
DispatchMessage(&msg);//分发一个消息给窗口程序
}
}
//窗口类的注销
UnregisterClass(L"ForTheDreamOfGameDevelop",wndClass.hInstance);
return 0;
}
//窗口过程函数,对窗口消息进行处理
LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
switch(message)
{
case WM_PAINT: //若是客户重绘消息
ValidateRect(hwnd,NULL);//更新客户区的显示
break;
case WM_KEYDOWN: //若是键盘按下消息
if(wParam==VK_ESCAPE) //如果按下的键是ESC
DestroyWindow(hwnd); //销毁窗口,并发送一条WM_DESTROY消息
break;
case WM_DESTROY: //若属销毁窗口消息
PostQuitMessage(0);
break;
default: //若上述条件都不符合,则执行default语句
return DefWindowProc(hwnd,message,wParam,lParam);//调用默认窗口过程函数
}
return 0;//正常退出
}