第3章 Windows 应用程序基础 2018/12/6 第2讲 Windows 应用程序基础 VC++面向对象与可视化程序设计.

Slides:



Advertisements
Similar presentations
软件开发技术基础 第 3 章 操作系统及程序设计 讲授教师:卫颜俊. 主 要 内 容 主 要 内 容 操作系统及其功能 进程管理应用程序设计 内存管理应用程序设计 设备与文件管理应用程序设计 人机接口管理应用程序设计.
Advertisements

C语言程序设计 主讲教师 :张群燕 电话:
第九章 2D遊戲演算法 課前指引 本章中將介紹在遊戲開發過程中,常會運用到一些貼圖技巧,來展現遊戲畫面及動態效果。例如基本貼圖、動畫貼圖、橫向捲軸移動、前景背景移動等,來提高單純2D圖片的變化性。
C#程序设计案例教程 第3章 程 序 结 构.
動畫與遊戲設計 2D Game 程于芳 老師
第一章 C语言概述 计算机公共教学部.
编译原理上机实习
计算机硕士专业基础—C语言 赵海英
俄罗斯方块 制作: 华凌锋.
第 5 章 流程控制 (一): 條件分支.
计算机图形学 授课教师:陈荣钦 短号: 单位:数信学院.
吉林大学远程教育课件 Windows A P I编 程 (第四十五讲) 主讲人 : 翟慧杰 学 时:48.
第三章 控制结构.
CH2 開發環境介紹 最簡單的互動設計 – Arduino一試就上手 孫駿榮、吳明展、盧聰勇.
Class 2 流程控制-選擇敘述與迴圈.
佇列 (Queue).
第3章 C 語言的基本知識.
第4讲 Windows编程基础 此为封面页,需列出课程编码、课程名称和课程开发室名称。
授课老师:龚涛 信息科学与技术学院 2018年3月 教材: 《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
2 C++ 的基本語法和使用環境 親自撰寫和執行程式是學好程式語言的不二法門。本章藉由兩個簡單的程式,介紹C++ 程式的基本結構和開發環境,讓初學者能逐漸建立使用C++ 的信心。
简要回顾 了解课程体系、课程目的和主要内容 掌握Windows编程涉及的一些主要概念 DOS程序和Windows程序的主要区别 窗口和程序
第1章 Windows应用程序框架的 创建与消息处理
MFC WinSock类的编程 为简化套接字网络编程,更方便地利用Windows的消息驱动机制,微软的基础类库(Microsoft Foundation Class Libary,简称MFC),提供了两个套接字类,在不同的层次上对Windows Socket API函数进行了封装,为编写Windows.
网络游戏开发语言基础 ——Windows程序设计
第4讲 Windows编程基础 主讲:谢昕 此为封面页,需列出课程编码、课程名称和课程开发室名称。
第5章 文本与字体 2018/12/31 面向对象与可视化 程序设计 --Visual C++ 编程 主讲教师: 唐 龙教授 (计算机科学与技术系) 黄维通博士 (计算机与信息管理中心) 清 华 大 学 2001年2月 2018/12/31 Huang Weitong.
Windows 编程技术 2005年9月 2018/12/31.
C语言 程序设计基础与试验 刘新国、2012年秋.
第三章 栈和队列.
第4章 MFC编程 4.1 MFC概述 4.2 MFC和Win CObject类 4.4 消息映射的实现
第三章 用户接口与作业管理 用户与操作系统的接口 批处理操作系统的作业管理 作业的基本概念:作业、作业步、作业流 交互式系统作业管理
C++语言程序设计 第二章 C++简单程序设计.
COM:moniker、UDT、control
第3讲 Windows的图形设备接口及windows绘图
第1章 概述 本章要点: C语言程序结构和特点 C语言程序的基本符号与关键字 C语言程序的编辑及运行 学习方法建议:
第十五讲 MFC与消息处理 MFC简介 Windows编程机制 MFC应用程序框架原理 创建应用程序框架 消息及其分类 消息映射机制
版权所有 复制必究 第 6 章 MFC原理与方法.
第1讲 C语言基础 要求: (1) C程序的组成 (2) C语言的标识符是如何定义的。 (3) C语言有哪些基本数据类型?各种基本数
程式結構&語法.
4 條件選擇 4.1 程式基本結構 循序式結構 選擇式結構 重複式結構 4-3
第三章 C++的语句和简单的程序设计 主要内容:
《面向对象程序设计与Visual C++6.0教程》
第 二 章 数据类型、运算符与表达式.
_05MessageMap的原理 本节课讲师——void* 视频提供:昆山爱达人信息技术有限公司 官网地址:
MFC及其应用.
C++语言程序设计 C++语言程序设计 第九章 类的特殊成员 第十一组 C++语言程序设计.
第5章 文本与字体 2019/4/25 面向对象与可视化 程序设计 --Visual C++ 编程 主讲教师: 唐 龙教授 (计算机科学与技术系) 黄维通博士 (计算机与信息管理中心) 清 华 大 学 2001年2月 2019/4/25 Huang Weitong.
C++语言程序设计教程 第2章 数据类型与表达式 第2章 数据类型与表达式 制作人:杨进才 沈显君.
功能表的建立 製作.
<编程达人入门课程> 本节内容 为什么要使用变量? 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ:
第二章 Java语法基础.
第二章 类型、对象、运算符和表达式.
OpenGL 基础 计算机科学与技术系.
第10章媒体控制接口 10.1 MCI设备类型 10.2 MCI编程步骤 10.3使用MCIWnd窗口类.
#include <iostream.h>
第二章 Java基本语法 讲师:复凡.
第五章 逻辑运算和判断选取控制 §5.1 关系运算符和关系表达式
第1章 数据结构基础概论 本章主要介绍以下内容 数据结构研究的主要内容 数据结构中涉及的基本概念 算法的概念、描述方法以及评价标准.
1.4WIN32中的宽字符.
_01自己实现简单的消息处理框架模型 本节课讲师——void* 视频提供:昆山爱达人信息技术有限公司
第2章 Java语言基础.
多重條件選擇敘述
基本資料型態 變數與常數 運算子 基本的資料處理 授課:ANT 日期:2014/03/03.
第三章 流程控制 程序的运行流程 选择结构语句 循环结构语句 主讲:李祥 时间:2015年10月.
第二章 Java基础语法 北京传智播客教育
第二章 Java基本语法 讲师:复凡.
函式庫補充資料 1.
手工编写第一个 MFC程序 本节内容 视频提供:昆山爱达人信息技术有限公司 视频录制:yang 官网地址:
Presentation transcript:

第3章 Windows 应用程序基础 2018/12/6 第2讲 Windows 应用程序基础 VC++面向对象与可视化程序设计

一、Windows编程基础 可视化开发 系统集成了一系 列系统可用资源 和开发工具 程序调试工具包括源程序语法检查、可执行程序修改和运行监视等 可选择并构成具体语句或源程序结构的例程库及Help 资源管理器 包括图形化窗口及组成元素的多种对象的编辑器 可视化开发 系统集成了一系 列系统可用资源 和开发工具 应用程序Help和Setup开发工具包 系统函数库和系统函数开发工具 源程序编辑器和编译器

VC 都是“面向对象”的程序设计语言 Windows的 VB 程序设计语言 VJ 窗口 菜单 对象是Windows 按钮 对话框 的规范部件 2018/12/6 编写Windows 程序相当一部分工 作是在创建对象和 为对象属性赋值 对象是Windows 的规范部件 窗口 菜单 按钮 对话框 程序模块 对象特征:具有规范形态和操作模式 编程方法 传统编写法-->API 交互式方法-->MFC 采用交互式方法时,可视化开发平台给出了许多选用的对象,程序员可选择所需对象并确定其属性,由此搭建起应用程序的“大框架”,并可根据需要进一步编写必要的细节代码段,最后构成完整的应用程序 VC++面向对象与可视化程序设计

API 为应用程序提供Windows系统特殊函数及数据结构 窗口管理函数实现窗口的创建、移动和修改功能 Win应用程序可以利用标准大量API函数调用系统功能 API API函数 的功能 系统服务函数:实现与操作系统有关的多种功能 是Win系统与Win应用程序间的标准程序接口 图形设备(GDI)函数:实现与设备无关的图形操作功能

利用Windows API函数编写Windows应用程序必须首先了解以下内容: (1)窗口的概念 (2)事件驱动的概念 (3)句柄 (4)消息

(1) 窗口 一个应用程序的窗口一般包含下列成分: 最大化按钮 控制菜单框 最小化按钮 下拉菜单 标题栏 工作区 垂直滚动条 窗口边界 水平滚动条

系统管理 应用程序 的基本单位 应用程 序与用 户之间 交互的 接口环 境 Win应用程序 基本的操作单元 编写一个Windows应用程序首先应创建一个或多个窗口,随后应用程序的运行过程即是窗口内部、窗口与窗口之间、窗口与系统之间进行数据处理与数据交换的过程。

(2)事件驱动 Windows程序设计是针对事件或消息的处理进行 消息是描述事 件发生的信息 (如按下鼠标或键盘) Windows程序设计是针对事件或消息的处理进行 Windows程序的执行顺序取决于事件发生的顺序,程序的执行顺序是由顺序产生的消息驱动的,但是消息的产生往往并不要求有次序之分。 事件驱动编程方法对于编写交互式程序很有用处,它避免了死板的操作模式

(3) 句柄 窗口 句柄是一个4字节长的数值,用于标识应用程序中不同的对象和同类对象中不同的实例 按钮 图标 滚动条 输出设备 控制 文件 应用程序通过 句柄访问相应 的对象信息 常用句柄类型及其说明 HWND 窗口句柄 HDC 设备环境句柄 HBITMAP 位图句柄 HCURSOR 光标句柄 HICON 图标句柄 HFONT 字体句柄 HMENU 菜单句柄 HPEN 画笔句柄 HFILE 文件句柄 HBRUSH 画刷句柄 HINSTANCE 当前实例句柄

(4) 消息 Windows应用程序利用Windows消息(Message)与应用程序及系统进行信息交换。 消息号:由事先定义好的消息名标识 字参数(wParam) :用于提供消息的附加信息 长字参数(lParam) :用于提供消息的附加信息 消息 附加信息与具体 消息号的值有关, 在Win中消息用 结构体MSG表示 typedef struct tagMSG {HWND hwnd; 窗口句柄,为null,则可检索所有驻留在消息队列中的消息 UINT message;消息值,由Windows.h头文件中的宏定义来标识 WPARAM wParam; 包含有关消息的附加信息,不同消息其值有所不同 LPARAM lParam; DWORD time; 指定消息送至队列的时间 POINT pt;指定消息发送时屏幕光标的位置, 其数据类型POINT也是一个结构体 }MSG; typedef struct tagPOINT {LONG x; LONG y; } POINT;

(4) 消息 VC中存在几种系统定义的消息分类,不同的前缀符号经常用于消息宏识别消息附属的分类,系统定义的消息宏前缀如下: BM 表示按钮控制消息 CB 表示组合框控制消息 DM 表示默认下压式按钮控制消息 EM 表示编辑控制消息 LB 表示列表框控制消息 SBM 表示滚动条控制消息 WM 表示窗口消息 窗口管理消息 初始化消息 输入消息 系统消息 剪贴板消息 控制处理消息 控制通知消息 滚动条通知消息 非用户区消息 MDI消息 DDE消息 应用程序自定义的消息 Windows编 程常用消息

二、Windows应用程序常用消息 wParam包含一整数值以标识鼠标键的按下状态 1. WM_LBUTTONDOWN:产生单击鼠标左键的消息 1Param 高字节包含当前光标的Y坐标值 低字节包含当前光标的X坐标值 wParam包含一整数值以标识鼠标键的按下状态 MK_LBUTTON 按下鼠标左键 MK_MBUTTON 按下鼠标中键 MK_RBUTTON 按下鼠标右键 此外,相似的消息还有: WM_LBUTTONUP:放开鼠标左键时产生; WM_RBUTTONDOWN:单击鼠标右键时产生; WM_RBUTTONUP:放开鼠标右键时产生; WM_LBUTTONDBLCLK:双击鼠标左键时产生; WM_RBUTTONDBLCLK:双击鼠标右键时产生。

2. WM_KEYDOWN:按下一个非系统键时产生的消息 系统键是指实现系统操作的组合键,例如Alt与某个功能键的组合以实现系统菜单操作等。 如F1的虚拟键码 在Windows.h文 件中定义为VK_F1 wParam:按下键的虚拟键码,用以标识按下或释放的键 1Param:记录了按键的重复次数、扫描码、转移代码、先前键的状态等信息。 相似的消息还有WM_KEYUP, 在放开非系统键时产生 3. WM_ CHAR:按下一个非系统键时产生的消息 wParam 为按键的ASCII码 1Param 与WM_KEYDOWN的相同

4. WM_CREATE:由CreateWindow函数发出的消息 wParam:未用 1Param:包含一个指向CREATESTRUCT数据结构的指针 5. WM_CLOSE:关闭窗口时产生的消息 wParam和1Param均未用。 6. WM_DESTROY:由DestroyWiodow函数发出的消息 wParam和1Param均未用。

7. WM_QUIT:由PostQuitMessage函数发出的消息 退出应用程序时发出的消息 wParam:含退出代码,标识程序退出运行时的有关信息 1Param:未用 8. WM_PAINT 用户区移动或显示 用户窗口改变大小 程序通过滚动条滚动窗口 下拉式菜单关闭并需要恢复被覆盖的部分 Windows清除对话框等对象,并需要恢复被覆盖的部分 均产生 WM_PAINT 消息

三、Windows中的事件驱动程序设计 过程驱动方法计算平均成绩 事件驱动方法计算平均成绩 启动 输入姓名 输入第一次测试成绩 输入第二次测试成绩 输入第三次测试成绩 计算平均成绩 结束 启动 消息处理 结束 输入姓名 输入第一次成绩 输入第二次成绩 输入第三次成绩 计算平均成绩 过程驱动方法计算平均成绩 事件驱动方法计算平均成绩

1. 应用程序的组成 四、Windows应用程序组成及编程步骤 1.C语言源程序文件 2.头文件 3.模块定义文件 4.资源描述文件 1. 应用程序的组成 一个完整的Windows应用程序通常由五种类型的文件组成。 1.C语言源程序文件 2.头文件 3.模块定义文件 4.资源描述文件 5.项目文件

2. 完成一系列的定义和初始化,并产生消息循环 2. 源程序组成结构 1. 所有应用程序的入口,类似Main函数, 2. 完成一系列的定义和初始化,并产生消息循环 入口函数WinMain 窗口函数WndProc Windows应用程序 构成基 本框架 包含各种数据类型、数据结构与函数等 WinMain和WinProc是 Windows应用程序的主体

(1) WinMain函数 WinMain函数 注册窗口类,建立窗口及执行必要的初始化 功能 当消息循环检索到WM_QUIT时终止程序运行 进入消息循环,据接受的消息调用相应的处理过程 当消息循环检索到WM_QUIT时终止程序运行 三个基本的组成部分:函数说明、初始化和消息循环 WinMain函数说明 WinMain函数的说明如下: int WINAPI WinMain ( HINSTANCE hThisInst, ∥应用程序当前实例句柄 HINSTANCe hPrevInst, ∥应用程序其他实例句柄 LPSTR lpszCmdLine, ∥指向程序命令行参数的指针 Int nCmdShow ∥应用程序开始执行时窗口显示方式的整数值标识 ) 注意!Win是多任务管理的,同一应用程序的多个窗口可能会同时存,Win系统对每个窗口的执行称为一个实例,并用一个实例句柄来唯一标识

(2) 初始化 (a)窗口类定义 通过给窗口类数据结构WNDCLASS赋值完成,该数据结构中包含窗口类的各种属性。窗口类定义常用以下函数: 第3章 Windows 应用程序基础 2018/12/6 (2) 初始化 初始化 显示窗口 创建窗口实例 窗口类的注册:窗口类必须先注册后使用 窗口类的定义:定义窗口的形式与功能 LoadIcon LoadCursor GetStockObject RegisterClass CreateWindow ShowWindow ,UpdateWindow (a)窗口类定义 通过给窗口类数据结构WNDCLASS赋值完成,该数据结构中包含窗口类的各种属性。窗口类定义常用以下函数: LoadIcon的作用是在应用程序中加载一个窗口图标。其原型为: HICON LoadIcon(HINSTANCE hInstance,LPCTSTR lpIconName) 图标资源名或系统预定义图标标识名 图标资源所在的模块句柄, NULL则使用系统预定义图标 VC++面向对象与可视化程序设计

LoadCursor的作用是在应用程序中加载一个窗口光标 HCURSOR LoadCursor(HINSTANCE hInstance, LPCTSTR lpCursorName) 光标资源所在的模 块句柄,NULL则使 用系统预定义光标 光标资源名或系统 预定义光标标识名 应用程序调用函数GetStockObject获取系统提供的背景刷 HBRUSH GetStockObject(int nBrush);

(b)注册窗口类 Win系统本身提供部分预定义的窗口类,程序员也可以自定义窗口类,窗口类必须先注册后使用。窗口类的注册由函数RegisterClass()实现。 RegisterClass(&wndclass); //wndclass为窗口类结构 RegisterClass函数的返回为布尔值,注册成功则返回真

(c) 创建窗口实例 创建一个窗口类的实例由函数CreateWindow()实现 函数原型如下: HWND Create Window ( LPCTSTR lpszClassName,∥窗口类名 LPCTSTR lpszTitle, ∥窗口标题名 DWORD dwStyle, ∥创建窗口的样式 int x,y, ∥窗口左上角坐标 int nWidth,nHeight, ∥窗口宽度和度高 HWND hwndParent, ∥该窗口的父窗口句柄 HWENU hMenu, ∥窗口主菜单句柄 HINSTANCE hInstance, ∥创建窗口的应用程序当前句柄 LPVOID lpParam ∥指向一个传递给窗口的参数值的指针 )

显示窗口后,应用程序调用UpdateWindow更新并绘制用户区,并发出WM_PAINT消息。 UpdateWindow(hwnd); 窗口类的显示由ShowWindow和UpdateWindow函数实现。应用程序调用ShowWindow函数在屏幕上显示窗口 ShowWindow(hwnd,nCmdshow);//nCmdshow为窗口显示形式标识 显示窗口后,应用程序调用UpdateWindow更新并绘制用户区,并发出WM_PAINT消息。 UpdateWindow(hwnd);

消 息 队 列 将消息的虚拟键 转换为字符信息 将消息传送到 指定窗口函数 (3) 消息循环 将消息传递给窗口函数的相应过程处理 消 息 队 列 Windows将产生的消息 WinMain函数 消息循环的常见格式如下: MSG Msg; … while (GetMessage (&Msg,NULL,0,0)) { TranslateMessage(&Msg); DispatchMessage(&Msg); } 从消息队列中读取 一条消息,并将消 息放在MSG结构中 其中函数GetMessage形式为: GetMessage (lpMSG, //指向MSG结构的指针 hwnd, nMsgFilteMin, //用于消息过滤的最小消息号值 nMsgFilterMax //用于消息过滤的最大消息号值 ) 返回零值,即检索 到WM_QUIT消息,程 序结束循环并退出 将消息的虚拟键 转换为字符信息 将消息传送到 指定窗口函数

2. 窗口函数WinProc 定义了应用程序对接收到的不同消息的响应 WinProc 包含了对各种可能接收到的消息的处理过程 WinProc函数由一个或多个switch语句组成。每一条case语句对应一种消息,当应用程序接收到一个消息时,相应的case语句被激活并执行相应的响应程序模块。

LRESULT CALLBACK WndProc( HWND hwnd, UINT messgae, 窗口函数的一般形式如下: LRESULT CALLBACK WndProc( HWND hwnd, UINT messgae, WPARAM wParam,LPARAM lParam ) { … switch(message) ∥ message为标识的消息 { case … … break; case WM_DESTROY: PostQuitMessage(0); default: return DefWindowProc(hwnd,message,wParam,lParam); } return(0); 在消息处理程序段中一般都有对WM_DESTROY的处理,该消息是关闭窗口时发出的。它向应用程序发出WM_QUIT消息,请求退出处理函数: void PostQuitMessage(int nExitCode) //nExitCode为应用程序的退出代码 为未定义处理过程的消息提供缺省处理

3.数据类型 在Windows.h中定义了Windows 应用程序中包含种类繁多的数据类型

4. 一些重要的数据结构 MSG:包含一个消息的全部信息,是消息发送的格式 WINDCLASS:包含一个窗口类的全部信息及属性 几种重要的结构 WINDCLASS:包含一个窗口类的全部信息及属性 POINT:定义了屏幕上或窗口中的一个点的X和 Y坐标 RECT:定义了一个矩形区域及其左上角和右下角的坐标

五、应用程序举例 { HWND hwnd ; MSG Msg ; WNDCLASS wndclass ; 【例2-1】创建应用程序框架。本例的目的在于说明创建Windows应用程序的方法及过程 #include<windows.h> //包含应用程序中所需的数据类型和数据结构的定义 LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM); //窗口函数说明 //--------------- 以下初始化窗口类 ---------------------- int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInst,LPSTR lpszCmdLine,int nCmdShow) { HWND hwnd ; MSG Msg ; WNDCLASS wndclass ; char lpszClassName[] = "窗口"; //窗口类名 char lpszTitle[]= "My_Windows"; //窗口标题名

wndclass.style=0; //窗口类型为缺省类型 wndclass.lpfnWndProc=WndProc; //定义窗口处理函数 //窗口类的定义 wndclass.style=0; //窗口类型为缺省类型 wndclass.lpfnWndProc=WndProc; //定义窗口处理函数 wndclass.cbClsExtra=0; //窗口类无扩展 wndclass.cbWndExtra=0; //窗口实例无扩展 wndclass.hInstance=hInstance; //当前实例句柄 wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION); //窗口的最小化图标为缺省图标 wndclass.hCursor=LoadCursor(NULL,IDC_ARROW) ; //窗口采用箭头光标 wndclass.hbrBackground=GetStockObject(WHITE_BRUSH); //窗口背景为白色 wndclass.lpszMenuName=NULL; //窗口中无菜单 wndclass.lpszClassName=lpszClassName ; //窗口类名为"窗口"

if(!RegisterClass( &wndclass))//如果注册失败则发出警告 //--------------- 以下进行窗口类的注册 ------- if(!RegisterClass( &wndclass))//如果注册失败则发出警告 { MessageBeep(0) ; return FALSE ; } //---------------- 创建窗口 ------------------- hwnd=CreateWindow ( lpszClassName, //窗口类名 lpszTitle, //窗口实例的标题名 WS_OVERLAPPEDWINDOW, //窗口的风格 CW_USEDEFAULT, CW_USEDEFAULT, //窗口左上角坐标为缺省值 CW_USEDEFAULT,, //窗口的高和宽为缺省值 NULL, //此窗口无父窗口 NULL, //此窗口无主菜单 hInstance, //创建此窗口的应用程序的当前句柄 NULL //不使用该值 );

//--------------- 显示窗口 ---------------------- ShowWindow( hwnd, nCmdShow) ; //-------------- 绘制用户区 --------------------- UpdateWindow(hwnd); //----------------- 消 息 循 环 ---------------------- while( GetMessage(&Msg, NULL, 0, 0)) { TranslateMessage( &Msg) ; DispatchMessage( &Msg) ; } return Msg.wParam; //消息循环结束即程序终止时将信息返回系统

LRESULT CALLBACK WndProc ( HWND hwnd, UINT message, WPARAM wParam, 第3章 Windows 应用程序基础 2018/12/6 /窗口函数 LRESULT CALLBACK WndProc ( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ) { switch(message) { case WM_DESTROY: PostQuitMessage(0); default: //缺省时采用系统消息缺省处理函数 return DefWindowProc(hwnd,message,wParam,lParam); } return(0); 调用PostQuitMessage 发出WM_QUIT消息 VC++面向对象与可视化程序设计