什么是WindowsAPI编程?代码调用)。WinMain是Windows程序的入口函数,与DOS程序的入口函数main功能相同。当WinMain函数结束或返回时,Windows应用程序结束。intWINAPIWinMain(HINSTANCEhInstance,//应用实例HINSTANCEhPrevInstance,//上一个应用实例LPSTRlpCmdLine,//命令行参数intnShowCmd//窗口显示样式);WINAPI:是一个宏,它代表__stdcall(注意有两个下划线),表示参数传递的顺序:从右向左压栈,函数返回前自动清栈。hInstance:表示程序当前运行的实例的句柄,是一个数值。程序在Windows下运行时,唯一标识运行实例(注意只有运行程序实例才有实例句柄)。一个应用程序可以运行多个实例,每运行一个实例,系统都会为该实例分配一个句柄值,并通过hInstance参数传递给WinMain函数。hPrevInstance:表示当前实例的前一个实例的句柄。在Win32环境下,该参数始终为NULL,即在Win32环境下,该参数不再起作用。lpCmdLine:是以null结尾的字符串,指定传递给应用程序的命令行参数,相当于C或C++中main函数中的参数char*argv[]。nShowCmd:表示窗口的显示,表示是最大化、最小化、正常大小还是隐藏。#include#include#pragmacomment(linker,"/subsystem:\"console\"/entry:\"WinMainCRTStartup\"")intWINAPIWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,PSTRlpCmdLine,intnCmdShow){printf("%p%p%p\n",hInstance,hPrevInstance,GetModuleHandleA(NULL));printf("%d%d\n",nCmdShow,SW_SHOWNORMAL);printf("%s\n",lpCmdLine);MessageBoxA(NULL,TEXT("第一个WindowsAPI程序"),TEXT("黑猫编程"),MB_OK);return0;}字符集#include#include#include#includeintmain(){constchar*str1="AbcChina";printf("%s%d\n",str1,strlen(str1));_wsetlocale(LC_ALL,L"chs");constwchar_t*str2=L"ABC汉字";wprintf(L"%s%d\n",str2,wcslen(str2));MessageBoxW(NULL,TEXT("你好猫"),L"编码",MB_OK);return0;}Windows编程模型一个完整的Win32程序(#include),这个程序的功能是创建一个窗口,并在这个窗口中响应键盘和鼠标消息,程序的实现步骤是:WinMain函数的定义为消息循环创建窗口并编写窗口过程函数项目创建窗口程序模板代码#include//自定义窗口过程回调函数LRESULTCALLBACKMyWindowProc(HWNDhwnd,UINTMsg,WPARAMwParam,LPARAMlParam){switch(Msg){caseWM_DESTROY:PostQuitMessage(0);返回0;}returnDefWindowProcA(hwnd,Msg,wParam,lParam);}intWINAPIWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,LPSTRlpCmdLine,intnShowCmd){//注册窗口类WNDCLASSwnd;wnd.cbClsExtra=0;wnd.cbWndExtra=0;wnd.hbrBackground=(HBRUSH)(GetStockObject(WHITE_BRUSH));wnd.hCursor=LoadIcon(NULL,IDC_ARROW);wnd.hIcon=LoadIcon(NULL,IDI_APPLICATION);wnd.lpfnWndProc=MyWindowProc;wnd.lpszClassName=TEXT("黑猫");wnd.lpszMenuName=NULL;wnd.style=CS_HREDRAW;wnd.hInstance=hInstance;注册类A(&wnd);//在从创建窗口返回之前发送VW_CREATEHWNDhwnd=CreateWindowA(TEXT("blackcat"),TEXT("BlackCatProgramming"),WS_OVERLAPPEDWINDOW,100,100,300,300,NULL,NULL,hInstance,NULL);//显示窗口ShowWindow(hwnd,nShowCmd);//更新窗口UpdateWindow(hwnd);//消息循环收到VM_QUIT并退出MSGmsg;while(GetMessageA(&msg,hwnd,0,0)){TranslateMessage(&msg);DispatchMessageA(&msg);}return0;}线程与窗口在WIN32中,消息队列与线程(Thread)相关,一个线程只能有一个消息队列(queue)与之对应。当一个线程第一次调用User32.dll或GDI32.dll中的函数时,系统会为该线程创建一个消息队列,否则不会有消息队列。一个线程可以生成多个窗口,所以每个窗口共享一个线程消息队列。生成到特定窗口的所有消息首先由创建该窗口的线程处理。窗口可以在任何线程中创建,但是消息循环必须与创建窗口在同一个线程中,否则窗口将无法从DispatchMessage()中获取任何消息。为了让窗口接受这些消息,线程必须有自己的循环。消息分类标准消息:所有以WM_开头的消息,WM_COMMAND除外命令消息:来自菜单栏、工具栏、按钮或快捷键的消息。WM_COMMAND通知消息:控件产生的消息,如按钮点击、列表项选择等,目的是通知其父窗口事件的发生。SendMessage和PostMessagePostThreadMessage