《第3章 应用程序分析.ppt》由会员分享,可在线阅读,更多相关《第3章 应用程序分析.ppt(20页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第3章 应用程序的分析WinMain函数 nWindows程序的进入点,原型如下:int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd)nHINSTANCE hInstance q当应用程序要执行时操作系统首先为应用程序分配一个进程空间并在进程空间中建立一个实例,为实例分配一个实例代号并存入hInstance。nhPrevInstance q在32位Windows版本中,进程空间都是独立的,该概念已被抛弃,所以传给WinMain的第二个参数总是NULL(定义为0)。
2、WinMain函数nLPSTR lpCmdLine q指向命令序列的指针,就像Main的参数一样,某些Windows应用程序利用这个指针在启动程序时将文件载入存贮器。nint nShowCmd q指出应用程序的窗口的最初显示方式:正常显示、最大化地显示、最小化显示。nWINAPI识别字 q#define WINAPI _stdcallq此识别字告诉编译器进行编译时的一个调用规范 windows应用程序主要结构n定义应用程序要用的变量,特别是WNDCLAS结构变量。n根据窗口类结构填写各条款,形成初始化的窗口类n注册窗口,如果注册失败则返回操作系统。n根据窗口类建立窗口n在屏幕上显示窗口n消息循
3、环定义应用程序要用的变量static TCHAR szAppName=TEXT(HelloWin);/*程序名放在静态 字符数组,填写窗口类时作为窗口类名*/HWNDhwnd;/定义代号MSGmsg;/定义MSG结构变量 WNDCLASwndclass;/定义窗口类变量 根据窗口类结构填写各条款 wndclass.style=CS_HREDRAW|CS_VREDRAW;/显示窗口的式样 wndclass.lpfnWndProc =WndProc;/窗口消息处理程序地址wndclass.cbClsExtra =0;/额外空间wndclass.cbWndExtra =0;/额外空间wndclass
4、.hInstance =hInstance;/实例代号wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);/载入图标 wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);/载入鼠标 wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);/背景画刷 wndclass.lpszMenuNam=NULL;/菜单名wndclass.lpszClassName=szAppName;/窗口类名窗口类结构WNDCLASSn窗口类结构q描述窗口形状的结构体,用其定义该类型
5、的结构变量后,可表达一类结构相同的窗口。q对窗口类结构变量实例化后,向windows系统注册,称为窗口类(窗口模版)n窗口类q一种是用户通过定义窗口类结构变量并注册生成q一种是系统内建的,直接使用,如编辑框。窗口类结构WNDCLASSn窗口类的式样#define CS_VREDRAW ox0001 /如果窗口的高度发生变化,通知Windows#define CS_HREDRAW ox0002 /如果窗口的水平尺寸发生变化,通知Windows#define CS_DBLCLKS ox0008 /有鼠标双击事件,通知Windows#define CS_NOCLOSE ox0200 /系统菜单没有c
6、lose项窗口类结构WNDCLASSnwndclass.lpfnWndProc =WndProc;/窗口消息处理程序地址nwndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);/载入图标n wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);/载入鼠标n wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);注册窗口if(!RegisterClass(&wndclass)MessageBox(NULL,TEXT(This program requires W
7、indows NT!),szAppName,MB_ICONERROR);return 0;/注册不成功,输出信息,返回操作系统建立窗口hwnd=CreateWindow(szAppName,/window class nameTEXT(The Hello Program),/window captionWS_OVERLAPPEDWINDOW,/window styleCW_USEDEFAULT,/initial x positionCW_USEDEFAULT,/initial y positionCW_USEDEFAULT,/initial x sizeCW_USEDEFAULT,/initi
8、al y sizeNULL,/parent window handle NULL,/16window menu handle hInstance,/program instance handle NULL);/creation parameters建立窗口n作用qCreateWindow函数的结果是windows为所建窗口分配了一块存储区域,用于该函数建立窗口的全部信息,并返回指向这一块存储区的指针,即为窗口句柄。建立窗口n参数(1)是窗口类名,在定义窗口时确定n参数(2)创建窗口的标题n参数(3)窗口建立时的式样n参数(4)、(5)是窗口左上角的x,y坐标。n参数(6)、(7)是窗口的宽度和
9、高度n参数(8)父窗口句柄n参数(9)系统菜单句柄n参数(10)应用程序实例句柄,关联窗口与程序。显示窗口nShowWindow(hwnd,iCmdShow);/显示Windows窗口q作用:将创建的窗口信息表现在屏幕上qhwnd是CreateWindow所返回的窗口代号(句柄),根据改代号在存储区域找出显示窗口所需要的信息。n UpdateWindow(hwnd);/刷新Windows窗口消息循环 while(GetMessage(&msg,NULL,0,0)TranslateMessage(&msg);DispatchMessage(&msg);消息循环nGetMessage(&msg,N
10、ULL,0,0)函数 q此函数把消息传给第1个参数msg结构。第二、第三和第四个参数设定为NULL或者0,表示程序接收它自己建立的窗口的消息。q只要从消息队列中取出且送到msg中的消息不为WM_QUIT(其值为0 x0012),GetMessage就返回一个非零值。消息循环nTranslateMessage(&msg)q限制了WM_KEYDOWN/WM_KEYUP,WM_SYSKEYDOWN/WM_SYSKEYUP的影响,别把它们转换成WM_CHAR或者WM_DEADCHAR或者WM_SYSCHAR或者WM_SYSDEADCHAR。nDispatchMessage(&msg)q作用是把msg消
11、息送到MSG结构中hwnd条款所指出的窗口函数。q注意:由Windows操作系统启动窗口函数。消息循环typedef struct tagMSG HWNDhwnd;/接收此消息的窗口的代号UINTmessage;/消息,消息用一个无符号整数表示WPARAM wParam;/与当前消息有关的消息参数LPARAM lParam;/与当前消息有关的消息参数DWORD time;/消息在应用程序消息队列中出现的时间POINT pt;/传递消息时,鼠标在屏幕上的位置MSG,*PMSG;窗口函数n概念q窗口函数是处理消息的函数,确定了怎样响应用户的输入。n窗口函数的基本结构q使用switch和case结构来确定窗口函数接收的消息并处理它。n窗口消息qWM_CREATE,WM_PAINT消息,WM_DESTROY消息窗口函数nWM_CREATE消息q由CreateWindow函数执行时发出的窗口消息,该消息通过消息循环在窗口函数中响应。nWM_PAINT消息q本示例程序中由UpdateWindow函数执行时发出的窗口消息,该消息通过消息循环在窗口函数中响应。q窗口无效时也产生此消息q在该消息响应中对窗口内容重画
限制150内