消息:当我们点击鼠标的时候,或者当我们按下键盘的时候,操作系统都要把这些动作记录下来,存储到一个结构体中,这个结构体就是消息;
消息队列:每个线程只有一个消息队列;消息对列与线程相关的;消息队列就是一堆链表;
窗口与线程的关系:一个线程可以有多个窗口,一个窗口指对应一个线程;
简单的窗口程序示例:
/*-------------------------------
MyWindows.c
---------------------------------*/
#include<Windows.h>
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
int WINAPI WinMain(HINSTANCE hInstance, //入口函数,WINAPI即是__stdcall(函数调用约定的一种)
HINSTANCE hPrevInstance,
PSTR szCmdLine,
int iCmdShow)
{
static TCHAR szAppName[] = TEXT("MyWindows"); //定义窗口类的名字
HWND hwnd; //窗口句柄定义
MSG msg; //定义消息
WNDCLASS wndclass; //Windows类定义
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);//背景,先要得到画刷句柄传回
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);//光标
wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);//图标
wndclass.hInstance = hInstance;//模块句柄,如前面说的.exe .dll等地址
wndclass.lpfnWndProc = WndProc;//过程函数
wndclass.lpszClassName = szAppName; //类名
wndclass.lpszMenuName = NULL;//菜单
wndclass.style = CS_HREDRAW | CS_VREDRAW;//调整宽度和高度重新绘制窗口
if (!RegisterClass(&wndclass)){ //填完窗口类注册该窗口类
MessageBox(NULL, TEXT("此程序需要在Windows NT平台上运行!"), szAppName, MB_ICONERROR);
return 0;
}
hwnd = CreateWindow(szAppName, //创建窗口并设置其具体特征,返回窗口句柄,窗口类名
TEXT("Win模板"), //窗口标题
WS_OVERLAPPEDWINDOW, //类风格的扩展
CW_USEDEFAULT, //初始窗口坐标
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL, //有无父窗口
NULL, //有无菜单
hInstance,
NULL
);
ShowWindow(hwnd, iCmdShow); //显示窗口
UpdateWindow(hwnd); //更新窗口
while (GetMessage(&msg, NULL, 0, 0)){
TranslateMessage(&msg); //翻译消息
DispatchMessage(&msg); //派送消息到系统,系统再调用WinProc函数处理消息
}
return msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)//传入消息结构体的前四个参数
{
HDC hdc; //Handle of device context
PAINTSTRUCT ps; //绘画结构
RECT rect; //矩形结构
switch (message)
{
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps); //填充hdc结构
GetClientRect(hwnd, &rect); //获取客户区矩形信
DrawText(hdc, TEXT("这是一个简单的窗口!"), -1, &rect,
DT_CENTER | DT_VCENTER | DT_SINGLELINE);
EndPaint(hwnd, &ps);
return 0;
case WM_DESTROY: //点击右上角关闭发送WM_DESTROY消息
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd, message, wParam, lParam);
}