第1讲Windows程序设计概述

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

源程序结构
Windows 应 用 程 序 组成结构
消息循环 窗口函数1
SWITCH(消 息 ) CASE消 息 1 CASE消 息 2 CASE消 息 n
窗口函数2
SWITCH(消 息 ) CASE消 息 1 CASE消 息 2 CASE消 息 n
窗口函数N
SWITCH(消 息 ) CASE消 息 1 CASE消 息 2 CASE消 息 n
Windows消息循环(API)
支持消息循环的API
// Main message loop: while (GetMessage(&msg, NULL, 0, 0)) { //从消息队列获取消息 if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) { //键盘消息翻译成字符消息 TranslateMessage(&msg); DispatchMessage(&msg); //派送消息给系统 } }
Windows编 程常用消息
不同消息类型的取值范围
系统定义消息(I) 用户定义内部消息 系统定义消息(II) 用户定义外部消息 0x0000~0x03FF 0x0400~0x7FFF 0x8000~0xBFFF 0xC000~0xFFFF
消息的值
#define WM_MOUSEMOVE #define WM_LBUTTONDOWN 0x0200 0x0201
消息的接收与识别
消息接收---窗口函数 WndProc( HWND hwnd, // 窗口句柄 WORD msg, // 消息标识 WPARAM wParam, // 参数 LPARAM lParan) // 参数 消息识别 msg wParam
窗口的程序结构
定义窗口函数
LRESULT CALLBACK 窗口函数 ( 窗口句柄,消息标识,字参数,长参数 ) { switch(message) { case WM_PAINT: ...... case ...... default: return DefWindowProc(hWnd, message, wParam, lParam); } } // 识别收到的各种消息,完成消息响应
交互控制手段
各种Windows 系统能处理的消息
专用数据结构 API 函数
上千个系统函数
Windows API 函数
Application Programming Interface Windows 提供的服务(函数),凡是在 Windows环境下的程序都要用,所以称之为 应用程序编程接口
窗口管理函数 图形设备接口(GDI) 系统服务函数 数据库:ODBC 网络与通信:RPC/WinSock OLE支持
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) 函数
/* 窗口句柄是窗口的唯一标识 */ 窗口句柄 = CreateWindow(窗口类名,标题, …); ShowWindow(窗口句柄,状态); // 创建与显示 UpdateWindow(hWnd); //更新窗口
实现消息相应
问题
生成工程:MyMouse,在此基础上修改。 鼠标左键按下,输出Hello 鼠标左键抬起,画线至当前点,同时以鼠标为圆心。 画一个直径为20的圆 API:TextOut,LineTo Ellipse(hdc,left,top,right,bottom);
只需编写窗口函数,处理用户要求的特定响应。 (Windows应用程序的主要代码都集中在窗 口函数中)
Windows给一些基本的数据类型起了别名
typedef int BOOL //代表布尔值
类似Windows中的数据类型还有:
BSTR //unsigned short * ,32位字符指针 BYTE //unsigned char , 8位无符号整数 COLORREF //unsigned long, 用作颜色值的32 位值 DWORD //unsigned long, 32位无符号整数, 段地址和相关的偏移地址 LONG //long, 32位带符号整数
Windows程序的一些数据类型
LPARAM //long, 作为参数传递给窗口过程或回 调函数的32位值 WPARAM //unsigned int, 当作参数传递给窗 口过程或回调函数的32位值 LPCSTR //const char *, 指向字符串常量的32 位指针 LPSTR //char *, 指向字符串的32位指针 LPCTSTR //const char *, 指向可移植的 Unicode和DBCS字符串常量的32位指针 LPTSTR //char *, 指向可移植为Unicode和 DBCS字符串的32位指针
#define WM_LBUTTONUP
#define WM_LBUTTONDBLCLK #define WM_RBUTTONDOWN
0x0202
0x0203 0x0204
Windows系统消息标识
Windows系统消息标识总是以“WM_”开头, 部分消息标识
WM_LBUTTONDOWN WM_CREATE WM_CLOSE WM_DESTROY WM_QUIT WM_PAINT WM_SIZE WM_MOUSEMOVE //鼠标移动 WM_KEYDOWN //键按下 ……
Windows的专用数据结构---句柄
句柄标识复杂的对象(常是指向指针的指针), 如窗口等。
HWND,窗口句柄 HINSTANCE,应用程序实例句柄 HDC,设备环境句柄 HBITMAP,位图句柄 HFILE,文件句柄 HBRUSH ,画刷句柄 ……
标识符代表一种数据类型 看书后附录
Windows程序的一些数据类型
第1讲 Windows程序概述
主要内容
Windows程序概述 Win32程序分析
Windows程序特点
多任务多用户多窗口系统 工作方式
dos系统,同步方式 程序本身完全控制程序流程(中断例外) 用户只能与一个进程交互 Windows系统,异步方式 Windows控制程序流程 用户能与多个进程交互
图形用户界面(GUI)
hdc是HDC(设备环境句柄)类型的数据
在switch之前,给hdc赋值 HDC hdc=GetDC( hWnd );
x, y是鼠标当前点
在switch加入 int x = LOWORD( lParam ); // 获得鼠标位置 int y = HIWORD( lParam );
在WndProc的最后,加入
ReleaseDC(hWnd, hdc); // 释放设备句柄
窗口函数设计要领
根据应用需求消息响应,设计 case 语句 其余消息必须交给 DefWindowProc
可能递归调用窗口函数
可以利用缺省的消息响应
如:发送 WM_CLOSE 来关闭窗口
需要状态信息时,使用静态变量 窗口函数的编写:逐渐熟悉API
Windows消息结构
Windows中描述消息的结构
typedef struct tagMSG { HWND hwnd; //消息对应的窗口 UINT message; //消息标识码 WPARAM wParam; //消息的附加信息1 LPARAM lParam; //消息的附加信息2 DWORD time; //消息进入消息队列的时刻 POINT pt; //发送消息时的光标位置 } MSG;
消息循环
MSG msg; /* 消息结构 */ while( GetMessage(&msg,0,0,0) ) { /* 从消息队列取消息 */ TranslateMessage( &msg ); /* 翻译消息 */ DispatchMessage( &msg ); /* 发送消息给指定窗口函数 */ } // 收到消息 WM_QUIT 时退出循环
Windows系统、主函数、窗口函数之间关系
Windows系统首先启动主函数WinMain 主函数获取消息,将消息发送给Windows系统 Windows系统再调用窗口函数
窗口函数定义为回调函数(CALLBACK)
回调函数是应用程序提供给Windows系统调用的函 数,一般用于截获消息、获取系统信息或处理异步事 件。
加case语句即可
case WM_LBUTTONDOWN: TextOut(hdc, x, y, "Hello", 5);// 文本输出 break; // 设置当前点 case WM_LBUTTONUP: // 鼠标释放 LineTo(hdc, x, y); // 画线至指定点 Ellipse(hdc,x-10,y-10,x+10,y+10); //画圆 break;
Windows API 函数
是构筑Windows程序的基石。 但API太多了,虽然函数名很友好,记住API 编程太难了!可以查MSDN,编程很没效率。
开发工具
SD)
平台软件开发工具包 (很多有用文件)
开发环境
Visual C++ Visual Basic Java builder C++ Builder ……
窗口的登记
MyRegisterClass函数
WNDCLASS ws; ws.lpszClassName = 窗口类名; ws.lpfnWndProc = 窗口函数名; /* 给定的窗口函数负责该类窗口的消息响应 */ …… RegisterClass( &ws ); /* 登记窗口类 */
窗口的创建与显示
Windows程序的一些数据类型
LRESULT //long, 来自窗口过程或回调函数的 32位返回值 UINT //unsigned int, 32位无符号整数 WORD //unsigned short, 16位无符号整数 WNDPROC //指向窗口过程的32位指针 ……
定义了一些常见的结构类型
POINT RECT ……
消息的种类 …vc\include\winuser.h
BM CB DM EM LB SBM WM 表示按钮控制消息 表示组合框控制消息 表示默认下压式按钮控制消息 表示编辑控制消息 表示列表框控制消息 表示滚动条控制消息 表示窗口消息 窗口管理消息 初始化消息 输入消息 系统消息 剪贴板消息 控件处理消息 控件通知消息 滚动条通知消息 非用户区消息 MDI消息 DDE消息 应用程序自定义的消息
资源文件
*.RES
连接器
库函数
*.LIB
资源连接
可执行文件
*.EXE
Win32程序分析
生成Win32程序“MyWin32”并仔细研究 应用程序入口
WinMain( 程序实例句柄(加载的内存地址),上一程序实例 句柄,命令行参数,显示状态 ) { 定义消息结构体变量、加速键结构体变量 加载全局字符串(标题、注册表中子键) 登记窗口类; //MyRegisterClass if( 是首次实例 ) //InitInstance 创建窗口与显示窗口; 加载快捷键表; 消息循环;//程序一直在循环里,直到遇见WM_QUIT //消息或出错,函数GetMessage返回0. }
通过消息控制 各个应用程序的各个窗口
各种输入由 Windows 系统接收
不受应用程序的控制
应用程序有多个程序入口
主程序和多个窗口函数
Windows 系统本身的工作
也依靠消息驱动体系
源程序
*.C/*.CPP/*.h
程序开发过程
开发工具
资源描述
*.RC
编译器
目标程序
*.OBJ
模块定义
*.DEF
资源编译
Windows 窗口的缺省功能
Windows消息循环
Windows用消息队列管理消息
Windows消息传输过程
事件发生,产生消息
消息种类、接收窗口和属性
消息保存到系统消息队列
按发生顺序
分配给应用程序消息队列
各个应用实例
消息循环提取消息
传给指定的窗口
窗口函数响应消息
识别和处理
Windows程序控制关系
Windows 系统是主控方
(Windows名字的由来)
Windows程序特点
消息驱动体系(异步交互的实现方法)
运行中发生的各种事件(鼠标键盘输入,各种状态 的改变等),以消息的形式通知Windows系统 Windows系统接收消息,提交给发生事件的应用 程序 应用程序的窗口处理函数负责处理响应收到的消息 处理完成后继续等待下一个消息
相关文档
最新文档