windows SDK学习之C语言一个创建窗口

个人学习笔记 不做他用

Windows消息说明

Windows是一个事件驱动基于消息的操作系统(C语言编写程序属于过程驱动)并且事件之间是无序的,Windows强调的是事件触发,例如键盘点击一下会触发键盘事件,Windows会将操作转化为消息传给相应的程序。
消息队列为先进先出(FIFO)但WM_PAINT,WM_TIMER,WM_QUIT属于特例,操作系统会将其放置在消息队列最后,栈(FILO)。消息分为队列化消息和非队列化消息(由windows直接发出消息进行“插队操作”如救护车或者消防车的功能,在Windows中例如UpdateWindow会先绘制一个窗口)。

窗口创建步骤

1.设计窗口 WNDCLASS wc
2.注册窗口ReginsterClass
3.创建窗口CreatWindow
4.显示和更新ShowWindow UpdateWindow
5.通过循环取消息MSG msg
写循环 while(1)
GetMessage==false 退出系统
翻译分发消息

客户区与非客户区

   标题栏,滚动条,菜单,状态栏为非客户区,大部分的操作都是由系统管理的。
   客户区的所有内容由使用者管理。
   操作系统是通过响应时的位置指针来判断区域。
#include <windows.h>

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);//声明窗口过程函数
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdshow)//应用程序的入口程序
{
	static TCHAR szAppName[] = TEXT("my windows");//定义应用程序变量名
	HWND hwnd;//定义窗口句柄
	MSG msg;//定义消息结构体对象
	WNDCLASS wndclass;//定义要注册的窗口结构体
	注册窗口
	wndclass.style = CS_HREDRAW | CS_VREDRAW;//窗口风格
	wndclass.lpfnWndProc = WndProc;//窗口过程函数
	wndclass.cbClsExtra = 0;//该类窗口的附加内存
	wndclass.cbWndExtra = 0;
	wndclass.hInstance = hInstance;//窗口的应用程序实例句柄
	wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);//应用程序的图标
	wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);//应用程序光标
	wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);//应用程序背景刷
	wndclass.lpszMenuName = NULL;//应用程序菜单
	wndclass.lpszClassName = szAppName;//窗口类型名

	创建窗口//
	if (!RegisterClass(&wndclass))
	{
		MessageBox(NULL, TEXT("this program need windows NT!"), szAppName, MB_ICONERROR);
		return 0;
	}
	hwnd = CreateWindow(szAppName,//创建窗口,第一个参数为创建时的窗口类型名
		TEXT("我 爱 学 习"),//窗口标题
		WS_OVERLAPPEDWINDOW,//风格
		CW_USEDEFAULT,//初始位置x坐标
		CW_USEDEFAULT,//初始位置Y坐标
		CW_USEDEFAULT,//宽度
		CW_USEDEFAULT,//高度
		NULL,//父窗口句柄
		NULL,//窗口菜单句柄
		hInstance,//应用程序实例句柄
		NULL);//传递给窗口过程函数的lParam参数指针
	ShowWindow(hwnd, iCmdshow);//显示窗口
	UpdateWindow(hwnd);//更新窗口
	while (GetMessage(&msg, NULL, 0, 0))//消息循环
	{
		TranslateMessage(&msg);//消息转换
		DispatchMessage(&msg);//分散消息,带着消息找系统
	}
	return msg.wParam;
}
	LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
	{
	HDC hdc;//Device Context设备环境 设备上下文句柄 绘画都需要它完成
	PAINTSTRUCT ps;//调用BeginPaint获取设备句柄时需要参数传递
	RECT rect;//矩形结构体对象
	switch (message)//设置自己感兴趣的消息,如单击鼠标,按下键盘等
	{
	case WM_PAINT:
        	hdc = BeginPaint(hwnd, &ps);
			GetClientRect(hwnd, &rect);//获取客户区,rect定义矩形左上角右下角坐标
			DrawText(hdc, TEXT("helloworld"), -1, &rect, DT_SINGLELINE | DT_CENTER | DT_CENTER | DT_VCENTER);// 一行 显示居中 垂直居中
			EndPaint(hwnd, &ps);
			return 0;
			///鼠标左键点击响应示例
	case WM_LBUTTONDOWN:
		MessageBox(hwnd, TEXT("点击了左键"), TEXT("单击一次"), MB_OK);
	case WM_CLOSE:
		if (MessageBox(hwnd, TEXT("are you sure close me?"), TEXT("please insure"), MB_YESNO == IDYES))
			DestroyWindow(hwnd); 
			else
		return 0;
	case WM_DESTROY:
			PostQuitMessage(0);//关闭退出
		return 0;

		}
	return DefWindowProc(hwnd, message, wParam, lParam);//消息系统以默认方式处理消息
	};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值