课件03 利用Win32 API进行Windows程序设计.pdf
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《课件03 利用Win32 API进行Windows程序设计.pdf》由会员分享,可在线阅读,更多相关《课件03 利用Win32 API进行Windows程序设计.pdf(16页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、Windows 程序设计 Windows 程序设计 版权所有(C),户现锋,2006 年 课件 03 利用 Win32 API 进行 Windows 程序设计 本节目标本节目标:熟悉窗口的基本概念,树立事件驱动编程的概念,掌握 Win32 窗口程序的基本结构以及 GetMessage 的工作原理 Windows 程序特点 Windows 程序特点 Windows 是一个具有图形用户界面的多任务的操作系统。Windows 应用程序具有以下的特点:?用户界面统一:Windows 应用程序具有相同或者相似的外观,包括窗口、菜单、工具条、状态条等标准元素,就是基于窗口的用户界面。?独立于设备的图形操作
2、:Windows 应用程序使用 GDI 进行图形的绘制。GDI 对图形图像设备进行了高度的抽象,应用程序只是利用虚拟的设备句柄,利用 GDI 提供丰富的图形操作函数进行操作,支持各种输出设备,做到了所见即所得。?事件驱动的程序设计:Windows 使用的是一个事件驱动的编程模式,这种编程方式依靠外部事件来刺激应用程序的反应。对于 Windows 应用程序而言,鼠标点击和按键是最常见的两种外部刺激。Windows 将事件转化成消息的方式来将事件通知给应用程序。有些消息非常普通,比如那些通知应用程序用户已经单击了某个应用程序菜单项的消息,另外一些消息(比如鼠标在窗口内移动)通常只有特殊的应用程序才
3、感兴趣。每个消息都与一个特定的应用程序窗口联系在一起,并且每个窗口都有一个与其联系的“窗口过程”。Windows 为每一个需要进行消息处理的线程维护一个消息队列,该消息队列为该线程创建的所有窗口服务。Windows 把从键盘、鼠标、定时器等输入设备以及其它地方接收到的消息放入应用程序的消息队列中,Windows应用程序通过GetMessage()API函数来接收消息,并通过DispatchMessage()函数来调用 Windows。然后 Windows 自己将调用合适的窗口过程,并将要处理的消息传送给它。?程序与资源分离:在 Windows 应用程序中,向菜单、对话框、位图、光标、图标等可视
4、的对象都被从代码中分离出来,这些资源都放在资源文件中,资源编译器编译这些资源并将它们存储在应用程序中,这样大大地简化了用户界面的设计。另外,Windows 使用一个称之为句柄的标识符来引用其环境中的每一个对象,比如窗口、内存块、文件、光标、位图等等。句柄是非常方便的数字标识符,用于标识系统已经分配给 Windows 应用程序的资源。?支持多任务:Windows 是一个支持多进程、多线程的操作系统。每个应用程序可以创建一个主窗口,在屏幕上占据一块区域,窗口可以重叠,因此多个应用程序可以共享屏幕。用户可以在不同的应用程序之间进行切换,并且可以在不同的应用程序之间进行手工和自动的数据交换和通信。?进
5、程间通信方式丰富:Windows 提供了丰富的方式来完成进程间的通信、比如采用剪贴板、OLE、COM/DCOM、内存映射文件以及网络编程的方式等等。利用 AppWizard 生成一个 Win32 窗口程序 利用 AppWizard 生成一个 Win32 窗口程序 步骤如下:(1)在 File 菜单中,单击 New,在出现的菜单中选择 Projects 标签,后出现下图:(2)在 Location 一栏指定项目的存放路径,在项目名称栏输入 MyWinApp,按 OK 出现如下的对话框,让向导帮助我们创建一个典型的应用程序,完成即可。(3)下面向导主要生成的文件:代码文件:MyWinApp.h、M
6、yWinApp.cpp 资源文件:resource.h(资源的符号定义)、MyWinApp.rc(资源定义文件)预编译文件:StdAfx.h、StdAfx.cpp (4)编译、链接后允许结果如下:(5)下面是向导生成的源代码:/MyWinApp.cpp:Defines the entry point for the application./#include stdafx.h#include resource.h#define MAX_LOADSTRING 100 /Global Variables:HINSTANCE hInst;/current instance TCHAR szTitle
7、MAX_LOADSTRING;/The title bar text TCHAR szWindowClassMAX_LOADSTRING;/The title bar text /Foward declarations of functions included in this code module:ATOM MyRegisterClass(HINSTANCE hInstance);BOOL InitInstance(HINSTANCE,int);LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);LRESULT CALLBACK About(
8、HWND,UINT,WPARAM,LPARAM);int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)/TODO:Place code here.MSG msg;HACCEL hAccelTable;/Initialize global strings LoadString(hInstance,IDS_APP_TITLE,szTitle,MAX_LOADSTRING);LoadString(hInstance,IDC_MYWINAPP,szWindowClas
9、s,MAX_LOADSTRING);MyRegisterClass(hInstance);/Perform application initialization:if(!InitInstance(hInstance,nCmdShow)return FALSE;hAccelTable=LoadAccelerators(hInstance,(LPCTSTR)IDC_MYWINAPP);/Main message loop:while(GetMessage(&msg,NULL,0,0)if(!TranslateAccelerator(msg.hwnd,hAccelTable,&msg)Transla
10、teMessage(&msg);DispatchMessage(&msg);return msg.wParam;/FUNCTION:MyRegisterClass()/PURPOSE:Registers the window class./COMMENTS:/This function and its usage is only necessary if you want this code/to be compatible with Win32 systems prior to the RegisterClassEx/function that was added to Windows 95
11、.It is important to call this function/so that the application will get well formed small icons associated/with it./ATOM MyRegisterClass(HINSTANCE hInstance)WNDCLASSEX wcex;wcex.cbSize=sizeof(WNDCLASSEX);wcex.style =CS_HREDRAW|CS_VREDRAW;wcex.lpfnWndProc=(WNDPROC)WndProc;wcex.cbClsExtra =0;wcex.cbWn
12、dExtra =0;wcex.hInstance =hInstance;wcex.hIcon =LoadIcon(hInstance,(LPCTSTR)IDI_MYWINAPP);wcex.hCursor =LoadCursor(NULL,IDC_ARROW);wcex.hbrBackground=(HBRUSH)(COLOR_WINDOW+1);wcex.lpszMenuName=(LPCSTR)IDC_MYWINAPP;wcex.lpszClassName=szWindowClass;wcex.hIconSm =LoadIcon(wcex.hInstance,(LPCTSTR)IDI_SM
13、ALL);return RegisterClassEx(&wcex);/FUNCTION:InitInstance(HANDLE,int)/PURPOSE:Saves instance handle and creates main window/COMMENTS:/In this function,we save the instance handle in a global variable and/create and display the main program window./BOOL InitInstance(HINSTANCE hInstance,int nCmdShow)H
14、WND hWnd;hInst=hInstance;/Store instance handle in our global variable hWnd=CreateWindow(szWindowClass,szTitle,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,0,CW_USEDEFAULT,0,NULL,NULL,hInstance,NULL);if(!hWnd)return FALSE;ShowWindow(hWnd,nCmdShow);UpdateWindow(hWnd);return TRUE;/FUNCTION:WndProc(HWND,unsigned,
15、WORD,LONG)/PURPOSE:Processes messages for the main window./WM_COMMAND-process the application menu/WM_PAINT-Paint the main window/WM_DESTROY-post a quit message and return/LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)int wmId,wmEvent;PAINTSTRUCT ps;HDC hdc;TCHAR szHell
16、oMAX_LOADSTRING;LoadString(hInst,IDS_HELLO,szHello,MAX_LOADSTRING);switch(message)case WM_COMMAND:wmId =LOWORD(wParam);wmEvent=HIWORD(wParam);/Parse the menu selections:switch(wmId)case IDM_ABOUT:DialogBox(hInst,(LPCTSTR)IDD_ABOUTBOX,hWnd,(DLGPROC)About);break;case IDM_EXIT:DestroyWindow(hWnd);break
17、;default:return DefWindowProc(hWnd,message,wParam,lParam);break;case WM_PAINT:hdc=BeginPaint(hWnd,&ps);/TODO:Add any drawing code here.RECT rt;GetClientRect(hWnd,&rt);DrawText(hdc,szHello,strlen(szHello),&rt,DT_CENTER);EndPaint(hWnd,&ps);break;case WM_DESTROY:PostQuitMessage(0);break;default:return
18、DefWindowProc(hWnd,message,wParam,lParam);return 0;/Mesage handler for about box.LRESULT CALLBACK About(HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam)switch(message)case WM_INITDIALOG:return TRUE;case WM_COMMAND:if(LOWORD(wParam)=IDOK|LOWORD(wParam)=IDCANCEL)EndDialog(hDlg,LOWORD(wParam);return
19、 TRUE;break;return FALSE;Win32 程序结构分析 Win32 程序结构分析 创建 Windows 应用程序的方法有多种,最为常用的方法是使用 Windows API 或者 MFC。通过 Win32 API 创建应用程序有两个基本的部分:?应用程序的主函数 WinMain?窗口过程 WinMain 函数是应用程序的入口点,主要完成以下的任务:定义窗口类、注册窗口类、创建窗口、显示并更新窗口、启动消息循环进行消息的处理,当收到 WM_QUIT 消息时,GetMessage 返回 FALSE,程序退出而结束。窗口函数用来处理窗口的消息,完成具体的任务。(1)定义并注册窗口类
20、(1)定义并注册窗口类 在 Windows 中,一般在创建窗口之前需要首先定义窗口类并且进行注册。窗口类结构如下:typedef struct UINT cbSize;UINT style;WNDPROC lpfnWndProc;int cbClsExtra;int cbWndExtra;HINSTANCE hInstance;HICON hIcon;HCURSOR hCursor;HBRUSH hbrBackground;LPCTSTR lpszMenuName;LPCTSTR lpszClassName;HICON hIconSm;WNDCLASSEX;?style:指定窗口类的风格,比如
21、在改变窗口大小时是否进行窗口重绘。常用的风格如下:?#define CS_VREDRAW 0 x0001?#define CS_HREDRAW 0 x0002?#define CS_DBLCLKS 0 x0008?#define CS_GLOBALCLASS 0 x4000?lpfnWndProc:处理窗口消息的回调函数,注意这个函数有 Windows 调用。?cbClsExtra:是为指定的窗口类结构额外分配的字节数目,一般为 0。?cbWndExtra:为窗口结构额外分配的字节数目,一般为 0。?hInstance:创建窗口对象的模块句柄?hIcon:窗口的大图标,在切换窗口的时候等情况下
22、使用?hCursor:窗口中所使用的光标的句柄。?hbrBackground:用来画窗口背景的刷子的句柄。?lpszMenuName:窗口中菜单资源的字符串。?lpszClassName:标志该窗口类名称的字符串。?hIconSm:小图标,窗口左上角的图标 在上面的例子中,完成窗口类创建与注册的函数是 MyRegisterClass:ATOM MyRegisterClass(HINSTANCE hInstance)/(1)首先定义一个 WNDCLASSEX 结构的变量 wcex WNDCLASSEX wcex;/(2)设置结构的大小,注意这种结构的设计方法,这种方法可以提供版本管理 wcex.
23、cbSize=sizeof(WNDCLASSEX);/(3)设置窗口类的风格,CS_HREDRAW 表示当窗口的水平尺寸发生变化时,窗口需要重新绘制,CS_VREDRAW 表示当窗口的垂直尺寸发生变化时,窗口需要重新绘制 wcex.style =CS_HREDRAW|CS_VREDRAW;/(4)窗口函数的名称为WndProc,WndProc函数负责接收该窗口的所有消息并负责处理 wcex.lpfnWndProc=(WNDPROC)WndProc;/(5)cbClsExtra 和 cbWndExtra 均为 0,表示该窗口类和窗口都没有额外的存储空间 wcex.cbClsExtra =0;wc
24、ex.cbWndExtra =0;/(6)创建窗口的模块的句柄,在这里是应用程序的模块句柄 wcex.hInstance =hInstance;/(7)使用 LoadIcon 函数从资源中加载一个图标,在这里图标的 ID 为 IDI_MYWINAPP,该图标是窗口的大图标,比如在切换窗口的时候等情况下显示使用 wcex.hIcon =LoadIcon(hInstance,(LPCTSTR)IDI_MYWINAPP);/(8)使用 LoadCursor 函数从系统中加载一个光标 wcex.hCursor =LoadCursor(NULL,IDC_ARROW);/(9)决定窗口背景颜色或者图案的刷
25、子的句柄,可以使用 GetStockObjec 函数返回一个系统定义的刷子的句柄 wcex.hbrBackground=(HBRUSH)(COLOR_WINDOW+1);/(10)菜单资源的 ID wcex.lpszMenuName=(LPCSTR)IDC_MYWINAPP;/(11)为该窗口类的名称字符串 wcex.lpszClassName=szWindowClass;/(12)窗口左上角的图标的 ID wcex.hIconSm =LoadIcon(wcex.hInstance,(LPCTSTR)IDI_SMALL);/(13)利用 RegisterClassEx 注册该窗口类,目的是为了
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 课件03 利用Win32 API进行Windows程序设计 课件 03 利用 Win32 API 进行 Windows 程序设计
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内