#windows消息机制
新建第一个Win32应用程序
VS2015 新建项目 Win32应用程序
// Win32WindowDemo.cpp : 定义应用程序的入口点。
//
#include "stdafx.h"
#include "Win32WindowDemo.h"
#define MAX_LOADSTRING 100
// 全局变量:
HINSTANCE hInst;
// 当前实例
WCHAR szTitle[MAX_LOADSTRING];
// 标题栏文本
WCHAR szWindowClass[MAX_LOADSTRING];
// 主窗口类名
// 此代码模块中包含的函数的前向声明:
ATOM
MyRegisterClass(HINSTANCE hInstance);
BOOL
InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM);
//程序入口点
//#define CALLBACK __stdcall VS默认用的是 __stdcall
//#define WINAPI
__stdcall VS默认用的是 __stdcall
//#define WINAPIV
__cdecl 其他版本用编译器用的是 __cdecl
//#define APIENTRY WINAPI
//栈 -》 传递参数
//栈帧 -》 平栈
//__stdcall 是函数调用预定的一种,函数调用约定主要约束了两件事。
//1.参数传递顺序
//2.调用堆栈由谁(调用函数或被调用函数)清理
常用的函数调用约定:stdcall cdecl fastcall thiscall naked call
int APIENTRY wWinMain(_In_ HINSTANCE hInstance, //int型 wWinMain tWinMain WinMain 不同的编码模式 ASCII UNCIODE _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lpCmdLine, _In_ int nCmdShow)//HINSTANCE hInstance 内核对象 实例对象 操作系统告诉我们
//HINSTANCE hPrevInstance 启动我的这个进程是谁 操作系统告诉我们
//lpCmdLine 接收参数运行成 用户告诉我们的
//nCmdShow 启动的方式 用户高速我们的 { UNREFERENCED_PARAMETER(hPrevInstance); UNREFERENCED_PARAMETER(lpCmdLine);
//两个宏定义
// TODO: 在此放置代码。 // 初始化全局字符串 LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); LoadStringW(hInstance, IDC_WIN32WINDOWDEMO, szWindowClass, MAX_LOADSTRING);
//LoadStringW 进行字符串的加载
//IDS 资源表里面定义的字符串 一个是程序的标题 一个是 窗口类名
// 国际化 多元化 的一种方式
MyRegisterClass(hInstance); //向系统注册窗口类
// 执行应用程序初始化:
if (!InitInstance (hInstance, nCmdShow))
{
return FALSE;
}
HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_WIN32WINDOWDEMO));
MSG msg;
// 主消息循环:
//获取消息
//&msg 结构体
typedef struct tagMSG{
HWND hwnd 窗口实例
UINT message; 窗口消息
WPARAM wParam 附加值
LPARAM lParam; 附加值
DWORD time; 消息时间
POINT ps; 鼠标位置
}
while (GetMessage(&msg, nullptr, 0, 0))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return (int) msg.wParam;
}
//
// 函数: MyRegisterClass()
//
// 目的: 注册窗口类。
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEXW wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style
= CS_HREDRAW | CS_VREDRAW; //窗口风格
wcex.lpfnWndProc = WndProc; //窗口类
wcex.cbClsExtra
= 0; //预留空间的附加值,,此程序没用到这个域!
wcex.cbWndExtra
= 0; //预留空间的附加值,此程序没用到这个域!
wcex.hInstance
= hInstance; //实例句柄,主函数的参数之一!
wcex.hIcon
= LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WIN32WINDOWDEMO)); //装载图标函数,在这可以装载自己的图标!
wcex.hCursor
= LoadCursor(nullptr, IDC_ARROW); //装载光标函数,在这可以装载自己的光标!
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); //初始化窗口的画刷
wcex.lpszMenuName = MAKEINTRESOURCEW(IDC_WIN32WINDOWDEMO); //窗口菜单
wcex.lpszClassName = szWindowClass; //程序名字!
wcex.hIconSm
= LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
return RegisterClassExW(&wcex);
//// 函数: InitInstance(HINSTANCE, int)//// 目的: 保存实例句柄并创建主窗口