页数:65页文件大小:416.8 KB来源: VisualC++ppt课件
本课件对应课程第1章Windows编程基础,先说明课程性质与学时安排,再从面向对象与Windows API切入,依次讲清窗口、句柄、事件驱动、消息与匈牙利命名法等基本概念,随后展开消息队列与消息循环的实现细节,最后完整剖析由入口函数WinMain与窗口函数WndProc构成的应用程序结构,适合作为Windows程序设计的入门基础材料。
课程基本情况课程名称:Visual C++语言课程性质:专业选修课(限选)学时学分:3学分48(含上机16)学时主讲教师开课院系:
1.1 Windows程序设计Windows的程序设计语言VC,VB,VJ都是“面向对象”的程序设计语言。
1.1 Windows程序设计对象特征具有规范形态和操作模式,编写Windows程序相当一部分工作是在创建对象和为对象属性赋值。 编程方法传统编写法--> API交互式方法--> MFC
1.1 Windows程序设计Windows API=系统函数+数据结构Windows API是Windows系统与Windows应用程序间的标准程序接口,Windows应用程序可以利用大量的标准API函数调用系统功能。
1.2 Windows编程基本概念
本页源文件仅提取到标题或少量文字,详细内容请对照本页图示。
1.2 Windows编程基本概念----窗口
1.2 Windows编程基本概念窗口是系统管理应用程序的基本单位,是应用程序与用户之间交互的接口环境,是Windows应用程序基本的操作单元。 编写一个Windows应用程序首先应创建窗口,随后应用程序的运行过程即是窗口与系统之间进行数据处理与数据交换的过程。
1.2 Windows编程基本概念----句柄句柄是一个4字节长的数值,用于标识应用程序中不同的对象和同类对象中不同的实例。 应用程序通过句柄访问相应的对象信息。
常用句柄类型
| 句柄说明 | 句柄类型 |
|---|---|
| 设备环境句柄 | HDC |
| 窗口句柄 | HWND |
| 光标句柄 | HCURSOR |
| 位图句柄 | HBITMAP |
| 字体句柄 | HFONT |
| 图标句柄 | HICON |
| 画笔句柄 | HPEN |
| 菜单句柄 | HMENU |
| 画刷句柄 | HBRUSH |
| 文件句柄 | HFILE |
| 实例句柄 | HINSTANCE |
1.2Windows编程基本概念----句柄设备环境句柄HDC窗口句柄HWND光标句柄HCURSOR位图句柄HBITMAP字体句柄HFONT图标句柄HICON画笔句柄HPEN菜单句柄HMENU画刷句柄HBRUSH文件句柄HFILE实例句柄HINSTANCE
1.2 Windows编程基本概念----消息消息是描述事件发生的信息(如按下鼠标或键盘),Windows程序设计是针对事件或消息的处理进行。
1.2 Windows编程基本概念----消息Windows应用程序利用Windows消息(Message)与应用程序及系统进行信息交换。
消息类型前缀
| 消息类别 | 前缀符号 |
|---|---|
| 按钮控件消息 | BM |
| 编辑控件消息 | EM |
| 组合框控件消息 | CB |
| 滚动条控件消息 | SBM |
| 列表框控件消息 | LB |
| 窗口消息 | WM |
1.2 Windows编程基本概念----消息Windows消息的类型前缀符号用于消息宏识别消息附属的分类按钮控件消息DM按钮控件消息BM编辑控件消息EM组合框控件消息CB滚动条控件消息SBM列表框控件消息LB窗口消息WM
原文首行作「按钮控件消息DM」,与后一行「按钮控件消息BM」重复,此处按常见Windows消息前缀归类列出,DM疑为对话框消息,建议对照原图核对。
匈牙利命名法
| 类型 | 前缀字符 |
|---|---|
| 字符 char | ch |
| 布尔值 BOOL | b |
| 整数 int | n(l) |
1.2 Windows编程基本概念----匈牙利命名法小写字母做为变量名前缀说明类型,其余部分描述变量意义与功能说明类型前缀字符charch布尔值BOOLb整数intn(l)
匈牙利命名法(续)
| 类型 | 前缀字符 |
|---|---|
| 16位无符号整数 WORD | w |
| 32位无符号数 DWORD | dw |
| 指向字符串的32位指针 LPTSTR | lpsz |
| 窗口对象的句柄 Handle | h |
1.2Windows编程基本概念----匈牙利命名法说明类型前缀16位无符号整数WORDw32位无符号数DWORDdw指向字符串的32位指针LPTSTRlpsz窗口对象的句柄Handleh
1.3 Windows的消息循环1、Windows系统为应用程序保持一个消息队列。
1.3 Windows的消息循环MSG msg;
//定义消息名while (GetMessage (&msg, NULL, 0, 0)){ TranslateMessage (&msg) ;//分发消息}1.3 Windows的消息循环----MSG结构体
typedef struct tagMSG{ HWND hwnd; UINT message; WPARAM wParam; LPARAM lParam; DWORD time; POINT pt; } MSG, *PMSG;1.3 Windows的消息循环----POINT结构体定义
typedef struct tagPOINT{ LONG x; LONG y; } POINT;1.3 Windows的消息循环----MSG结构体hwnd:消息将要发送到的那个窗口的句柄,用这个参数可以决定让哪个窗口接收消息。
每种消息类型都在windows.h文件进行了预定义。
1.3 Windows的消息循环----MSG结构体time:消息放入消息队列中的时间,在这个域中写入的并非当时日期,而是从Windows启动后所测量的时间值。 Windows用这个域来使消息保持正确的顺序。
1.3 Windows的消息循环----GetMessage
BOOL GetMessage(LPMSG lpMsg,HWND hWnd,UINT wMsgFilterMin,UINT wMsgFilterMax);1.3 Windows的消息循环----GetMessagelpMsg:指定要接收消息的MSG结构的地址;
第三、四参数用于指定消息范围。 GetMessage收到一个WM_QUIT消息,则返回FALSE以退出消息循环,终止程序运行。 否则GetMessage()返回TRUE。
1.3 Windows的消息循环----TranslateMessageGetMessage()读入消息后,首先要经过函数TranslateMessage()对其进行解释,但对大多数消息来说并不起什么作用。 TranslateMessage()负责将消息的虚拟键转换为字符消息。
1.3 Windows的消息循环----DispatchMessageDispatchMessage()函数,把GetMessage获取的Windows消息传送给在MSG结构中为窗口所指定的窗口过程。 在消息处理函数处理完消息之后,代码又循环到开始去接收另一个消息,这样就完成了一个完整的消息循环。
MK_LBUTTON按下鼠标左键MK_MBUTTON按下鼠标中键MK_RBUTTON按下鼠标右键
原文此处写作「1Param」,按标准写法应为「lParam」,已校正。
系统键是指实现系统操作的组合键,例如Alt与某个功能键组合以实现系统菜单操作等。
如F1的虚拟键码在Windows.h文件中定义为VK_F1,相似的消息还有WM_KEYUP,在放开非系统键时产生。
原文此处写作「1Param」,按标准写法应为「lParam」,已校正。
1.4常用消息—键盘消息WM_ CHAR按下一个非系统键时产生的消息。 wParam为按键的ASCII码。 lParam与WM_KEYDOWN的相同。
原文此处写作「1Param」,按标准写法应为「lParam」,已校正。
1.4常用消息—其他消息WM_CREATE由CreateWindow函数发出的消息。
wParam和lParam均未用。
原文此处写作「1Param」,按标准写法应为「lParam」,已校正。
1.4常用消息—其他消息WM_DESTROY由DestroyWindow函数发出的消息。 wParam和lParam均未用。 WM_QUIT由PostQuitMessage函数发出的消息,退出应用程序时发出的消息。
原文此处写作「1Param」,按标准写法应为「lParam」,已校正。
1.5 Windows应用程序组成一个基本的Windows应用程序通常由三种类型的文件组成:(1) C/C++语言源程序文件;
1.5 Windows应用程序组成源程序组成结构WinMain+WinProcWinMain:入口函数WndProc:窗口函数
1.5 Windows应用程序组成---WinMain函数WinMain函数功能:(1)注册窗口类;
1.5 Windows应用程序组成---WinMain函数WinMain函数说明
int WINAPI WinMain (HINSTANCE hThisInst,HINSTANCE hPrevInst,LPSTR lpszCmdLine,int nCmdShow);1.5 Windows应用程序组成---WinMain函数初始化---窗口类定义定义窗口的形式与功能,通过给窗口类数据结构WNDCLASS赋值完成,该数据结构中包含窗口类的各种属性。
1.5 Windows应用程序组成---WinMain函数
typedef struct tagWNDCLASS{ UINT style;//窗口函数函数的指针int cbClsExtra;//分配在窗口实例后的字节数HINSTANCE hInstance;//窗口类的图标1.5 Windows应用程序组成---WinMain函数HCURSOR hCursor ;WNDCLASS;
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;
下载地址:{{downurl}}
{{{a}}}
{{#b}}{{{b}}}
{{/b}} {{/title}} {{#nolog}}登陆注册
{{/nolog}} {{#djsx}}点我刷新
{{/djsx}} {{#gocz}} {{/gocz}} {{#ffqr}} {{/ffqr}}