Windows编程二之Windows内部运行机制详解

 声明:本文主要根据IT学吧 小金鱼的Windows程序设计视频教程而写,原文有许多素材来之视频。


一、Windows内部运行机制详解

Windows操作系统负责管理所有的窗体,想要设计一个窗体,可以类比一个朋友想要开一个公司,设计一个窗体时,一个需要五步:

第一步:向操作系统注册此窗体类                                         类比:向有关部门注册公司

第二步:注册成功以后,开始创建窗口                                  类比:创建公司

第三步:显示更新窗口                                                          类比:公司开张

第四步:消息循环                                                                 类比:接受业务来往

第五步:处理消息                                                                 类比:处理业务


具体代码如下:

#include<Windows.h>
#include<tchar.h>
/*第一个参数:传入一个窗口句柄,由操作系统自动生成
 *第二个参数:传入上一个窗口的句柄,Win32程序现在一般不用,设置为null
 *第三个参数:长指针类型,传入一个程序运行的时候的命令行
 *第四个参数:窗口默认显示方式,比如全屏,最小化等
 */
extern LRESULT CALLBACK WindowProc(HWND hWDd,UINT uMsg,WPARAM wParam,LPARAM lparam );//声明过程函数,在注册窗口的时候,会使用到。
int WINAPI _tWinMain(HINSTANCE hInstance,
	HINSTANCE hPrevInstance,
	LPTSTR lpCmLine,
	int nShowCmd)
{
	
	const TCHAR pClassName[] = _T("WindowsDemo"); //这个窗体的名字,类似BUTTON,用来用来唯一标识该窗体

	WNDCLASSEX wcex; //申请一个窗口,设计窗口的样式

	//实例化窗口类对象  
	wcex.cbSize = sizeof(WNDCLASSEX);//对象的大小
	wcex.cbClsExtra = 0; //指定紧跟在窗口类结构后的附加字节数
	wcex.cbWndExtra = 0; //指定紧跟在窗口实例的附加字节数
	wcex.hbrBackground = (HBRUSH)::GetStockObject(WHITE_BRUSH);//指定窗口背景颜色
	wcex.hCursor = ::LoadCursor(NULL,IDC_ARROW);//指定光标的样式。比如输入样式:I,正常鼠标等,::两个冒号代表是调用的系统的API函数
	wcex.hIcon = ::LoadIcon(NULL,IDI_APPLICATION);//指定图标,也可以自己设计
	wcex.hIconSm = ::LoadIcon(NULL,IDI_APPLICATION);//指定小型图标
	wcex.hInstance = hInstance;//将操作系统生成的句柄传递给我们所绑定的窗口
	wcex.lpfnWndProc = WindowProc;//过程处理函数,回调函数,用来处理消息
	wcex.lpszClassName = pClassName;//窗口类名
	wcex.lpszMenuName = NULL;//菜单类名
	wcex.style = CS_HREDRAW | CS_VREDRAW;//窗口样式

	/*1.注册这个窗口类*/
	BOOL bRet = ::RegisterClassEx(&wcex);//窗口有可能会注册失败,因此会返回一个布尔值
	if (!bRet)
	{
		MessageBox(NULL,_T("提示"),_T("注册窗口失败!"),MB_OK);
		return FALSE;
	}

	/*2.创建窗口*/
	/*hWnd窗口句柄,和hInstance的区别:hInstance是整个应用程序的句柄,hWnd是这个应用程序的某个窗口的句柄,一个应用程序可能包含几个窗口*/
	HWND hWnd = ::CreateWindowEx(
		0, //窗口扩展风格[double类型]
		pClassName,//窗口类名称[CHAR指针类型]
		_T("Windows"),//窗口的标题[CHAR指针类型]
		WS_VISIBLE | WS_OVERLAPPEDWINDOW,//窗口的风格[INT]
		CW_USEDEFAULT,//窗口默认位子的X坐标(左上角)[INT]
		CW_USEDEFAULT,//窗口默认位子的Y坐标(左上角)[INT]
		CW_USEDEFAULT,//窗口默认大小宽度[INT]
		CW_USEDEFAULT,//窗口默认大小高度[INT]
		NULL,//父窗口的句柄
		NULL,//菜单的句柄或是子窗口的标识符
		hInstance,//当前的实例的句柄
		NULL//指向窗口的创建数据
		);

	//因为有可能会创建失败,创建失败后返的句柄的null。
	if (hWnd==NULL)
	{
		MessageBox(NULL, _T("提示"), _T("创建窗口失败!"), MB_OK);
		return FALSE;
	}
	 

	/*3.显示窗口*/
	::ShowWindow(hWnd,SW_SHOW);
	::UpdateWindow(hWnd);//刷新窗口

	/*4.消息循环*/
	MSG msg;
	while (GetMessage(&msg,NULL,0,0))
	{
		::TranslateMessage(&msg);
		::DispatchMessage(&msg);
	}
	return TRUE;
}

/*5.处理消息*/
LRESULT CALLBACK WindowProc(HWND hWnd,
	UINT uMsg,
	WPARAM wParam,
	LPARAM lParam
	)
{
	switch (uMsg)
		{
		//关闭的消息
	case WM_CLOSE:
		::DestroyWindow(hWnd);
		return 0;
		//销毁应用程序的消息
	case WM_DESTROY:
		::PostQuitMessage(0);
		return 0;
	default:
		break;
	}//否则返回默认的操作系统处理函数
	return ::DefWindowProc(hWnd,uMsg,wParam,lParam);
}

在以上代码中,为了字符集的兼容性,在预定义中,有

WinMain               _tWinMain

LPSTR                   LPTSTR

char                       TCHAR

普通字符串           _T()

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值