Windows编程学习笔记 lesson2 窗口创建

窗口

    窗口是windows操作系统应用程序的重要元素,是系统和用户交互的接口。

    窗口中一般包括: 标题栏,菜单,最小化框,客户区

窗口句柄

   窗口被创建后会返回一个句柄来标识该窗口(窗口的id)

Windows程序消息机制

  windows程序是基于事件驱动的程序设计

  windows程序和操作系统的通信都是通过消息来完成,用户有某个动作,操作系统捕获了这个动作,构造一个消息(MSG结构体)加入应用程序中(应用程序的消息队列),应用程序不停地(死循环)从这个消息队列中拿出消息来处理

 消息队列:

  每个应用程序都有一个消息队列,

 程序中的事件都是以一个消息的形式存在被放在消息队列中,程序要通过循环不停地从消息队列中取消息进行相应响应操作

Windows 窗口创建

 设计窗口类、注册窗口类

创建窗口、显示窗口、更新窗口

消息循环

消息处理


消息循环:

  程序要一直运行,必定有死循环(只有当程序退出才结束)

  Windows程序中就是要实现消息循环让程序一直运行

#include <Windows.h>
#include <tchar.h>

//设计窗口类,注册窗口类
void RegisterWndClass();
//窗口过程函数,回调函数,处理消息的
LRESULT CALLBACK MyWndProcFunc(HWND, UINT, WPARAM, LPARAM);
HINSTANCE g_hInstance = NULL;

/*
 0000 0000 1字节
 #define MAX_BOX    0000 0001 定义窗口最大化属性
 #defein CLOSE_BOX  0000 0010
 style= MAX_BOX | CLOSE_BOX  ;0000 0011 有两个属性
 style = style & ~MAX_BOX ; 去掉属性
 回调函数: 系统自己调用
 */

int WINAPI _tWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPTSTR lpCmdLine, _In_ int nShowCmd)
{
	g_hInstance = hInstance;
	//1.设计窗口类,注册窗口类
	RegisterWndClass();
	//创建窗口
	HWND hWnd = CreateWindow(_T("MyWndClass"), _T("wnd"), WS_OVERLAPPEDWINDOW & ~WS_THICKFRAME, 700, 200, 800, 600, NULL, NULL, g_hInstance, NULL);
	if (hWnd == NULL)
	{
		int err = GetLastError();
		MessageBox(NULL, _T("窗口创建失败"), _T("错误"), MB_OK);
		return 0;
	}

	//显示更新窗口
	ShowWindow(hWnd, SW_SHOW);
	UpdateWindow(hWnd);
	//消息循环
	MSG msg = { 0 };
	while (GetMessage(&msg, NULL, 0, 0))//从消息队列中取消息,如果消息队列中没有消息,就一直在这里阻塞,如果获得了WM_QUIT消息,程序返回false
	{

		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}

	return 1;

}

void RegisterWndClass()
{
	//设计窗口类
	WNDCLASSEX wndClass;
	wndClass.cbClsExtra = 0;//指定紧跟在窗口类结构后的附加字节数,一般初始为0
	wndClass.cbSize = sizeof(WNDCLASSEX);//WNDCLASSEX 的大小。
	wndClass.cbWndExtra = 0; //指定紧跟在窗口实例的附加字节数。默认为0
	wndClass.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);//背景画刷的句柄。
	wndClass.hCursor = LoadCursor(NULL, IDC_ARROW);//光标的句柄。
	wndClass.hIcon = NULL;//图标的句柄。
	wndClass.hIconSm = NULL;//和窗口类关联的小图标。如果该值为NULL。则把hIcon中的图标转换成大小合适的小图标。

	wndClass.hInstance = g_hInstance;//本模块的实例句柄。
	wndClass.lpfnWndProc = MyWndProcFunc;//窗口处理函数的指针
	wndClass.lpszClassName = _T("MyWndClass");//指向类名称的指针
	wndClass.lpszMenuName = NULL;//指向菜单的指针
	wndClass.style = CS_HREDRAW | CS_VREDRAW; //从这个窗口类派生的窗口具有的风格
    
	//注册窗口类
	RegisterClassEx(&wndClass);
	 
}

LRESULT CALLBACK MyWndProcFunc(HWND hWnd, UINT msgType, WPARAM wParam, LPARAM lParam)
 
{
	switch (msgType)
	{
	case WM_CREATE:
		MessageBox(hWnd, L"创建窗口", L"提示", MB_OK);
		break;
	case WM_CLOSE:
		DestroyWindow(hWnd);
		break;
	case WM_DESTROY:
		PostMessage(hWnd, WM_QUIT, NULL, NULL);
		break;
	default:
		return DefWindowProc(hWnd, msgType, wParam, lParam);
		break;
	}
	return 0;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值