Windows程序内部运行机制及范例

上传人:woxinch****an2018 文档编号:39004457 上传时间:2018-05-10 格式:DOC 页数:8 大小:46.50KB
返回 下载 相关 举报
Windows程序内部运行机制及范例_第1页
第1页 / 共8页
Windows程序内部运行机制及范例_第2页
第2页 / 共8页
Windows程序内部运行机制及范例_第3页
第3页 / 共8页
Windows程序内部运行机制及范例_第4页
第4页 / 共8页
Windows程序内部运行机制及范例_第5页
第5页 / 共8页
点击查看更多>>
资源描述

《Windows程序内部运行机制及范例》由会员分享,可在线阅读,更多相关《Windows程序内部运行机制及范例(8页珍藏版)》请在金锄头文库上搜索。

1、Windows 程序内部运行机制程序内部运行机制1.1 API 与与 SDKVisual Studio 2005 这个是一个庞大的体系(包含很多的内容:Visual C+ 2005、Visual C# 2005 等) ,它是建立在.NET 技术的基础之上的。 API:Application Programming Interface,应用程序编程接口,实际上就是 微软给程序员提供的一系列的编程函数库,程序员利用这这些函数,可以方便 地编写自己的应用程序(主要是在 Windows 下的应用程序) ,这些函数都是面 向过程 OP 的(结构化的程序设计方法思想,与面向对象 OO 相区别) ,就像我

2、们普通的 C 程序一样,一步一步地运行。而面向对象的思想是完全的。 Win32 SDK:Software Development Kit,软件开发包,在这个包中,就将上 面的一系列的函数包装成了面向对象的(以类的形式)给程序员进行开发。 MSDN:微软的帮助文档。1.2 窗口与句柄窗口与句柄窗口(window)可以有一个父窗口,当然也可以没有。 句柄:Handle,实际上是一个 long 型的变量,当然在 VC 中,指针 pointer 也是 long 型,所以,Handle 也是指针。Windows 通过 Handle 来区别不同的对 象(主要是窗口中) ,并对他们进行管理。窗口的 Hand

3、le 就是窗口句柄,用 HWND 来标识。1.3 消息与消息队列消息与消息队列1、消息:Message。 Windows 与 DOS 的运行机制是完全不同的。 在 DOS 中,我们是以中断的方式来,用中断的最主要的缺点 1)中断是采 用程序轮询方式(就是程序进入一个死循环,不断地查询这个事件是否已经发 生) ,这样,不管事件是否已经发生,CPU 都在运行,大量地浪费了 CPU 时间。 2)中断是阻塞方式的,如果这个事件还没有发生,则程序就不会返回,会一直 地运行下去。这样就无法实现多道程序设计(多线程) 。 消息方式:现在的操作系统如 Windows、Linux、UNIX 等,都使用消息机 制

4、。消息机制是建立在消息(Message)基础之上的:用户如果使用消息机制进 行编程,如建立了一个按钮,这个按钮用户可以点击,但是,我们编程不需要 循环来检测这个按钮何时被用户点击,而是将这个交给了操作系统,操作系统 会感知这个按钮是否被点击,如果被点击,则操作系统会生成一个消息来告诉 我们的程序,这样我们的程序可以进行处理。 typedef struct messageHWND hwnd;/消息所属的窗口句柄UINT message;/消息的类型,如 0x0001 表示什么消息,在 Windows 中,以 WM_XXXX 来指明这是属于什么消息,方便程序员的记忆, 如 WM_LBUTTONDO

5、WN 等。WPARAM wParam;/消息的附加信息,如鼠标按下去的消息,LPARAM lParam;/DWORD time;/消息形成的时间POINT pt;/消息形成的坐标,主要对鼠标消息有用 MSG, *PMSG; UINT:无符号的 int 类型,unsigned int。 POINT,坐标类型 2、消息队列 在 Windows 系统中,经常会生成大量的消息,这些消息需要一个一个地投 送出去,因此,在投送之前,需要保存好,先将它们放在一个队列中,然后遍 历这个队列,将消息一个一个发送出去。 有可能会造成死锁,如果消息产生得太快,处理不过来,系统会进入一种 死机一样的模式。最经常出现这

6、种情况的就是定时器,如果我们将定时器的时 间设得太短(如 1 毫秒) ,而处理一个消息需要的时间又大于 1 毫秒,则消息就 处理不过来。 有一些消息,Windows 会智能化,处理不过来的不重要的消息,会直接丢 掉。 3、进队消息和不进队消息1.4 WinMain 函数函数1.4.11.4.1 WinMainWinMain 函数的定义函数的定义我们知道,在 C 程序中,都是以 main 函数开始运行的,但是在 Windows 32 位(像 XP、Windows 2000 都是 32 位的)系统中(Win 32) 。程序的入口就 是 WinMain 函数。 int WinMain( HINSTA

7、NCE hInstance,/实例句柄,就是当前这个应用程序的句柄HINSTANCE hPrevInstance,/在 Win32 下,这个参数总是 NULLLPSTR lpCmdLine,/命令行字符串int nCmdShow/窗口的显示方式(是显示还是隐藏) ); 这四个参数由操作系统自动设置好值,我们不要改变它们,但是我们可以 将他们保存起来,后面可能有用。 LPSTR:long point string,以空(NULL)结尾的字符串指针。 长指针:一个指针中不但包含了 offset 地址,还包含了 segment 地址。 短指针:在同一个段中,只包含 offset 地址。 lpCmdL

8、ine:命令行字符串指针,如我们输入: copy e:delpyaa.bmp e:ks 则该指针就指向了这一段文字,以空格或 tab 键隔开的,这样,我们在程序中,就可以找出用户的输入参数等。1.4.21.4.2 窗口的创建窗口的创建创建一个窗口一般需要四步: 1)设计一个窗口类 2)注册刚才设计的窗口类 3)创建窗口 4)显示及更新窗口 1、设计一个窗口类 在 Windows 中,将窗口类包装成一个结构体: typedef struct UINT style;/指定窗口的样式WNDPROC lpfnWndProc;/指向窗口过程函数的指针int cbClsExtra;/窗口类的大小,以字节为

9、单位,可以为 0,还可以是 sizeof(WNDCLASS);int cbWndExtra;/窗口的附加字节数,一般取为 0HINSTANCE hInstance;/窗口程序实例句柄,就是 WinMain 中 的 hInstanceHICON hIcon;/该程序显示的图标句柄HCURSOR hCursor;/该程序使用的光标类型句柄HBRUSH hbrBackground;/程序背景合作的刷子句柄,就是决定背景 颜色LPCTSTR lpszMenuName; /菜单名称LPCTSTR lpszClassName; /本窗口类的名称。 WNDCLASS, *PWNDCLASS; 窗口的样式:

10、可以用或|运算,将多个样式组合起来,如: WNDCLASS myWndClass; myWndClass.style=CS_HREDRAW | CS_VREDRAW; 窗口过程函数:也就是所谓的回调函数,就是用来处理该窗口消息的函数。 当该窗口发生某些事件时,操作系统会生成对应的消息,这些消息就发给这个 窗口过程函数,由它来进行处理。 如先声明这个函数 LRESULT CALLBACK MyWindowProc( HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam ); 其中的 LRESULT 实际上就是 long,CALLBACK 实际上就是_st

11、dcall。对 应的函数调用约定,还有一个叫_cdecl。他们的区别在于入栈与出栈的顺序。 对大家经常使用的 printf 就是用的_cdecl,而在 Win32 中,一般都用 _stdcall。这里的四个参数也是由操作系统传递给我们的。 myWndClass.lpfnWndProc=MyWindowProc; myWndClass. cbClsExtra=sizeof(myWndClass); myWndClass.hInstance=hInstance; HICON myIcon; myIcon=LoadIcon(NULL, IDI_HAND);/加载一个手型的图标 myWndClass.

12、HIcon=myIcon; HCURSOR myCursor; myCursor=LoadCursor(NULL,IDC_CROSS);/加载一个十字型光标 myWndClass.HCursor=myCursor; HBRUSH myBrush; myBrush=(HBRUSH)GetStockObject(LTGRAY_BRUSH); myWndClass.hbrBackground=myBrush; 菜单有两种方式:一种就是在这里给出,还可以在建立窗口后再给。在这 里,可以取为 NULL。 菜单资源又有两种不同的给出形式:一种是以字符串形式,一种是以 ID 号 的形式,则需要用 MAKEI

13、NTRESOURCE(ID 号)来将对应的 ID 号菜单转换为 字符串指针。 myWndClass. lpszClassName=“asc2011“; 2、注册窗口类 RegisterClass(窗口类的指针); RegisterClass( 3、创建窗口 HWND CreateWindow( LPCTSTR lpClassName,/窗口类名称,就是前面设置的名称,如 “asc2011“LPCTSTR lpWindowName,/指定窗口名称,将会显示在标题栏上DWORD dwStyle,/窗口的类型int x,/窗口的原始 X 坐标int y,int nWidth,/窗口的宽度int nH

14、eight,HWND hWndParent,/父窗口句柄,一般为 NULLHMENU hMenu,/菜单句柄,如果没有,取 NULLHINSTANCE hInstance,/应用程序的实例句柄LPVOID lpParam/窗口创建时传递给该窗口的附加参数,一 般取为 NULL,如果需要,可以作为特殊的用途。 ); #define WS_OVERLAPPEDWINDOW (WS_OVERLAPPED | WS_CAPTION | )LPVOID:void 指针类型,未定型指针,可以强制类型转换为任何你所要 的指针。HWND myWnd=CreateWindow();函数如果成功返回为指向窗口的句

15、柄,如果创建失败,就返回 NULL,因 此我们在程序中,应该检查是否创建成功。 if(myWnd=NULL)/创建失败 exit(1); 4、显示及更新窗口 1)显示窗口 ShowWindow(myWnd,SW_SHOW); 2)更新窗口 UpdateWindow(myWnd); 通知操作系统,我的窗口里面的内容已经发生了变化,请帮我重新画一遍。 实际上就是发送了一个 WM_PAINT 消息。1.4.31.4.3消息循环消息循环实际上就是一个死循环,就是不停地从消息队列中取出消息,然后将它翻 译一下,再将投送出去。 MSG myMessage; while( GetMessage( /翻译消息

16、 DispatchMessage(/投送消息 除了用 GetMessage 取得消息外,还可以用 PeekMessage 函数。1.4.41.4.4编写窗口过程函数编写窗口过程函数LRESULT CALLBACK MyWindowProc( HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam ) switch(uMsg) case WM_CHAR: /字符消息,当按键盘某个键时,能得到这个消息 break; case WM_LBUTTONDOWN: default: /其它不感兴趣的消息,返回给操作系统return DefWindowProc(hwnd, uMsg, wParam, lParam); return 0;/表明这些消息我已经正确处理好了,不要再往下面传 递。 ret

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 中学教育 > 其它中学文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号