版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Windows操作系统消息机制1.3Windows相关
API就是应用程序编程接口。它是能用来操作组件、应用程序或者操作系统的一组函数。典型的情况下,API由一个或多个提供某种特殊功能的DLL组成每个Windows应用程序都直接或间接地使用了WindowsAPI随着Windows操作系统的发展,WindowsAPI的内容也在不断扩充之中
1.3Windows相关
MS-DOSIBM-PC有限的I/O函数1981OS硬件MS1.0~3.016bitHWAPI函数1983图形环境NT~XP16/32bitHWAPI函数1993图形环境Vista~732/64bitHWAPI函数20063D图形环境过程驱动消息驱动1.3Windows相关
NT~XP32bitHWAPI函数1993图形环境Vista~732/64bitHWAPI函数20063D图形环境MFC(MicrosoftFoundationClassLibrary)WPF(WindowsPresentationFoundation)WCF(WindowsCommunicationFoundation)WWF(WindowsWorkflowFoundation)1.3Windows相关
DOS与Windows驱动机制的区别DOS是过程驱动在等待用户输入过程中,所有输入设备(资源)都被“等待”过程抢占了。Windows是消息(事件)驱动2.Windows程序的特点
2.1.图文2.2.消息2.3.整合2.1图文1.不仅是黑底白字2.而是框架+菜单+按钮+滚动条称为窗口要素3.窗口类型Console文字类型Window菜单+用户区域DialogMessageBox4.实现途径-GDI(图形设备接口,GDI32.dll)2.2消息不再是循规蹈矩而是Messagebased,eventdriven窗口程序的主要任务是人机交互除非人主动结束任务,程序以while循环为主体框架人不断进行各种输入,计算机不断响应,形成“输入”-“响应”的程序结构2.2消息各种类型的“输入”,以消息格式存在GetMessage()取走一个消息对事件的响应,即事件驱动DispatchMessage()处理消息实现途径-User32.dll2.3整合MSWindows结构OS系统服务(KERNEL):内存管理、程序加载(包括DLL)、任务调度、文件管理用户接口(USER):窗口和消息管理,以及菜单、控制、对话框、定时器等图形设备接口(GDI,GraphicDeviceInterface):管理显示器,为USER与应用程序提供与硬件设备独立的接口对应的,API函数也分为三类:系统服务;管理和图形设备函数2.3整合.DLG.BMP.ICO.CUR.FON.RC.H.C.OBJ.LIBDLLImport.DEFRCcompilerTextEditorDialogEditorImageEditorFontEditorCCompilerLINKER.EXE.RES3.事件与消息系统3.1.事件和事件驱动3.2.消息系统3.3.一个具体的窗口程序3.1事件和事件驱动Windows程序为消息而“生”,因消息而“死”那么,消息从何而来?
Windows操作环境中,无论是系统产生的动作或用户运行应用程序产生的动作,称为事件(Events)产生的消息(Message)。
那么,事件又从何而来?通过输入设备,如键盘和鼠标通过屏幕上可视的对象,如菜单、工具栏按钮、滚动条和对话框上的控件来自Windows内部基于事件驱动的程序模型3.1事件和事件驱动Windows消息系统的组成消息队列消息循环窗口过程3.2消息系统消息的数据结构消息的数据结构MSG的定义如下:
typedefstructtagMSG{HWNDhwnd;//用以检索消息的窗口句柄
UINTmessage;//消息值
WPARAMwParam;//包含有关消息的附加信息
LPARAMlParam;//随不同的消息而有所不同
DWORDtime;//消息送到队列的时间
POINTpt;//消息发送时,屏幕光标的位置
}MSG;3.2消息系统
Windows常用消息
WM_LBUTTONDOWN:单击鼠标左键时产生的消息;
WM_LBUTTONUP:放开鼠标左键时产生的消息;
WM_RBUTTONDOWN:单击鼠标右键时产生的消息;
WM_RBUTTONUP:放开鼠标右键时产生的消息;
WM_LBUTTONDBLCLK:双击鼠标左键时产生的消息;
WM_RBUTTONDBLCLK:双击鼠标右键时产生的消息;
WM_CREATE:CreateWindows()函数产生的消息;
WM_CLOSE:关闭窗口时产生的消息;
WM_QUIT:退出应用程序时由PostQuitMessage()发出的消息;
WM_PAINT:Windows系统需要重绘时产生的消息。
…3.2消息系统3.2消息系统消息队列消息队列是系统定义的内存块,用于临时存储消息;或是把消息直接发给窗口过程在16位的系统中系统中只有一个消息队列32和64位的系统中每一运行的程序都会有一个消息队列8、16、32和64位表示一个时钟周期里,处理器可以处理的二进制代码数支持队列特征的消息驱动模型
3.2消息系统消息队列3.2消息系统什么是消息循环while(GetMessage(&Msg,
NULL,
0,
0)
>
0){
TranslateMessage(&Msg);
DispatchMessage(&Msg);}
3.2消息系统Windows消息处理示意图Windows系统应用程序队列A应用程序队列B系统队列事件输入WinMain函数消息循环窗口函数1窗口函数2WinMain函数消息循环窗口函数1窗口函数2应用程序A应用程序B消息循环WinMain(){
初始化;
while(GetMessage(&msg)){TranslateMessage();DispatchMessage();}}系统消息队列WndProc(msg){switch(msg){caseMSG1:caseMSG2:}}应用程序消息队列mousedriverkeyboarddriverSendMessage()USERModulemessagefromOtherwindowPostMessage()system3.3一个具体的窗口程序4.Win32程序的基本结构
4.1.Windows程序组成4.2.详解--入口,窗口,消息4.3.Windows数据类型4.4.Windows程序的“生生死死”WinMain()--程序入口点注册窗口RegisterClass()生成并显示窗口CreateWindow()ShowWindow()消息循环WndProc()--窗口函数(功能实现)区分消息switch根据消息触发相应处理调用DefWindowProc()
不处理的消息、和需要系统进一步处理的消息 如WM_CLOSE,使用者关闭了窗口。应用程序获得这个消息后,释放了自己的资源,然后让系统进一步执行关闭窗口的动作4.1.Windows程序组成
WinMain(){
初始化;
创建、显示、更新窗口;建立基于消息的事件驱动机制}WinMain(){
RegisterClass();
CreateWindow();ShowWindow();UpdateWindow();while(GetMessage(&msg)){TranslateMessage();DispatchMessage();}}WinMain()--程序入口点4.2.详解-入口4.2.详解-入口WinMain函数的原型如下:intWINAPIWinMain(HINSTANCEhInstance,//当前实例句柄HINSTANCEhPrevInstance,//以前的实例句柄LPSTRlpCmdLine, //指向命令行参数的指针intnCmdShow)//窗口的显示状态初始化包括定义窗口注册窗口创建窗口显示窗口需要注意的是,在显示窗口ShowWindow函数后,需调用UpdateWindow()函数更新并绘制用户区,并发出WM_PAINT消息。4.2.详解-窗口注册窗口RegisterClass(…)
在注册之前可以设置窗口属性,系统会给出一些缺省值,我们重点关心其中的lpfnWndProc参数WNDCLASSwc;wc.stvle=…;wc.lpfnWndProc=(WNDPROC)WndProc;提示系统收到消息后,调该函数处理消息wc.hIcon=…wc.Cursor=…wc.hbrBackground=…RegisterClass(&wc);4.2.详解-窗口CreateWindow()ShowWindow()UpdateWindow()4.2.详解-窗口HWNDCreateWindow(LPCTSTR lpClassName,//已注册的窗口类名
LPCTSTR lpWindowName,//窗口标题
DWORD dwStyle, //窗口风格
int x, //窗口的水平位置
int y, //窗口的垂直位置
int nWidth, //窗口宽度
int nHeight, //窗口高度
HWND hWndParent,//父窗口句柄
HMENU hMenu, //菜单句柄或控件标识
HINSTANCEhInstance,//应用程序实例句柄
LPVOID lpParam) //其他窗口创建时的参数数据消息本身是一个无符号整型变量类型有WM_COMMAND:系统命令类,菜单选择,按钮等WM_PAINT:对窗口作图WM_DESTORY:关闭窗口WM_USER:用户可自定义一些消息在某个特定类型之下,更有许多事件,一般通过wParam通知4.2.详解-消息while(GetMessage(&msg…)){TranslateMessage(&msg);//消息转换
DispatchMessage(&msg);}GetMessage具有阻塞机制当消息队列中没有消息时,程序非忙等,而是让权等待当收到WM_QUIT时,GetMessage返回false,循环停止,同时应用程序终止。DispatchMessage通过USER模块协助,将消息传递到WndProcWndProc的调用指示在注册窗口类时,已向系统指明
4.2.详解-消息采集WndProc(HWNDhWnd,UINTmessage,WPARAMwParam,LPARAMlParam)HWNDhWnd:窗口句柄,在与窗口有关的控制中使用UINTmessage:消息(类型)WPARAMwParam:传递的参数LPARAMlParam:传递的参数1-在基于消息的机制中,有时仅有消息是不够的2-产生消息的同时,传递什么样的参数要视具体的消息而定4.2.详解-消息处理消息处理函数是用于处理特定消息的一些代码,一般包括一个多分支switch语句结构。WndProc(hWnd,message,wParam,lParam){}switch(message){caseWM_COMMAND:id=LOWORD(wParam);Switch(id){caseIDM_OPEN:break;菜单中的open选项}……caseWM_PAINT:在视窗作图;break;default:DefWindowProc(…);4.2.详解-消息处理消息的处理4.2.详解-消息处理思考:怎样根据功能要求生成消息,并把这个消息传递给窗口函数?窗口程序的可能结构Windows系统显示产生消息在窗口中显示4.3.Windows数据类型Windows数据类型对应的基本数据类型(C语言)说明BOOLbool布尔值BSTRunsignedshort*32位字符指针BYTEunsignedchar8位无符号整数COLORREFunsignedlong用作颜色值的32位值DWORDunsignedlong32位无符号整数,段地址和相关的偏移地址LONGlong32位带符号整数LPARAMlong作为参数传递给窗口过程或回调函数的32位值LPCSTRconstchar*指向字符串常量的32位指针LPSTRchar*指向字符串的32位指针LPVOIDvoid*指向未定义类型的32位指针LRESULTlong来自窗口过程或回调函数的32位返回值UINTunsignedint32位无符号整数WORDunsignedshort16位无符号整数WPARAMunsignedint当作参数传递给窗口过程或回调函数的32位值Windows将使用的所有类型定义在Windows.h文件和其相关的文件中。一些常用的类型有句柄(HANDLE)、窗口句柄(HWND)、字符(BYTE)、短整数(WORD)、布尔型(BOOL)、字符串指针(LPSTR)以及常量字符串指针(LPCSTR)等。HANDLE是一个用作句柄的32位整数,句柄是代表某些资源的简单的数值,所有的句柄类型以H开头。
凡是数据类型的前缀是P或LP,则表示该类型是一个指针或长指针数据类型。若前缀是U,则表示无符号数据类型,等等。4.3.Windows数据类型程序初始化过程中调用CreateWindow,为程序创建了一个窗口,CreateWindow送出WM_CREATE直接给窗口函数,后者可以在此时做些初始化操作;在程序运行过程中,不断以GetMessage从消息队列中取得消息。如果这个消息是WM_QUIT,GetMessage会得到false的返回值而结束循环,进而结束整个程序;DispatchMessage通过系统USER模块的协助与监督,把消息分派至窗口函数,消息将被处理;程序不断循环;当使用者按下系统菜单中的Close命令时,系统送出WM_CLOSE,通常窗口程序不处理它,由DefWindowProc处理;DefWindowProc处理WM_CLOSE,调用DestoryWindow把窗口清除,送出WM_DESTORY;窗口程序对WM_DESTORY的处理是调用PostQuitMessage;PostQuitMessage送出WM_QUIT,于是WinMain的循环结束了,整个应用程序也结束了。4.4.Windows程序的“生生死死”CreateWindow()WM_CREATEGetMessage()DispatchMessage(WM_CREATE)WndProc(WM_CREATE)用户程序初始化启动4.4.Windows程序的“生”WinMain(){
初始化;
CreateWindow();while(GetMessage(&msg)){TranslateMessage();DispatchMessage();}}WndProc(msg){switch(msg){caseWM_CREATE:
用户程序初始化caseWM_DESTORY: PostQuitMessage()default:
DefWindowProc()}}使用者按下关闭按钮WM_CLOSEGetMessage()DispatchMessage(WM_CLOSE)WndProc(WM_CLOSE)DefWindowProc(WM_CLOSE)关闭WinMain(){
初始化;
CreateWindow();while(GetMessage(&msg)){TranslateMessage();DispatchMessage();}}WndProc(msg){switch(msg){caseWM_CREATE:
用户程序初始化caseWM_DESTORY: PostQuitMessage()default:
DefWindowProc()}}DestoryWindow()WM_DESTORYGetMessage()DispatchMessage(WM_DESTORY)WndProc(WM_DESTORY)PostQuitMessage()WM_QIUTGetMessage()返回为0,while结束WinMain结束,整个程序结束4.4.Windows程序的“死”下面介绍建立基于API的应用程序框架的步骤。(1)在File下拉菜单中选择New选项,以建立项目文件。(2)在弹出的New对话框中,选择Projects选项卡,并选择其中的Win32Application项,在ProjectName编辑框中填人所要创建的项目文件名Myapi,然后单击OK按钮。(3)此时弹出如后图所示的界面,选择其中的Anemptyproject选项,说明是创建一个空的项目文件。5.实验:利用API开发Win32程序实例Win32Application–Step1of1对话框5.利用API开发Win32程序实例NewProjectInformation对话框5.利用API开发Win32程序实例空的Win32应用程序框架界面
5.利用API开发Win32程序实例InsertFilesintoProject对话框
5.利用API开发Win32程序实例Windows窗口程序的运行结果
5.利用API开发Win32程序实例源程序代码如下:
#include<windows.h> //窗口函数说明
LRESULTCALLBACKWndProc(HWND,UINT,WPARAM,LPARAM); //初始化窗口类
//WinMain函数说明
intWINAPIWinMain(HINSTANCEhInstance,HINSTANCEhPrevInst,LPSTRlpszCmdLine,intnCmdShow){ HWNDhwnd; MSGMsg; WNDCLASSwndclass; charlpszClassName[]=“窗口”; //窗口类名
charlpszTitle[]="My_Windows";//窗口标题名
5.利用API开发Win32程序实例wndclass.style=0; //窗口类型为缺省类型wndclass.lpfnWndProc=WndProc; //窗口处理函数为WndProcwndclass.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=lpszClassName;//窗口类名为“窗口示例”
//窗口类注册
if(!RegisterClass(&wndclass)) //如果注册失败,则发出警告声音
{ MessageBeep(0); returnFALSE; }5.利用API开发Win32程序实例
//创建窗口
hwnd=CreateWindow(lpszClassName,//窗口类名
lpszTitle, //窗口实例的标题名
WS_OVERLAPPEDWINDOW,//窗口的风格
CW_USEDEFAULT, CW_USEDEFAUL
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025-2026学年爸爸的花落了教学设计反思
- 2026汉江实验室三亚研究中心(三亚深海科学与工程研究所)招聘20人备考题库含答案详解ab卷
- 中船动力集团2026届春季校园招聘备考题库附参考答案详解(考试直接用)
- 2026国有股份制商业银行招聘备考题库附参考答案详解【培优a卷】
- 2026中共湖南省委党校(湖南行政学院)招聘高层次人才17人备考题库含答案详解【a卷】
- 2026江铜集团江铜国贸第二批次社会招聘23人备考题库含完整答案详解(全优)
- 2026湖北恩施州来凤县绿水镇中心幼儿园带班教师1名备考题库附完整答案详解【历年真题】
- 2026江西赣州市全南县公用市政建设集团有限公司招聘1人备考题库及完整答案详解【名师系列】
- 2026吉林四平市双辽市公益性岗位招聘92人备考题库参考答案详解
- 2026江苏苏州太仓农商行招聘2人备考题库必考附答案详解
- 注塑部品质基础知识培训课件
- DBJT15-248-2022 建筑工程消防施工质量验收规范
- 浦东新区2024-2025学年七年级上学期期中考试数学试卷及答案(上海新教材沪教版)
- 英语基础语音知识课件
- 2025年高考地理复习突破集训:大题07工业(3大热点角度)解析版
- 实习护士第三方协议书
- 《云南教育强省建设规划纲要(2024-2035年)》解读培训
- 评审专家聘任协议书
- 民宿委托经营管理协议合同书
- 造林劳务合同协议
- 2024-2025学年鲁教版(五四学制)(2024)初中英语六年级下册(全册)知识点归纳
评论
0/150
提交评论