Windows API for 2000XP实例精解 - search readpudncom.ppt
《Windows API for 2000XP实例精解 - search readpudncom.ppt》由会员分享,可在线阅读,更多相关《Windows API for 2000XP实例精解 - search readpudncom.ppt(154页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、2019/10/23,1,Windows 编程技术,2005年9月,2019/10/23,2,Windows API for 2000/XP实例精解,第一章 概述第二章 文本输出和滚动条第三章 深入GDI第四章 键盘、鼠标和计时器第五章 资源第六章 Windows 2000标准控件第七章 驱动器、目录和文件,2019/10/23,3,第一章 主要内容,Windows 家族简介Win32 API 基础Win32 API 应用程序框架结构Unicode字符,2019/10/23,4,第一章 3 Win32 API 应用程序框架结构,Demo: “Hello”当按下键盘上的任意一个键时,窗口显示的文
2、本颜色将随机地发生改变。应用程序实例,i,2019/10/23,5,第一章 3 Win32 API 应用程序框架结构(二),头文件的类型函数和数据结构消息结构窗口类结构矩形结构消息机制消息循环消息及消息处理句柄、标识符,i,i,i,i,i,i,i,i,i,2019/10/23,6,头文件的类型,在每一个用C编写的Windows程序中,都会用到一个头文件WINDOWS.H。它是包含了其它头文件的综合文件。WINDOWS.H只是一个包含其他头文件的头文件,他所包含的头文件有:WINDEF.H基本类型的定义。WINNT.H支持Unicode的类型定义。WINGDI.H图形设备接口的定义。WINUSE
3、R.H用户接口的定义。WINBASE.H内核函数的定义。WINSOCK.H和WINSOCK2.H用于网络通信的套接字的定义。,2019/10/23,7,函数和数据结构,在Windows应用程序中有一个入口函数WinMain,int APIENTRY WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPTSTR lpCmdLine, int nCmdShow),该句柄唯一地标识了该程序,为了与早期的版本兼容,这里未用,其值总是NULL,运行程序的命令行参数串,程序运行时的显示方式(正常、最大化、最小化等),2019/10/23,8,消息
4、结构,消息结构定义一个用于发送的消息,在程序接收到消息后,根据其中包含的信息做出相应的处理。,typedef struct tagMSG HWND hwnd;/获得消息的窗口句柄 UINT message;/消息标志 WPARAM wParam;/消息的附加信息 LPARAM lParam;/消息的附加信息 DWORD time;/消息的发送时间 POINT pt;/当消息发送时,鼠标所处的屏幕位置 MSG, *PMSG,2019/10/23,9,窗口类结构,窗口类用来标识处理窗口消息的窗口过程。在一个窗口类的基础上可以创建多个窗口的实例。,typedef struct tagWNDCLASS
5、W UINT style;/ 窗口类的风格 WNDPROC lpfnWndProc;/ 指向窗口过程的指针 int cbClsExtra;/ 分派给窗口类的扩展的字节数 int cbWndExtra;/ 分派给窗口实例的扩展的字节数 HINSTANCE hInstance;/ 窗口的实例句柄 HICON hIcon;/ 类图标的句柄 HCURSOR hCursor;/ 类鼠标指针的句柄 HBRUSH hbrBackground;/ 刷新背景所用的画刷的句柄 LPCWSTR lpszMenuName;/ 窗口类包含的菜单的名称 LPCWSTR lpszClassName;/ 窗口类名 WNDCL
6、ASSW, *PWNDCLASSW;,例如:,2019/10/23,10,窗口类结构实例,WNDCLASS wc; / Register the main application window class. /. wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = (WNDPROC)WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = LoadIcon( NULL, IDI_APPLICATION ); wc.hCursor =
7、 LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); wc.lpszMenuName = NULL; wc.lpszClassName = lpszAppName;,2019/10/23,11,注册窗口类,if ( !RegisterClass( ,2019/10/23,12,创建窗口函数,HWND CreateWindow( LPCTSTRlpClassName, LPCTSTRlpWindowName, DWORDdwStyle, intx, inty, intnWidth, intnHei
8、ght, HWNDhWndParent, HMENUhMenu, HINSTANCE hInstance, LPVOIDlpParam );,2019/10/23,13,消息机制,主要解决两个问题消息循环消息及消息处理,i,i,2019/10/23,14,消息循环,while( GetMessage( ,只要从消息队列中取出的消息的message域不为WM_QUIT,则返回非零,,进行一些键盘消息转换,把消息发送到窗口处理程序中,或者说,回调窗口处理程序,msg结构,2019/10/23,15,消息及消息处理,窗口过程接收的每一个消息都是用数值标示的,并在WINUSER.H中作了定义。 例如:
9、WM_PAINT, WM_KEYDOWN, WM_DESTROY一般用switch和case的结构来确定窗口过程接收到的是什么消息。,例如,2019/10/23,16,switch case结构,switch (message) case WM_CREATE:.return 0 ; case WM_SIZE:.return 0 ; case WM_PAINT :.return 0 ; case WM_DESTROY : PostQuitMessage (0) ; return 0 ; return DefWindowProc (hwnd, message, wParam, lParam) ;,
10、2019/10/23,17,WM_PAINT消息,(a) 在创建窗口时,客户区将变得无效。此时,整个客户区都是无效的。在程序运行函数UpdateWindow时,将发送第一个WM_PAINT的消息,只是窗口过程在客户区域画一些东西。(b) 改变应用程序窗口的大小时,窗口的整个客户区将变得无效。因为在定义窗口类的第一个域style时,曾经将标志设置为CS_HREDRAW和CS_VREDRAW,这一设置将指示Windows在窗口改变大小后,使整个窗口无效。此时,又将发送一个WM_PAINT的消息。(c) 在移动窗口并发生窗口重叠时,窗口客户区将变得无效。此时,Windows将不会保存本窗口中被另外一
11、个窗口覆盖部分的客户区内容。此时,窗口客户区将变成无效,发送一个WM_PAINT的消息。,2019/10/23,18,对WM_PAINT消息的处理,对消息WM_PAINT的处理,一般都从BeginPaint函数调用开始,其调用方法是: HDC hdc; PAINTSTRUCT ps; hdc = BeginPaint(hWnd, ,2019/10/23,19,WM_KEYDOWN消息,当系统侦测到用户键盘按键信息时,就会产生一个WM_KEYDOWN的消息,2019/10/23,20,WM_DESTROY消息,这个消息指示Windows根据用户输入的命令来清除窗口。该消息在用户单击“Close”
12、按钮或在程序的系统菜单(通过单击窗口图标或使用快捷键Alt+space获得)。通过调用函数PostQuitMessage以标准的方式响应WM_DESTROY消息以退出消息循环。,2019/10/23,21,WinMain ( hInst, hPrev, )MSG msg;ReigsterClass ();CreateWindow ();ShowWindow ();UpdateWindow ();While ( GetMessage (,WndProc ( hWnd, msg, wParam, lParam )switch ( msg ) case WM_CREATE : case WM_PAI
13、NT : case WM_KEYDOWN : case WM_DESTROY : PostQuitMessage(0); break; default : return( DefWindowProc ( . ) );return (0);,case WM_CLOSE : DestroyWindow (.);,2,1,3,5,6,7,8,消息队列,WM_CLOSE,WM_DESTROY,WM_QUIT,WM_CREATE,2019/10/23,22,1、初始化过程调用CreateWindow,为程序建立了一个窗口,送出WM_CREATE直接给窗口函数,后者可在此做些初始化操作2、程序运行过程中,
14、不断以GetMessage从消息队列中抓取消息,如果这个消息是WM_QUIT, GetMessage会传回0而结束循环,进而结束整个程序3、 DispatchMessage把消息分派至窗口函数。消息将在该处被识别并处理4、程序不断进行2和3的操作5、当使用者按下系统菜单的Close命令项时,系统送出WM_CLOSE。通常程序不拦截此消息,于是DefWindowProc处理它6、 DefWindowProc收到WM_CLOSE后,调用DestroyWindow把窗口清除。 DestroyWindow本身又会送出WM_DESTROY7、程序对WM_DESTROY的标准反应是调用PostQuitMe
15、ssage8、 PostQuitMessage没什么其它操作,就只送出WM_QUIT消息,准备让消息循环中的GetMessage取得,如步骤2,结束消息循环,2019/10/23,23,句柄,句柄是一个32位的数,代表一个对象。常用的句柄有:HANDLE:指向对象的句柄。HBITMAP:指向位图的句柄。HBRUSH:指向画刷的句柄。HCURSOR:指向鼠标光标的句柄。HDC:指向设备环境的句柄。HFILE:指向文件的句柄。HGLOBAL:指向全局内存块的句柄。HMETAFILE:指向元文件的句柄。HMODULE:指向模块的句柄。HMUNU:指向菜单的句柄。HPEN:指向画笔的句柄。HWND:指
16、向窗口的句柄。,2019/10/23,24,标识符,在Windows头文件中定义CS 窗口类风格选项CW 创建窗口选项WM 窗口消息选项MB 消息框选项IDI 图标的ID号IDC 光标的ID号,2019/10/23,25,数据类型,以C/C+的类型作为Windows程序的基本类型,为了区别某些基本类型相同,但意义不同的类型,因此在WINDOWS.H文件中用容易记忆的标示符进行重新定义,如HANDLE, HWND, UINT, BYTE, WORD, DWORD, LONG, BOOL, LPSTR等等。,i,2019/10/23,26,第一章 4 Unicode字符,Unicode字符是ASC
17、II字符编码的扩展。 在Unicode中,每个字符是16位的。 在C语言中,涉及到的字符都只占一个字节,即sizeof(char)为1。引入Unicode和宽字符的概念后,char数据类型没有改变。但用wchar_t来表示基于双字节的。即:typedef unsigned short wchar_t;,2019/10/23,27,第二章 主要内容,窗口过程与消息文本输出滚动条,2019/10/23,28,窗口过程与消息,窗口过程总是与已注册的特定窗口类相关联的,一个应用程序可以有几个窗口类,基于每个窗口类都可以创建多个窗口(通过CreateWindow等函数创建)。 WndProc被声明为CA
18、LLBACK回调函数,回调函数是输出函数中特殊的一种,能够在Windows环境下直接调用。一个应用程序至少有一个活动的窗口,因为在应用程序处理消息时,Windows会调用回调函数,即窗口过程。窗口过程的名字可以任意指定,只需与窗口类结构的lpfnWndProc域指定的名字相同即可。,2019/10/23,29,CreateWindow函数实例,hWnd = CreateWindow( lpszAppName, lpszTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NU
19、LL );,2019/10/23,30,窗口处理函数WndProc,LRESULT CALLBACK WndProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )switch( uMsg ) case WM_PAINT :break;case WM_DESTROY :PostQuitMessage(0);break; default :return( DefWindowProc( hWnd, uMsg, wParam,lParam ) ); return( 0L );,2019/10/23,31,lpfnWndProc域,WNDCL
20、ASS wc; / Register the main application window class. /. wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = (WNDPROC)WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = LoadIcon( NULL, IDI_APPLICATION ); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = (
21、HBRUSH)(COLOR_WINDOW + 1); wc.lpszMenuName = lpszAppName; wc.lpszClassName = lpszAppName;,2019/10/23,32,文本输出,文本输出是Win32应用程序最常见的客户区图形输出(文本输出也被看做是GDI图形输出),在字处理、排版等系统中应用广泛。文本输出程序示例获取设备描述表 WM_PAINT消息的响应和处理 字体的设置 文本的格式化输出 文本输出函数比较,2019/10/23,33,文本输出程序示例,Demo: TextOut1.dsw他利用GDI函数TextOut输出了两段文本,并采用了一些文本格式
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- windows api for xp 实例 search readpudncom
链接地址:https://www.taowenge.com/p-1704802.html
限制150内