首页计算机计算机软件VisualC++ 01 第1章 Windows编程基础.pptx

01 第1章 Windows编程基础.pptx

页数:65页文件大小:416.8 KB来源: VisualC++ppt课件

本课件对应课程第1章Windows编程基础,先说明课程性质与学时安排,再从面向对象与Windows API切入,依次讲清窗口、句柄、事件驱动、消息与匈牙利命名法等基本概念,随后展开消息队列与消息循环的实现细节,最后完整剖析由入口函数WinMain与窗口函数WndProc构成的应用程序结构,适合作为Windows程序设计的入门基础材料。

Visual C++语言课程基本情况页,标明课程性质为专业选修课、3学分48学时以及主讲教师与开课院系
第1章Windows编程基础教学重点页,聚焦窗口、事件驱动、句柄、消息等概念与WinMain、WinProc程序结构
Windows程序设计语言说明页,指出VC、VB、VJ均为面向对象语言,对象是窗口、菜单、按钮等规范部件
查看本课件的文字版(共 65 页,供检索与复制)

第1页:课程基本情况

课程基本情况课程名称:Visual C++语言课程性质:专业选修课(限选)学时学分:3学分48(含上机16)学时主讲教师开课院系:

第2页:第1章教学重点

  • 教学重点1
  • Windows程序设计基本概念窗口
  • 事件驱动
  • 句柄
  • 消息
  • 匈牙利命名法2
  • Windows应用程序源程序结构WinMain函数(入口函数)---初始化
  • 消息循环WinProc函数(窗口函数)---处理消息,实现程序具体功能

第3页:1.1 Windows程序设计

1.1 Windows程序设计Windows的程序设计语言VC,VB,VJ都是“面向对象”的程序设计语言。

  • 对象Windows的规范部件,如窗口
  • 菜单
  • 按钮
  • 对话框
  • 程序模块等

第4页:对象特征与编程方法

1.1 Windows程序设计对象特征具有规范形态和操作模式,编写Windows程序相当一部分工作是在创建对象和为对象属性赋值。 编程方法传统编写法--> API交互式方法--> MFC

第5页:Windows API

1.1 Windows程序设计Windows API=系统函数+数据结构Windows API是Windows系统与Windows应用程序间的标准程序接口,Windows应用程序可以利用大量的标准API函数调用系统功能。

第6页:1.2 编程基本概念

1.2 Windows编程基本概念

  • 窗口(2)句柄(3)事件驱动(4)消息(5)匈牙利命名法

本页源文件仅提取到标题或少量文字,详细内容请对照本页图示。

第7页:窗口的组成部分

  • 窗口一般包含下列组成部分:标题栏
  • 菜单框
  • 工作区
  • 窗口边界
  • 最大化按钮
  • 最小化按钮
  • 垂直滚动条
  • 水平滚动条

1.2 Windows编程基本概念----窗口

第8页:窗口的作用

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

第9页:事件驱动

  • 1.2 Windows编程基本概念----事件驱动DOS程序:顺序的
  • 过程驱动程序都有一个明显的开始
  • 明显的过程以及一个明显的结束
Windows程序
事件驱动程序的流程不是由事件的顺序来控制,而是由事件的发生来控制,所有的事件是无序的。

第10页:句柄的概念

1.2 Windows编程基本概念----句柄句柄是一个4字节长的数值,用于标识应用程序中不同的对象和同类对象中不同的实例。 应用程序通过句柄访问相应的对象信息。

第11页:常用句柄类型

常用句柄类型

Windows常用句柄类型对照表
句柄说明句柄类型
设备环境句柄HDC
窗口句柄HWND
光标句柄HCURSOR
位图句柄HBITMAP
字体句柄HFONT
图标句柄HICON
画笔句柄HPEN
菜单句柄HMENU
画刷句柄HBRUSH
文件句柄HFILE
实例句柄HINSTANCE

1.2Windows编程基本概念----句柄设备环境句柄HDC窗口句柄HWND光标句柄HCURSOR位图句柄HBITMAP字体句柄HFONT图标句柄HICON画笔句柄HPEN菜单句柄HMENU画刷句柄HBRUSH文件句柄HFILE实例句柄HINSTANCE

第12页:消息的概念

1.2 Windows编程基本概念----消息消息是描述事件发生的信息(如按下鼠标或键盘),Windows程序设计是针对事件或消息的处理进行。

第13页:消息的组成

1.2 Windows编程基本概念----消息Windows应用程序利用Windows消息(Message)与应用程序及系统进行信息交换。

消息组成消息号
由事先定义好的消息名标识;
字参数(wParam)
提供消息的附加信息;
长字参数(lParam)
提供消息的附加信息。

第14页:消息类型前缀

消息类型前缀

Windows消息类型与前缀符号对照表
消息类别前缀符号
按钮控件消息BM
编辑控件消息EM
组合框控件消息CB
滚动条控件消息SBM
列表框控件消息LB
窗口消息WM

1.2 Windows编程基本概念----消息Windows消息的类型前缀符号用于消息宏识别消息附属的分类按钮控件消息DM按钮控件消息BM编辑控件消息EM组合框控件消息CB滚动条控件消息SBM列表框控件消息LB窗口消息WM

原文首行作「按钮控件消息DM」,与后一行「按钮控件消息BM」重复,此处按常见Windows消息前缀归类列出,DM疑为对话框消息,建议对照原图核对。

第15页:匈牙利命名法

匈牙利命名法

匈牙利命名法常用前缀(一)
类型前缀字符
字符 charch
布尔值 BOOLb
整数 intn(l)

1.2 Windows编程基本概念----匈牙利命名法小写字母做为变量名前缀说明类型,其余部分描述变量意义与功能说明类型前缀字符charch布尔值BOOLb整数intn(l)

第16页:匈牙利命名法(续)

匈牙利命名法(续)

匈牙利命名法常用前缀(二)
类型前缀字符
16位无符号整数 WORDw
32位无符号数 DWORDdw
指向字符串的32位指针 LPTSTRlpsz
窗口对象的句柄 Handleh

1.2Windows编程基本概念----匈牙利命名法说明类型前缀16位无符号整数WORDw32位无符号数DWORDdw指向字符串的32位指针LPTSTRlpsz窗口对象的句柄Handleh

第17页:1.3 消息循环

1.3 Windows的消息循环1、Windows系统为应用程序保持一个消息队列。

  • 当有事件发生后,Windows先将激发事件翻译成一个Windows消息,然后再把这个消息加入到这个应用程序的消息队列中去。
  • 应用程序需要通过消息循环来接收这些消息。

第18页:消息循环代码

1.3 Windows的消息循环MSG msg;

//定义消息名while (GetMessage (&msg, NULL, 0, 0)){ TranslateMessage (&msg) ;//分发消息}

第19页:MSG结构体

1.3 Windows的消息循环----MSG结构体

typedef struct tagMSG{ HWND hwnd; UINT message; WPARAM wParam; LPARAM lParam; DWORD time; POINT pt; } MSG, *PMSG;

第20页:POINT结构体

1.3 Windows的消息循环----POINT结构体定义

typedef struct tagPOINT{ LONG x; LONG y; } POINT;

第21页:MSG成员说明(一)

1.3 Windows的消息循环----MSG结构体hwnd:消息将要发送到的那个窗口的句柄,用这个参数可以决定让哪个窗口接收消息。

message
消息号,它唯一标识了一种消息类型。

每种消息类型都在windows.h文件进行了预定义。

wParam
一个32位的消息参数,这个值的确切意义取决于消息本身。
lParam
同上。

第22页:MSG成员说明(二)

1.3 Windows的消息循环----MSG结构体time:消息放入消息队列中的时间,在这个域中写入的并非当时日期,而是从Windows启动后所测量的时间值。 Windows用这个域来使消息保持正确的顺序。

pt
消息放入消息队列时的鼠标坐标。

第23页:GetMessage函数

1.3 Windows的消息循环----GetMessage

BOOL GetMessage(LPMSG lpMsg,HWND hWnd,UINT wMsgFilterMin,UINT wMsgFilterMax);

第24页:GetMessage参数说明

1.3 Windows的消息循环----GetMessagelpMsg:指定要接收消息的MSG结构的地址;

hWnd
窗口句柄,一般将其设置为空,表示要获取该应用程序创建的所有窗口的消息;

第三、四参数用于指定消息范围。 GetMessage收到一个WM_QUIT消息,则返回FALSE以退出消息循环,终止程序运行。 否则GetMessage()返回TRUE。

第25页:TranslateMessage函数

1.3 Windows的消息循环----TranslateMessageGetMessage()读入消息后,首先要经过函数TranslateMessage()对其进行解释,但对大多数消息来说并不起什么作用。 TranslateMessage()负责将消息的虚拟键转换为字符消息。

第26页:DispatchMessage函数

1.3 Windows的消息循环----DispatchMessageDispatchMessage()函数,把GetMessage获取的Windows消息传送给在MSG结构中为窗口所指定的窗口过程。 在消息处理函数处理完消息之后,代码又循环到开始去接收另一个消息,这样就完成了一个完整的消息循环。

第27页:1.4 常用鼠标消息

1.4常用消息—鼠标消息WM_LBUTTONDOWN
单击鼠标左键时产生;
WM_LBUTTONUP
放开鼠标左键时产生;
WM_RBUTTONDOWN
单击鼠标右键时产生;
WM_RBUTTONUP
放开鼠标右键时产生;
WM_LBUTTONDBLCLK
双击鼠标左键时产生;
WM_RBUTTONDBLCLK
双击鼠标右键时产生。

第28页:鼠标消息参数

1.4常用消息—鼠标消息lParam
低字节包含当前光标的X坐标值,高字节包含当前光标的Y坐标值。
wParam
包含一整数值以标识鼠标键的按下状态。

MK_LBUTTON按下鼠标左键MK_MBUTTON按下鼠标中键MK_RBUTTON按下鼠标右键

原文此处写作「1Param」,按标准写法应为「lParam」,已校正。

第29页:键盘消息WM_KEYDOWN

1.4常用消息—键盘消息WM_KEYDOWN
按下一个非系统键时产生的消息。

系统键是指实现系统操作的组合键,例如Alt与某个功能键组合以实现系统菜单操作等。

wParam
按下键的虚拟键码,用以标识按下或释放的键。
lParam
记录了按键的重复次数、扫描码、转移代码、先前键的状态等信息。

如F1的虚拟键码在Windows.h文件中定义为VK_F1,相似的消息还有WM_KEYUP,在放开非系统键时产生。

原文此处写作「1Param」,按标准写法应为「lParam」,已校正。

第30页:字符消息WM_CHAR

1.4常用消息—键盘消息WM_ CHAR按下一个非系统键时产生的消息。 wParam为按键的ASCII码。 lParam与WM_KEYDOWN的相同。

原文此处写作「1Param」,按标准写法应为「lParam」,已校正。

第31页:刷新消息WM_PAINT

  • 1.4常用消息—刷新消息WM_PAINT用户区移动或显示
  • 用户窗口改变大小
  • 程序通过滚动条滚动窗口
  • 下拉式菜单关闭并需要恢复被覆盖的部分
  • Windows清除对话框等对象并需要恢复被覆盖的部分,均产生WM_PAINT消息

第32页:WM_CREATE与WM_CLOSE

1.4常用消息—其他消息WM_CREATE由CreateWindow函数发出的消息。

wParam
未用。
lParam
包含一个指向CREATESTRUCT数据结构的指针。
WM_CLOSE
关闭窗口时产生的消息。

wParam和lParam均未用。

原文此处写作「1Param」,按标准写法应为「lParam」,已校正。

第33页:WM_DESTROY与WM_QUIT

1.4常用消息—其他消息WM_DESTROY由DestroyWindow函数发出的消息。 wParam和lParam均未用。 WM_QUIT由PostQuitMessage函数发出的消息,退出应用程序时发出的消息。

wParam
含退出代码,标识程序退出运行时的有关信息。
lParam
未用。

原文此处写作「1Param」,按标准写法应为「lParam」,已校正。

第34页:1.5 应用程序组成

1.5 Windows应用程序组成一个基本的Windows应用程序通常由三种类型的文件组成:(1) C/C++语言源程序文件;

  • 头文件;
  • 资源描述文件。

第35页:源程序组成结构

1.5 Windows应用程序组成源程序组成结构WinMain+WinProcWinMain:入口函数WndProc:窗口函数

第36页:WinMain函数功能

1.5 Windows应用程序组成---WinMain函数WinMain函数功能:(1)注册窗口类;

  • 建立窗口及执行必要的初始化;
  • 进入消息循环,根据接收的消息调用相应的处理过程,当消息循环检索到WM_QUIT时终止程序运行。

第37页:WinMain函数原型

1.5 Windows应用程序组成---WinMain函数WinMain函数说明

int WINAPI WinMain (HINSTANCE hThisInst,HINSTANCE hPrevInst,LPSTR lpszCmdLine,int nCmdShow);

第38页:窗口类定义

1.5 Windows应用程序组成---WinMain函数初始化---窗口类定义定义窗口的形式与功能,通过给窗口类数据结构WNDCLASS赋值完成,该数据结构中包含窗口类的各种属性。

第39页:WNDCLASS结构体(一)

1.5 Windows应用程序组成---WinMain函数

typedef struct tagWNDCLASS{ UINT style;//窗口函数函数的指针int cbClsExtra;//分配在窗口实例后的字节数HINSTANCE hInstance;//窗口类的图标

第40页:WNDCLASS结构体(二)

1.5 Windows应用程序组成---WinMain函数HCURSOR hCursor ;WNDCLASS;

第41页:LoadIcon函数

1.5 Windows应用程序组成---WinMain函数LoadIcon的作用是在应用程序中加载一个窗口图标。

其原型为:HICON LoadIcon(HINSTANCE hInstance, 

第42页:系统图标资源名

1.5 Windows应用程序组成---WinMain函数LPCTSTR

  • lpIconNameIDI_APPLICATION
  • IDI_ASTERISK
  • IDI_ERROR
  • IDI_EXCLAMATION
  • IDI_HAND
  • IDI_INFORMATION
  • IDI_QUESTION
  • IDI_WARNING
  • IDI_WINLOGO

第43页:LoadIcon调用示例

1.5 Windows应用程序组成---WinMain函数程序举例:HICON hIcon;

hIcon = LoadIcon(NULL, IDI_QUESTION);

第44页:LoadCursor函数

1.5 Windows应用程序组成---WinMain函数LoadCursor的作用是在应用程序中加载一个窗口光标。

其原型为:HCURSOR LoadCursor(HINSTANCE hInstance, 

第45页:系统光标资源名

1.5 Windows应用程序组成---WinMain函数LPCTSTR

  • lpCursorNameIDC_ARROW
  • IDC_CROSS
  • IDC_SIZEALL
  • IDC_SIZENESW
  • IDC_SIZENS
  • IDC_SIZENWSE
  • IDC_SIZEWE
  • IDC_UPARROW
  • IDC_WAIT

第46页:LoadCursor调用示例

1.5 Windows应用程序组成---WinMain函数程序举例:HCURSOR hCursor;

hCursor = LoadCursor(NULL,IDC_WAIT);

第47页:GetStockObject函数

1.5 Windows应用程序组成---WinMain函数应用程序调用函数GetStockObject获取系统提供的背景刷。

其原型为:HGDIOBJ GetStockObject(int fnObject 

第48页:库存背景刷类型

1.5 Windows应用程序组成---WinMain函数

HGDIOBJ GetStockObject(intfnObject); BLACK_BRUSH、DKGRAY_BRUSH、GRAY_BRUSH、HOLLOW_BRUSH、LTGRAY_BRUSH、NULL_BRUSH、WHITE_BRUSH

第49页:GetStockObject示例

1.5 Windows应用程序组成---WinMain函数程序举例:HBRUSH hBrush;

hBrush =(HBRUSH)GetStockObject( DKGRAY_BRUSH);

第50页:注册窗口类

1.5 Windows应用程序组成---WinMain函数初始化---注册窗口类Windows系统本身提供部分预定义的窗口类,程序员也可以自定义窗口类,窗口类必须先注册后使用。 窗口类的注册由函数RegisterClass()实现。

原文此处写作「Winows系统」,按标准写法应为「Windows系统」,已校正。

第51页:RegisterClass函数

1.5 Windows应用程序组成---WinMain函数RegisterClass函数返回布尔值,注册成功则返回真。

ATOM RegisterClass(CONST WNDCLASS *lpWndClass); 程序举例:WNDCLASS ws; ……//初始化代码RegisterClass(&ws); 

第52页:CreateWindow函数(一)

1.5 Windows应用程序组成---WinMain函数初始化----创建窗口实例创建一个窗口类的实例由函数CreateWindow()实现,函数原型如下

HWND CreateWindow( LPCTSTR lpszClassName,; 窗口类名LPCTSTR lpszTitle,; 窗口标题名DWORD dwStyle,; 创建窗口的样式int x, int y,; 窗口左上角坐标

第53页:CreateWindow函数(二)

1.5 Windows应用程序组成---WinMain函数int nWidth,int nHeight,; 窗口宽度和高度HWND hwndParent,; 该窗口的父窗口句柄HMENU hMenu,; 窗口主菜单句柄HINSTANCE hInstance,; 应用程序实例句柄LPVOID lpParam; 指向一个参数值的指针);

第54页:窗口样式dwStyle

1.5 Windows应用程序组成---WinMain函数DWORD dwStyle;

  • 创建窗口的样式WS_BORDER
  • WS_CAPTION
  • WS_VSCROLL
  • WS_MAXIMIZEBOX
  • WS_MAXIMIZE
  • WS_MINIMIZEBOX
  • WS_MINIMIZE
  • WS_OVERLAPPEDWINDOW
  • WS_POPUP
  • WS_POPUPWINDOW
  • WS_SYSMENU
  • WS_HSCROLL

第55页:显示窗口

1.5 Windows应用程序组成---WinMain函数显示窗口窗口类的显示由ShowWindow()和UpdateWindow()函数实现。 应用程序调用ShowWindow函数在屏幕上显示窗口,显示窗口后,应用程序调用UpdateWindow更新并绘制用户区,并发出WM_PAINT消息。

第56页:窗口显示与更新函数

1.5 Windows应用程序组成---WinMain函数

BOOL ShowWindow(HWND hWnd,BOOL UpdateWindow(HWND hWnd 

第57页:nCmdShow取值

1.5 Windows应用程序组成---WinMain函数int

  • nCmdShowSW_HIDE
  • SW_SHOWNORMAL
  • SW_SHOWMINIMIZE
  • SW_SHOWMAXMIZE
  • SW_SHOWNOACTIVE
  • SW_RESTORE

第58页:消息循环代码

1.5 Windows应用程序组成---消息循环MSG Msg;

…while (GetMessage (&Msg,NULL,0,0)){ TranslateMessage(&Msg);//分发消息}

第59页:窗口函数WndProc

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

第60页:WndProc函数原型

1.5 Windows应用程序组成---窗口函数LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)

原文此处写作「messgae」,按标准写法应为「message」,已校正。

第61页:WndProc处理示例

1.5 Windows应用程序组成---窗口函数

switch(message); message为标识的消息{ case WM_DESTROY:PostQuitMessage(0); default:return DefWindowProc (hwnd, message,wParam, lParam);

第62页:DefWindowProc函数

1.5 Windows应用程序组成---窗口函数DefWindowProc为未定义处理过程的消息提供默认的处理。 在消息处理程序段中一般都有对WM_DESTROY的处理,该消息是关闭窗口时发出的。 它向应用程序发出WM_QUIT消息,请求退出处理函数。

第63页:Windows数据类型(一)

Windows数据类型(一)

Windows常用数据类型(一)
说明数据类型
16位无符号整数WORD
32位有符号整数LONG
32位无符号整数DWORD
句柄HANDLE

1.5 Windows应用程序组成---数据类型在Windows.h中定义了Windows应用程序中包含的种类繁多的数据类型。说明数据类型16位无符号整数WORD32位有符号整数LONG32位无符号整数DWORD句柄HANDLE

第64页:Windows数据类型(二)

Windows数据类型(二)

Windows常用数据类型(二)
说明数据类型
32位无符号整数UINT
布尔值BOOL
指向字符串的32位指针LPTSTR
指向字符串常量的32位指针LPCTSTR

1.5 Windows应用程序组成---数据类型在Windows.h中定义了Windows应用程序中包含的种类繁多的数据类型。说明数据类型32位无符号整数UINT布尔值BOOL指向字符串的32位指针LPTSTR指向字符串常量的32位指针LPCTSTR

第65页:RECT结构体

1.5 Windows应用程序组成---数据结构

typedef struct tagRECT{ LONG left;//矩形框左上角Y坐标LONG right;//矩形框右下角Y坐标} RECT;