windows基础编程----第二篇(创建属于自己的窗口)

这一篇我们来讲解一下如何创建一个简单的窗口。在创建窗口之前,我们需要知道它的创建过程具体怎么样,不然直接看代码也会一头雾水。

我就简单的说了:

1.定义一个窗口类(WNDCLASS);

2.注册这个窗口类(RegisterClass);

2.根据刚刚定义的窗口类来创建窗口(CreateWindow);

3.更新显示窗口(UpdateWindow、ShowWindow);

4.实现窗口的事件的驱动

以上是创建一个窗口的具体过程,现在我们直接来操作实践一下,创建一个win32项目(这里就不具体列出怎么创建了,如果不知道怎么创建的,看回《windows基础知识--------第一篇(项目的创建)》这一篇进行查看);

然后新建一个main.cpp,具体实现如下:

#include<windows.h>

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);	//过程处理函数的声明
int WINAPI WinMain
	(
	HINSTANCE hInstance,	//当前实例句柄
	HINSTANCE hPreInstance,	//以前实例句柄,一般为NULL
	LPSTR lpszCmdLine,		//命令行参数的指针
	int nCmdLine)			//当前应用程序窗口显示的状态
{
	static TCHAR szClassName[] = TEXT("windows");//窗口类的名字

	//WNDCLASS是一个结构体,所以定义窗口类就是设计这个窗口是一个怎么样的窗口进行赋值
	WNDCLASS wndclass;						
	wndclass.hbrBackground = NULL;						//窗口背景:无
	wndclass.hCursor = LoadCursor(NULL,IDC_ARROW);		//窗口光标:箭头
	wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);	//窗口图标:应用程序图标
	wndclass.hInstance = hInstance;						//窗口实例句柄:为主函数的第一个参数,当前实例句柄
	wndclass.lpfnWndProc = WndProc;						//窗口的处理函数:上面声明的WndProc
	wndclass.lpszClassName = szClassName;				//窗口类的名字:szClassName,这在创建窗口是需要用到,作为一个参数传入
	wndclass.lpszMenuName = NULL;						//窗口菜单:无
	wndclass.style = 0;									//窗口类型:无
	wndclass.cbClsExtra = NULL;							//窗口类内存:不使用
	wndclass.cbWndExtra = NULL;							//窗口内存:不使用

	//注册窗口类,如果失败,弹出失败对话框
	if (!RegisterClass(&wndclass))
	{
		MessageBox(NULL, TEXT("Wndclass fail!"), NULL, MB_OK);
		return 0;
	}

	//根据窗口类创建窗口
	HWND hwnd = CreateWindow(
		szClassName,			//窗口类名字
		TEXT("HelloWindows"),	//窗口标题
		WS_OVERLAPPEDWINDOW,	//窗口类型
		100,					//窗口位置:x=100
		100,					//窗口位置:y=100
		480,					//窗口宽度:width=960
		320,					//窗口高度:height=640
		NULL,					//父类窗口:无
		NULL,					//窗口菜单:无
		hInstance,				//应用程序实例句柄
		NULL);					//窗口创建时的数据:无	

	//如果窗口创建失败,弹出对话框
	if (!hwnd)
	{
		MessageBox(NULL, TEXT("hwnd fail!"), NULL, MB_OK);
		return 0;
	}

	//更新显示窗口
	UpdateWindow(hwnd);
	ShowWindow(hwnd, nCmdLine);

	//事件驱动的实现
	//具体流程就是:
	//在窗口中,对每次用户输入的进行获取,如果获取成功,就翻译这个消息,然后把这个消息分发给过程出来函数进行处理
	//我们通过while循环不断的对窗口所获取的消息进行处理,直到系统得到窗口摧毁这个消息,便会退出循环,结束程序
	MSG msg;
	BOOL isMessage;
	PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE);
	while(msg.message != WM_QUIT)
	{
		isMessage = PeekMessage(&msg, NULL, 0, 0, PM_REMOVE);
		if (isMessage)
		{
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}
	}

	return msg.wParam;
}
//过程处理函数的实现
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
	switch (msg)
	{
	case WM_DESTROY:			//关闭应用程序的命令消息			
		PostQuitMessage(0);
		return 0;
	}
	return DefWindowProcW(hwnd, msg, wParam, lParam);//其他的传给系统默认的窗口过程处理函数处理
}

好了,把上面的代码写一遍后,便可以运行,结果如下:


这就是整个创建窗口的过程。windows程序代码的编写都需要基于此。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值