Windows API 编程讲义.doc
《Windows API 编程讲义.doc》由会员分享,可在线阅读,更多相关《Windows API 编程讲义.doc(134页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、目录第一章Windows API开发概述2第二章 GDI编程2第三章 文本输出与滚动条2第四章 鼠标、键盘及计时器2第五章 资源2第六章 Windows标准控件2第七章 调用DLL中的API2第八章 多任务与多线程2第一章 Windows API开发概述1. Dos 与 Windows 的主要区别系统相同点不同点联系Dos 系统1. 都是系统软件2. 都支持应用软件的操作字符界面Windows系统兼容Dos系统无鼠标单用户单任务不稳定,保密性差不支持多媒体Windows 系统图文界面有鼠标多用户多任务稳定性、保密性强支持多媒体 上表给出了两种系统的一些区别,究其主要区别还是在于Dos是基于过程
2、驱动的方式,而Windows是基于消息驱动的方式。2. 学习目的 采用Windows API直接对应用需求进行设计。尽管目前有着大量的快速开发工具可供选择,但如果不理解Windows Ring3层的基本工作原理,很难开发出好的软件,也很难在遇到特定问题时进行解决。因此,学习好本门课程对基于Windows 的软件设计来说,是十分必要的。3. 一个简单的Win32 API 应用程序:Hello World!3.1 应用程序示例#include LPCTSTR lpszAppName =TEXT(MyApp);LPCTSTR lpszTitle =TEXT(My Application); LRES
3、ULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);int APIENTRY WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) MSG msg; HWND hWnd; WNDCLASS wc; / 建立主要的应用程序窗口类 /. wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = (WNDPROC)WndProc; wc.cbClsExtra = 0; wc.cbWndE
4、xtra = 0; wc.hInstance = hInstance; wc.hIcon = LoadIcon( NULL, IDI_APPLICATION ); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); wc.lpszMenuName = lpszAppName; wc.lpszClassName = lpszAppName; if ( !RegisterClass( &wc ) )/注册窗口类 return( FALSE ); / 建立主要的应用程序窗口
5、/. hWnd = CreateWindow( lpszAppName, lpszTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL );/ 判断窗口是否建立成功 if ( !hWnd ) return( FALSE );/ 显示窗口 ShowWindow( hWnd, nCmdShow ); UpdateWindow( hWnd ); / 建立消息循环机制 while( GetMessage( &msg, NULL, 0, 0) ) TranslateMessa
6、ge( &msg ); DispatchMessage( &msg ); return( msg.wParam ); LRESULT CALLBACK WndProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) / 处理消息 switch( uMsg ) static int uRed = 0, uGreen = 0, uBlue = 0; / 绘制消息 case WM_PAINT : RECT rect; HDC hdc; PAINTSTRUCT ps; hdc = BeginPaint(hWnd, &ps); GetClien
7、tRect( hWnd, &rect); SetTextColor( hdc, RGB(uRed, uGreen, uBlue); DrawText (hdc, TEXT (Hello, World!), -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER) ; EndPaint(hWnd, &ps); break;/ 按键消息 case WM_KEYDOWN : uRed = rand() % 255; uGreen = rand() % 255; uBlue = rand() % 255; InvalidateRect(hWnd, NULL,
8、 TRUE); break;/ 窗口关闭消息 case WM_DESTROY : PostQuitMessage(0); break;/ 其它消息 default : return( DefWindowProc( hWnd, uMsg, wParam, lParam ) ); return( 0L );3.2 程序结构解析3.2.1 Windows 的入口函数WInMainWInMain函数与C中的main函数相似,其包含4个参数:HINSTANCE hInstance:实例句柄,唯一地标识了该程序。 HINSTANCE hPrevInstance:为了与早期版本兼容,已经不再使用。 LPTS
9、TR lpCmdLine:启动命令行参数。int nCmdShow:以何种方式运行(正常、最大化、最小化)。3.2.2 窗口类结构WNDCLASStypedef struct tagWNDCLASSA UINT style;/窗口类风格 WNDPROC lpfnWndProc;/指向窗口过程的指针 int cbClsExtra;/窗口类的扩展字节数 int cbWndExtra;/窗口实例的扩展字节数 HINSTANCE hInstance;/窗口实例句柄 HICON hIcon;/类图标的句柄 HCURSOR hCursor;/类鼠标指针的句柄 HBRUSH hbrBackground;/背
10、景画刷句柄 LPCSTR lpszMenuName;/窗口菜单名称 LPCSTR lpszClassName;/窗口类名 WNDCLASS3.2.3 矩形结构typedef struct tagRECT LONG left;/左上X坐标 LONG top;/左上Y坐标 LONG right;/右下X坐标 LONG bottom;/右下Y坐标 RECT3.2.4 过程参数Windows消息的wParam参数保存了与消息相关的信息,如产生消息的窗口句柄和ID号(以后都称为“标识符”);lParam参数则保存了一些与消息无关的信息,如消息产生时鼠标位置的坐标值等。3.3 消息处理与窗口过程3.3.1
11、 消息循环在调用了UpdateWindows之后,窗口就会出现在显示器上,此时Windows就为应用程序维护了一个“消息队列”。当Windows侦测到程序的用户键盘和鼠标输入数据时,就将输入的时间转化为一个“消息”,并将此消息放到程序的消息队列中。所有的应用程序都是通过“消息循环的代码”从消息队列中取出消息,代码如下:while( GetMessage( &msg, NULL, 0, 0) ) TranslateMessage( &msg ); DispatchMessage( &msg ); 从消息队列中取出消息的函数为GetMessage,函数定义如下:BOOL GetMessageA(L
12、PMSG lpMsg,HWND hWnd,UINT wMsgFilterMin,UINT wMsgFilterMax);lpMsg:消息结构指针。hWnd:窗口句柄, 当设置为NULL时是获取所有窗口的消息。wMsgFilterMin: 获取消息ID编号最小值。wMsgFilterMax:获取消息ID编号最大值。返回值:只要消息队列中取出的消息message域不为WM_QUIT(0x0012),GetMessage就返回一个非零值。 之后进行一些键盘消息的转换:TranslateMessage( &msg );最后发送给窗口过程进行消息的处理:DispatchMessage(&msg);3.3
13、.2 消息处理每个窗口都有与之相对应的窗口过程。窗口过程能够确定其窗口的外观和行为特性,这是通过对进入到窗口过程中的窗口消息的处理完成的。在第1章中,已经讲过了窗口过程的例子,虽然它只处理几个简单的消息,但确实实现了一个标准的窗口。窗口过程总是与已注册的特定窗口类相关联的,一个应用程序可以有几个窗口类,基于每个窗口类都可以创建多个窗口(通过CreateWindow等函数创建)。也就是说,同一个窗口过程可能要处理几个窗口中产生的消息。但是,在多窗口的应用程序中,Windows怎样辨别消息队列中的消息该发给哪个窗口的窗口过程处理呢?在WinMain函数中创建窗口如下所示:hWnd = Create
14、Window (LPCTSTR lpClassName , /注册窗口类名 /与窗口相关的其他参数 )从以上代码可以看到,在创建窗口时,至少要完成两项工作:一项将窗口类及其相关联的窗口过程与新窗口关联起来,另一项是得到新窗口的句柄。这样,当新窗口中产生消息时,Windows的消息循环可以根据这个句柄找到相应的消息处理过程(窗口过程)。下面介绍窗口过程的定义,读者就会更易明白Windows的这一处理过程。LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam )注意:窗口过程的hwnd参数指明
15、了产生消息的窗口,其他几个参数则表明了消息信息。这与MSG结构的前四个域是相同的。WndProc被声明为CALLBACK(回调函数),回调函数是输出函数中特殊的一种,能够在Windows环境下直接调用。一个应用程序至少有一个回调函数,因为在应用程序处理消息时,Windows会调用回调函数,即窗口过程。它对应于一个活动的窗口,回调函数必须向Windows注册,Windows实施相应的操作后就进行回调。窗口过程的名字可以任意指定,只需与窗口类结构的lpfnWndProc域指定的名字相同即可。窗口过程函数体负责接收和处理由消息循环发送来的消息。通常,通过switch和case结构确定窗口过程对发送来
16、的哪些消息进行处理,而不予处理的消息可以交给默认的窗口过程DefWindowProc来处理。switch(uMsg) case WM_PAINT:break; case WM_KEYDOWN: break; case WM_DESTROY: break; default: return(DefWindowProc(hWnd,uMsg,wParam,lParam);DefWindowProc 为窗口过程不予处理的消息提供默认的处理,由于在窗口过程中,有很多重要的工作需要Windows来完成,如果不能及时的将这些消息进行处理,则运行过程中会出现很多问题。3.4 几个重要的概念(1) 句柄Windo
17、ws中,句柄使用十分频繁,那么什么是句柄呢?句柄是一个32位的数,程序通过它来引用相应的对象(比如学号,房间号等)。(2) 标示符(标示符前缀)CS_HREDRAW,CS_VREDRAWDT_SINGLELINE,DT_VCENTERWM_KEYDOWN,WM_DESTORYCS:窗口类风格选项,DT:绘制文本选项,WM:窗口消息选项(3) 数据类型WPARAM在win16系统中位WORD(16位),LPARAM定义为LONG(32位)。WPARAM在win32系统中定义为UINT(32位),LPARAM定义为LONG(32位)。LRESULT是一个句柄LONG类型。3.5 采用C+进行封装设
18、计的必要性 上例给出了一个输出单行Hello World的示例程序。如果需求改为输出多行不同颜色的Hello Word,就要多次复制响应的代码。如果采用面向对象的设计,就可以很好的解决这一问题,也就是C+中的封装特性:class CTextpublic:CText()uRed = 0;uGreen = 0;uBlue = 0;CText();public:void SetRandColor(void)uRed = rand() % 255;uGreen = rand() % 255;uBlue = rand() % 255;void ShowText(HDC hdc,RECT &rect,ch
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Windows API 编程讲义 编程 讲义
限制150内