windows编程模型

来源:互联网 发布:sql查询分析器 导入 编辑:程序博客网 时间:2024/05/22 04:49
Windows 程序设计是一种完全不同于传统的 DOS 方式的程序设计方法。它是一种事件驱动方式的程序设计模式,主要是基于消息的。


每一个 Windows 应用程序开始执行后, 系统都会为该程序创建一个消息队列, 这个消息队列用来存放该程序创建的窗口的消息。


例如,当用户在窗口中画图的时候,按下鼠标左键,此时,操作系统会感知到这一事件,于是将这个事件包装成一个消息,投递到应用程序的消息队列中,等待应用程序的处理。


然后应用程序通过一个消息循环不断地从消息队列中取出消息,并进行响应。 


在这个处理过程中,操作系统也会给应用程序“ 发送消息”。所谓“ 发送消息”,实际上是操作系统调用程序中一个专门负责处理消息的函数,这个函数称为窗口过程。



#include <windows.h>//win32程序创建一共需要以下几个步骤// 设计窗口//注册窗口//创建窗口//显示和更新//通过循环取消息//处理消息(窗口过程)//6处理窗口过程//CALLBACK  代表__stdcall 参数的传递顺序:从右到左 以此入栈,并且在函数返回前 清空堆栈LRESULT CALLBACK WindowProc(HWND hwnd, //消息所属的窗口句柄UINT uMsg, //具体消息名称  WM_XXXX 消息名WPARAM wParam, //键盘附加消息LPARAM lParam  //鼠标附加消息){switch (uMsg){case WM_CLOSE://所有xxxWindow为结尾的方法 ,都不会进入到消息队列中,而是直接执行DestroyWindow(hwnd); //DestroyWindow 发送另一个消息 WM_DESTROYbreak;case  WM_DESTROY:PostQuitMessage(0);break;case WM_LBUTTONDOWN: //鼠标左键按下{int xPos = LOWORD(lParam);int yPos = HIWORD(lParam);char buf[1024];wsprintf(buf, TEXT("x = %d,y = %d"), xPos, yPos);MessageBox(hwnd, buf, TEXT("鼠标左键按下"), MB_OK);break;}case WM_KEYDOWN: //键盘MessageBox(hwnd, TEXT("键盘按下"), TEXT("键盘按下"), MB_OK);break;case WM_PAINT: //绘图{PAINTSTRUCT ps; //绘图结构体HDC hdc = BeginPaint(hwnd, &ps);TextOut(hdc, 100, 100, TEXT("HELLO"), strlen("HELLO"));EndPaint(hwnd, &ps);}break;}//返回值用默认处理方式return DefWindowProc(hwnd, uMsg, wParam, lParam);}//程序入口函数int WinMain(_In_ HINSTANCE hInstance,//应用程序实例句柄_In_opt_ HINSTANCE hPrevInstance, //上一个应用程序句柄,在win32下为NULL_In_ LPSTR lpCmdLine, //参数数组_In_ int nShowCmd) //显示命令,最大化 最小化 正常{//1 设计窗口WNDCLASS wc;wc.cbClsExtra = 0;//类的额外的内存wc.cbWndExtra = 0;//窗口的额外内存wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);//设置背景wc.hCursor = LoadCursor(NULL, IDC_HAND);//设置光标,如果第一个参数为null,代表使用系统提供的光标wc.hIcon = LoadIcon(NULL,IDI_ERROR);//图标第一个参数为NULL代表使用系统提供的光标wc.hInstance = hInstance;//应用程序实例句柄wc.lpfnWndProc = WindowProc;//回调函数,窗口过程wc.lpszClassName = TEXT("WIN");//指定窗口类名称wc.lpszMenuName = NULL;//菜单名称wc.style = 0;//显示风格,0代表默认风格//2注册窗口RegisterClass(&wc);/*lpClassName, 类名lpWindowName,标题名dwStyle,风格WS_OVERLAPPEDWINDOWx,显示坐标y,nWidth,宽nHeight,高hWndParent,父窗口句柄hMenu, 菜单句柄hInstance,实例句柄lpParam 附加值*///3创建窗口HWND hwnd = CreateWindow(wc.lpszClassName, TEXT("windows"),WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,CW_USEDEFAULT, CW_USEDEFAULT,CW_USEDEFAULT, NULL, NULL, hInstance, NULL);//显示更新ShowWindow(hwnd, SW_SHOWNORMAL);UpdateWindow(hwnd);//通过循环取消息MSG msg;/*_Out_ LPMSG lpMsg,消息_In_opt_ HWND hWnd,捕获的窗口,填null代表捕获所有窗口_In_ UINT wMsgFilterMin,最小或最大过滤的消息,一般填0_In_ UINT wMsgFilterMax*/while (GetMessage(&msg, NULL, 0, 0)){//翻译消息TranslateMessage(&msg);//分发消息DispatchMessage(&msg);}return 0;}


原创粉丝点击