第一课(基础知识)

1,API

Windows操作系统提供的函数:应用程序编程接口(API)API函数;

2,SDK

SDK编程: 软件开发包
SDK包含:API函数库,帮助文档,使用手册,辅助工具等等;
SDK是一个资源的集合;

3,窗口

窗口包含:

标题栏,菜单栏,系统菜单,最小化框,最大化框,边框,滚动条;

窗口分为客户区和非客户区;

4,句柄

Windows开发中,句柄用来标识一种资源,一个对象;
分类:

窗口句柄,图标句柄,光标句柄,线程句柄;
相当于是一个ID,用来唯一的标记一个对象;

5,开发版本

Debug:调试版,开发期间使用,方便调试,体积大,包含了调试信息;
Release:发布版,体积小;

6,WIN32主函数

//WinMain:窗口应用程序(GUI应用程序)的入口函数,不能少,不能改名;
//main:控制台黑窗口应用程序(CUI应用程序)入口函数;
//函数调用约定:
//WINAPI:是__stdcall的宏定义;
//Windows API函数遵守__stdcall的调用约定,必须加上;
//C语言函数默认调用约定是 :__cdecl;
//1,定义了函数参数的入栈顺序;
//2,由调用函数还是被调用函数来弹出栈(清理栈);
//__cdecl和__stdcall的入栈方式都是从右到左;
//形式:
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPreInstance,LPSTR lpCmdLine, 
                   int nCmdShow)
{
    return 0;
}
第一个参数:
HINSTANCE:应用程序实例句柄类型(实质为结构体指针);
hInstance:当前应用程序实例句柄,(可以理解为:代表着当前这个应用程序,本质:程序的基地址;)
第二个参数:
hInstance:当前应用程序的前一个实例句柄,16位机器使用,32位及以上无法使用,
为NULL值;
第三个参数:
LPSTR:字符串类型
lpCmdLine:命令行参数,传递一个字符串过来;
第四个参数:
nCmdShow:窗口的显示方式;

7,MessageBox

功能:弹出一个消息提示框
例子:MessageBox(NULL, L"This is my first Window", L"First", MB_OK);
第一个参数:
HWND:窗口句柄类型(唯一的标记一个窗口,相当于窗口为ID;(本质为结构体指针)
这里表示的含义是父窗口句柄;
第二个参数:
LPCTSTR:const wchar*;//宽字符:一个字符占两个字节
char:窄字符,一个字符占一个字节;
L:告诉编译器字符串是采用宽字符串编码,Unicode编码;
第三个参数:
LPCTSTR;
消息框的标题;
第四个参数:
按钮与图标的组合;
MB:MessageBox的缩写;

8,窗口处理函数基本框架

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam,LPARAM lParam);
//说明:
LRESULT:LONG_PTR 即long;
CALLBACK:__stdcall;
第一个参数:
HWND:窗口句柄
第二个参数:
UINT:即unsigned int;
第三个参数:
附加信息;
WPARAM:unsigned int;
第四个参数:
附加信息;
LPARAM:long;
例子:
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam,LPARAM lParam)
{
	switch (uMsg)
	{
	case WM_CLOSE://窗口关闭消息
		//销毁窗口
		DestroyWindow(hwnd);//会马上调用WM_DESTROY
		//MessageBox(NULL, L"点了关闭", L"提示", MB_OK);
		break;
	case WM_DESTROY:	//窗口销毁消息
		PostQuitMessage(0);//发送一个WM_QUIT消息
		break;
	}
	//默认窗口处理函数
	return DefWindowProc(hwnd, uMsg, wParam, lParam);
}

9,创建一个窗口

例子:
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPreInstance, LPSTR
	lpCmdLine, int nCmdShow)
{
	//流程
	//1,设计窗口类
	wchar_t szAppClassName[] = L"MM";
	WNDCLASS wc;
	wc.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;//窗口类风格
	wc.lpfnWndProc = WindowProc;//窗口处理函数;
	wc.hbrBackground = CreateSolidBrush(RGB(88, 22, 66));
	wc.cbClsExtra = 0;//窗口类额外扩展空间大小
	wc.cbWndExtra = 0;//窗口额外扩展空间大小
	wc.hCursor = LoadCursor(NULL,MAKEINTRESOURCE(IDC_HAND));//光标句柄
	wc.hIcon = NULL;//图标句柄
	wc.hInstance = hInstance;//当前应用程序实例句柄
	wc.lpszClassName = szAppClassName;//窗口类型名
	wc.lpszMenuName = NULL;//菜单名
	//2,注册窗口类
	/*
	ATOM <=> WORD;//字
	WORD:unsigned short;

	DWORD :unsigned long;//双字
	*/
	if (FALSE == RegisterClass(&wc))
	{
		MessageBox(NULL, L"注册失败", L"提示", MB_OK);
		return 0;
	}
	//3,创建窗口
	wchar_t szWindowTitle[] = L"MyFirstWindow";
	HWND hWnd = CreateWindow(
		szAppClassName,//窗口类型名
		szWindowTitle,//窗口标题
		WS_CAPTION | WS_BORDER | WS_MINIMIZEBOX |//窗口风格
		WS_MAXIMIZEBOX | WS_SYSMENU,
		200,//窗口左上角横坐标
		100,//窗口左上角纵坐标
		640,//窗口宽度
		480,//窗口高度
		NULL,//父窗口句柄
		NULL,//菜单句柄
		hInstance,//当前应用程序实例句柄类型
		NULL//要传递的参数信息
		);
	//4,显示窗口
	ShowWindow(hWnd, SW_SHOW);
	//5,更新窗口
	UpdateWindow(hWnd);
	//6,消息循环
	//Windows消息机制
	MSG msg;
	while (GetMessage(&msg, NULL, 0, 0))
	{
		//将虚拟键消息转换为字符消息
		TranslateMessage(&msg);
		//将消息分发给窗口处理函数
		DispatchMessage(&msg);
	}
	return 0;
}