个人学习笔记 不做他用
Windows消息说明
Windows是一个事件驱动基于消息的操作系统(C语言编写程序属于过程驱动)并且事件之间是无序的,Windows强调的是事件触发,例如键盘点击一下会触发键盘事件,Windows会将操作转化为消息传给相应的程序。
消息队列为先进先出(FIFO)但WM_PAINT,WM_TIMER,WM_QUIT属于特例,操作系统会将其放置在消息队列最后,栈(FILO)。消息分为队列化消息和非队列化消息(由windows直接发出消息进行“插队操作”如救护车或者消防车的功能,在Windows中例如UpdateWindow会先绘制一个窗口)。
窗口创建步骤
1.设计窗口 WNDCLASS wc
2.注册窗口ReginsterClass
3.创建窗口CreatWindow
4.显示和更新ShowWindow UpdateWindow
5.通过循环取消息MSG msg
写循环 while(1)
GetMessage==false 退出系统
翻译分发消息
客户区与非客户区
标题栏,滚动条,菜单,状态栏为非客户区,大部分的操作都是由系统管理的。
客户区的所有内容由使用者管理。
操作系统是通过响应时的位置指针来判断区域。
#include <windows.h>
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);//声明窗口过程函数
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdshow)//应用程序的入口程序
{
static TCHAR szAppName[] = TEXT("my windows");//定义应用程序变量名
HWND hwnd;//定义窗口句柄
MSG msg;//定义消息结构体对象
WNDCLASS wndclass;//定义要注册的窗口结构体
注册窗口
wndclass.style = CS_HREDRAW | CS_VREDRAW;//窗口风格
wndclass.lpfnWndProc = WndProc;//窗口过程函数
wndclass.cbClsExtra = 0;//该类窗口的附加内存
wndclass.cbWndExtra = 0;
wndclass.hInstance = hInstance;//窗口的应用程序实例句柄
wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);//应用程序的图标
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);//应用程序光标
wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);//应用程序背景刷
wndclass.lpszMenuName = NULL;//应用程序菜单
wndclass.lpszClassName = szAppName;//窗口类型名
创建窗口//
if (!RegisterClass(&wndclass))
{
MessageBox(NULL, TEXT("this program need windows NT!"), szAppName, MB_ICONERROR);
return 0;
}
hwnd = CreateWindow(szAppName,//创建窗口,第一个参数为创建时的窗口类型名
TEXT("我 爱 学 习"),//窗口标题
WS_OVERLAPPEDWINDOW,//风格
CW_USEDEFAULT,//初始位置x坐标
CW_USEDEFAULT,//初始位置Y坐标
CW_USEDEFAULT,//宽度
CW_USEDEFAULT,//高度
NULL,//父窗口句柄
NULL,//窗口菜单句柄
hInstance,//应用程序实例句柄
NULL);//传递给窗口过程函数的lParam参数指针
ShowWindow(hwnd, iCmdshow);//显示窗口
UpdateWindow(hwnd);//更新窗口
while (GetMessage(&msg, NULL, 0, 0))//消息循环
{
TranslateMessage(&msg);//消息转换
DispatchMessage(&msg);//分散消息,带着消息找系统
}
return msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc;//Device Context设备环境 设备上下文句柄 绘画都需要它完成
PAINTSTRUCT ps;//调用BeginPaint获取设备句柄时需要参数传递
RECT rect;//矩形结构体对象
switch (message)//设置自己感兴趣的消息,如单击鼠标,按下键盘等
{
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
GetClientRect(hwnd, &rect);//获取客户区,rect定义矩形左上角右下角坐标
DrawText(hdc, TEXT("helloworld"), -1, &rect, DT_SINGLELINE | DT_CENTER | DT_CENTER | DT_VCENTER);// 一行 显示居中 垂直居中
EndPaint(hwnd, &ps);
return 0;
///鼠标左键点击响应示例
case WM_LBUTTONDOWN:
MessageBox(hwnd, TEXT("点击了左键"), TEXT("单击一次"), MB_OK);
case WM_CLOSE:
if (MessageBox(hwnd, TEXT("are you sure close me?"), TEXT("please insure"), MB_YESNO == IDYES))
DestroyWindow(hwnd);
else
return 0;
case WM_DESTROY:
PostQuitMessage(0);//关闭退出
return 0;
}
return DefWindowProc(hwnd, message, wParam, lParam);//消息系统以默认方式处理消息
};