VC++ game(四) 通过Windows API 来创建一个空窗口

前面写的都是通过MFC来进行编程,讲到缓冲机制就结束了,由于要进行3D开发,老师又开始介绍不适用MFC,直接通过windows的api来编程。、

还是从最简单的开始,创建一个窗口。

基本步骤:

1:

实例化一个窗口结构体对象,设置参数值。

可通过WNDCLASSEX或者WNDCLASS来创建,WNDCLASSEX是WNDCLASS的超级,多了两个参数,一个是结构体的大小,一个是小图标。

WNDCLASSEX的结构如下:

typedef struct

{

        UINT cbSize;                                     //本结构大小

        UINT  style;                                      //窗口样式,

        WNDPROC lpfnWndProc;                 //回调函数

        int  cbClsExtra;                                 //类附加信息

        int cbWndExtra;                               //窗口附加信息 

        HANDLE      hInstance;                     //应用程序实例

        HICON         hICON;                            //主图标

        HCUSOR     hCursor;                       //窗口中的光标样式

        HBRUSH     hbrBackground;             //窗口的背景填充样式

        LPCTSTR    lpszMenuName;             //主菜单名

        LPCTSTR    lpszClassName;             //本类类名

        HICON         hIconSm;                       //小图标  

}WNDCLASSEX;

去除红色的两个属性就是WNDCLASS结构体的内容。

style 可选CS_HREDRAW:水平刷新     CS_VERDRAW:竖直刷新等等。

lpfnWndProc:指向事件句柄函数的指针,一般是回调函数,并且是自定义的。

cbClsExtra和cbWndExtra这两个参数一般不用,设置为0。

hInstance 用WinMain函数中的形参就可以

2:

注册该窗口

注册函数:RegisterClassEx(WNDCLASSEX *);

 

3:

创建定义的窗口CreateWindowEx

CreateWindowEx()函数原型
HWND CreateWindowEx

(
DWORD dwExStyle, //窗口的样式一般设为NULL
LPCTSTR lpClassName, //前面定义的窗口类名
LPCTSTR lpWindowName, //窗口标题名
DWORD dwStyle, //外观行为的通用标志
intx,inty, //窗口左上角在屏幕中的位置
int nWidth, int nHeith, //窗口的大小
HWND hWndParent,//父窗口的句柄,如果没设为NULL
HMENU hMenu, //菜单的句柄,如果没有设为NULL
HINSTANCE hInstance,//窗口实例,WinMain中的hinstance
LPVOID lpParam//高级特征
);

 

4:创建事件句柄

事件句柄就是当事件发生时Windows从主事件循环调用回调函数。

MyWinProc原型
LRESULT CALLBACK MyWinProc

(
HWND hwnd,//
UINT msg,//
WPARAM wparam,//
LPARAM lparam//
);

5:构建主事件循环

MSG msg;

while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}

 

通过上面五个步骤就可以创建一个空窗口了。

实例代码如下:

#include<windows.h>
#include<windowsx.h>

LRESULT CALLBACK MyWinProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
	{/*
		PAINTSTRUCT PS;
		HDC hdc;*/
		switch(msg)
		{
		case WM_CREATE:
			break;

		//case WM_PAINT:
		//	{
		//	hdc=BeginPaint(hwnd&ps);
		//	EndPaint(hwnd&ps);
		//	return 0;
		//	}
		//break;
		case WM_DESTROY:
			PostQuitMessage(0);
			break;
		default:
			break;
		}
		return ::DefWindowProc(hwnd,msg,wparam,lparam);

	}

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)

{
	//MessageBox(NULL,"THERE CAN BE ONLY ONE!!!","MY	FIRST WINDOWS PROGRAM.",MB_OK|MB_ICONEXCLAMATION);
	//MessageBeep(MB_OK);

	WNDCLASSEX wcex=
	{
		sizeof(WNDCLASSEX),CS_HREDRAW|CS_VREDRAW,
			    MyWinProc,
				0,
				0,
				hInstance,
				LoadIcon(NULL,IDI_APPLICATION),
				LoadCursor(NULL,IDC_ARROW),
				(HBRUSH)GetStockObject(GRAY_BRUSH),
				NULL,
				"MyWndClass",
				LoadIcon(NULL,IDI_APPLICATION)
	
	};

	RegisterClassEx(&wcex);

	HWND hwnd;
	hwnd=CreateWindowEx
	(
			NULL,
			"MyWndClass",
			"My First Window",
			WS_OVERLAPPEDWINDOW,
			50,
			10,
			800,
			600,
			NULL,
			NULL,
			hInstance,
			NULL

	);
	if(!hwnd)
		return 0;
	ShowWindow(hwnd,SW_SHOWNORMAL);
	UpdateWindow(hwnd);
	MSG msg;
	while(GetMessage(&msg,NULL,0,0))
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	return 0;
}

 

有疑问请留言,有错误请指正,谢谢。

 

 

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值