1,API与SDK
API应有程序接口
SDK软件开发包
2,句柄
在windows程序中,有各种各样的资源(窗口,图标,光标等),系统在创建这些资源时会为他们分配内存,并返回标识这些资源的标识号,即句柄。
句柄可以理解为指针的指针。
https://blog.csdn.net/perfectguyipeng/article/details/71189822
3,消息
typedef struct tagMSG {
HWND hwnd;//窗口句柄
UINT message;//消息类型
WPARAM wParam;//消息附加参数
LPARAM lParam;
DWORD time;//消息产生时间
POINT pt;//消息产生的坐标位置
} MSG, *PMSG, NEAR *NPMSG, FAR *LPMSG;
进队消息和不进队消息
进队消息是4中window消息处理机制的方式的消息。PostMessage发送进队消息。进队消息一般是人操作产生的消息,例如:敲击键盘
不进队消息是操作系统直接给窗口发送消息,直接进行窗口过程函数。SendMessage发送不进队消息。不进队消息一般自动产生的消息,例如调用CreateWindow产生的WM_CREATE。ShowWindow产生的WM_SIZE和WM_SHOWWINDOW。
https://blog.csdn.net/booming163/article/details/79437107
4,window消息处理机制
(1)操作系统接收到应用程序的窗口消息,将消息投递到消息队列(消息产生进入消息队列)
(2)从消息队列中取出消息,对消息进行预处理(放弃某个消息的响应或调用translateMessage产生新的消息)(消息转换或忽略)
(3)程序调用DispatchMessage,将消息传递给操作系统。
(4)系统给应用程序窗口发送消息,进行窗口过程函数。
5,WinMain函数
int WINAPI WinMain(
HINSTANCE hInstance,//当前应用程序的句柄
HINSTANCE hPrevInstance,//当前实例前一个实例的句柄
LPSTR lpCmdLine,//传递给应用程序的行参数
int nShowCmd//窗口的显示方式(最大,最小)
);
6,创建窗口
1,设计一个窗口
typedef struct tagWNDCLASS {
UINT style;
WNDPROC lpfnWndProc;//窗口过程函数指针
int cbClsExtra;
int cbWndExtra;
HINSTANCE hInstance;//当前应用程序句柄
HICON hIcon;//窗口图标句柄
HCURSOR hCursor;//光标句柄
HBRUSH hbrBackground;
LPCWSTR lpszMenuName;
LPCWSTR lpszClassName;
} WNDCLASS, *PWNDCLASSW, NEAR *NPWNDCLASSW, FAR *LPWNDCLASSW;
2,注册窗口类
ATOM RegisterClass(
const WNDCLASS *lpWndClass//设计的窗口结构体
);
3,创建窗口
HWND CreateWindowExA(
DWORD dwExStyle,
LPCSTR lpClassName,
LPCSTR lpWindowName,
DWORD dwStyle,
int X,
int Y,
int nWidth,
int nHeight,
HWND hWndParent,
HMENU hMenu,
HINSTANCE hInstance,
LPVOID lpParam
);
4,显示及更新窗口
BOOL ShowWindow(
HWND hWnd,
int nCmdShow//显示方式
);
BOOL UpdateWindow(
HWND hWnd
);
5,消息循环
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
7,创建窗口demo
#include<Windows.h>
#include<stdio.h>
//窗口过程函数(回调函数)
LRESULT CALLBACK winSunProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParaw)
{
switch (uMsg)
{
case WM_CHAR:
printf("nihao");
break;
case WM_PAINT:
HDC hdc;
PAINTSTRUCT ps;
hdc = BeginPaint(hWnd, &ps);
TextOut(hdc, 0, 0, "http", strlen("http"));
EndPaint(hWnd, &ps);
break;
default:
return DefWindowProc(hWnd, uMsg, wParam, lParaw);
}
return 0;
}
// 主函数
int WINAPI WinMain(HINSTANCE hInstance,//当前应用程序的句柄
HINSTANCE hPrevInstance,//当前实例前一个实例的句柄
LPSTR lpCmdLine,//传递给应用程序的行参数
int nShowCmd)//窗口的显示方式(最大,最小)
{
//设计窗口结构体
WNDCLASS wndClass;
wndClass.style = CS_VREDRAW;
wndClass.lpfnWndProc = winSunProc; //窗口回调函数指针
wndClass.cbClsExtra = 0;
wndClass.cbWndExtra = 0;
wndClass.hInstance = hInstance; //应用程序句柄
wndClass.hIcon = LoadIcon(NULL,IDI_ERROR);
wndClass.hCursor = LoadCursor(NULL,IDC_CROSS);
wndClass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
wndClass.lpszClassName = "123"; //窗口类名传递的创建窗口的类名
wndClass.lpszMenuName = "456";
//注册窗口
RegisterClass(&wndClass);
HWND hWnd;
//创建窗口
hWnd = CreateWindow("123","",WS_OVERLAPPEDWINDOW, 0, 0, 400, 400, NULL, NULL, hInstance, NULL);
//显示和更新窗口
ShowWindow(hWnd, SW_SHOWNORMAL);
UpdateWindow(hWnd);
//消息循环
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}