Download presentation
Presentation is loading. Please wait.
1
第2章 Windows编程基础
2
2.1.1 简单的Windows应用程序 简单的Windows应用程序。 [例Ex_HelloMsg] 一个最简单的Windows应用程序
(1) 运行Microsoft Visual C++ 6.0后,选择“文件”“新建”菜 单命令,打开应用程序向导,显示出“新建”对话框。
3
2.1.1 简单的Windows应用程序 (2)在工程名称框中键入Win32应用程序项目名称elloMsg。 (3)单击[确定]按钮继续。
(4)再次选择“文件”“新建”菜单命令,显示出“新建”对话框。 “新建”对话框文件页面
4
2.1.1 简单的Windows应用程序 (6)在文档窗口中输入下面的代码: #include <windows.h>
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance ,LPSTR lpCmdLine, int nCmdShow) { MessageBox (NULL, "你好,我的Visual C++世界!", "问候", 0) ; return 0 ; }
5
2.1.1 简单的Windows应用程序 编译并运行程序从上面的程序可以看出: WinMain函数的原型如下:
int WINAPI WinMain ( HINSTANCE hInstance, // 当前实例句柄 HINSTANCE hPrevInstance, // 以前的实例句柄 LPSTR lpCmdLine, // 指向命令行参数的指针 int nCmdS // 窗口的显示状态 每一个Win32应用程序都需要Windows.h头文件,包含了一些Windows头文件。 程序中,MessageBox是一个Win32 PI(ApplicationProgramming Interface, 应用程序接口)函数,用来弹出一个对话框窗口,显示短信息。
6
2.1.1 简单的Windows应用程序 [例Ex_HelloWin] 一个较完成的Windows应用程序
(1) 按照Ex_HelloMsg示例方法,创建一个An empty project类型的Win32 Application(Win32 应用程序)项目Ex_HelloWin。 (2)选择“文件”“新建”菜单命令,显示出“新建”对话框。单击“文件”标签,在左边的列表框中选择C++ Source File项,在右边的“文件”框中键入Ex_HelloWin.cpp,单击[确定]按钮。 (3)在文档窗口中输入代码: Ex_HelloMsg示例相比,Ex_HelloWin要复杂的多,可以将其分是两个基本函数的程序结构。 函数WndProc用来接收和处理各种不同的消息,而WinMain函数通常要完成以下几步工作: 定义并调用API函数RegisterClass注册应用程序的窗口类。
7
2.1.1 简单的Windows应用程序 函数CreateWindow用来创建已注册窗口类的窗口。CreateWindow函数具有下列原型:
HWND CreateWindow( LPCTSTR lpClassName, // 已注册的窗口类名 LPCTSTR lpWindowName, // 窗口标题 DWORD dwStyle, // 窗口风格 int x, // 窗口的水平位置 int y, // 窗口的垂直位置 int nWidth, // 窗口宽度 int nHeight, // 窗口高度 HWND hWndParent, // 父窗口句柄 HMENU hMenu, // 菜单句柄或控件标识 HINSTANCE hInstance, // 应用程序实例句柄 LPVOID lpParam // 其他窗口创建时的参数数据
8
2.1.1 简单的Windows应用程序 API函数GetMessage 和DispatchMessage就是起到这样的作用。
如果接收到WM_QUIT消息,则退出应用程序。 (4) 编译运行程序,窗口中单击鼠标左键,会弹出对话框。
9
简单的Windows应用程序 Windows应用程序的基本流程:
10
2.1.2 Windows编程特点 完整的Windows应用程序除了WinMain函数外,包含用于处理用户动作和窗口消息的窗口函数。
消息驱动机制 图形设备接口(GDI) 基于资源的程序设计 动态链接库 1. 消息驱动机制 Windows程序和控制台应用程序之间一个最根本区别,在于控制台应用程序是通过调用系统函数来获得用户输入,而Windows程序则是通过系统发送的消息来处理用户输入。 Windows操作环境中,无论是系统产生的动作或用户运行应用程序产生的动作,称为事件(Events)产生的消息(Message)。
11
2.1.2 Windows编程特点 KERNEL32.DLL用来处理存储器低层功能、任务和资源管理等Windows核心服务;
2. 图形设备接口(GDI) 而Windows则提供了一个抽象的接口,称为图形设备接口,使得用户直接利用系统的GDI函数就能方便实现图形和文本的输出。 基于资源的程序设计 Windows应用程序包含众多图形元素,如光标、菜单、工具栏、位图、对话框等。 4. 动态链接库 在Windows操作系统中,最主要的DLL有KERNEL32.DLL、GDI32.DLL和USER32.DLL。 KERNEL32.DLL用来处理存储器低层功能、任务和资源管理等Windows核心服务; GDI32.DLL提供图形设备接口,管理用户界面和图形绘制,包括Windows元文件、位图、设备描述表和字体等; USER32.DLL负责窗口的管理,包括消息、菜单、光标、计时器及其它与控制窗口显示相关的一些功能。
12
2.1.3 Windows基本数据类型 Windows常用的基本数据类型 : Windows所 数据类型 对应的基本数据类型 说明 BOOL
布尔值 BSTR unsigned short * 32位字符指针 BYTE unsigned char 8位无符号整数 COLORREF unsigned long 用作颜色值的32位值 DWORD 32位无符号整数,段地址和相关的偏移地址 LONG long 32位带符号整数 LPARAM 作为参数传递给窗口过程或回调函数的32位值 LPCSTR const char * 指向字符串常量的32位指针 LPSTR char * 指向字符串的32位指针 LPVOID void * 指向未定义类型的32位指针 LRESULT 来自窗口过程或回调函数的32位返回值 UINT unsigned int 32位无符号整数 WORD unsigned short 16位无符号整数 WPARAM 当作参数传递给窗口过程或回调函数的32位值
13
Windows基本数据类型 HINSTANCE和LPSTR等,这样的数据类型只是一些基本数据类型的别名,在Windows编程中常用的基本数据类型。 需要说明的是: 这些基本数据类型都是用大写字符来表示,以与一般C++基本数据类型相区别。 凡是数据类型的前缀是P或LP,则表示该类型是一个指针或长指针数据类型。若前缀是U,则表示无符号数据类型,等等。 Windows还提供一些宏来处理上述基本数据类型。例如,LOBYTE和HIBYTE分别用来获取16位数值中的低位和高位字节;LOWORD和HIWORD分别用来获取32位数值中的低位字和高位字;MAKEWORD是将两个16位无符号值结合成一个32位无符号值,等等。
14
2.2.1 绘制文本 Windows窗口通常有标题栏和边框,其中默认背景色为白色区域称为窗口的客户区。 [例Ex_WinText] 文本绘制
(1)新建一个“An empty project”类型的Win32 pplication(Win32 应用程序)项目Ex_WinText。 (2)新建一个C++源文件(Source File)Ex_WinText.cpp。 (3)编译并运行程序, Ex_WinText运行结果:
15
2.2.1 绘制文本 hdc定义的是句柄HDC变量,TextOut等GDI函数都要通过这样的HDC句柄来绘制图形和文本。
绘制文本 hdc定义的是句柄HDC变量,TextOut等GDI函数都要通过这样的HDC句柄来绘制图形和文本。 EndPaint用来释放设备描述表句柄,并使先前无效区域变为有效,使Windows不再发送M_PAINT消息。 PAINTSTRUCT是“绘图信息结构”,BeginPaint和EndPaint函数都需要PAINTSTRUCT结构变量作为自己的参数。 TextOut函数是用来显示文本的最常用的GDI函数,有下列原型: BOOL TextOut( HDC hdc, // 设备描述表句柄 int nXStart, // 文本显示的水平起始位置 int nYStart, // 文本显示的垂直起始位置 LPCTSTR lpString, // 要显示的文本 int cbString // 要显示的文本长度
16
2.2.2 使用控件 在Win32应用程序中,可在窗口基础上通过CreateWindow函 数来创建一个控件窗口。
使用控件 在Win32应用程序中,可在窗口基础上通过CreateWindow函 数来创建一个控件窗口。 例Ex_WinControl] 控件的使用 (1) 新建一个“An empty project”类型的Win32 ApplicationWin32 应用程序)项目Ex_WinControl。 (2) 新建一个C++源文件(Source File) _WinControl.cpp,并输入代码 (3) 编译并运行程序,填入一元二次方程的系数后,单击[计算]按钮,求解的结果就会显示出来,
17
2.3.1 MFC概述 微软公司为应用程序设计者提供了Win16 API,在此基础
上推出了Windows GUIMFC类的基本层次结构如图 : CCmdTarget CWnd CDocument CFrameWnd CObject CWinTread CWinApp CView CDialog及控件 CMDIChildWnd CMDIFrameWnd CMiniFrameWnd
18
2.2.3 设计一个MFC程序 例Ex_HelloMFC] 一个MFC应用程序。
(1) 创建一个“An empty project”类型的Win32 Application(Win32 应用程序)项目Ex_HelloMFC。 (2) 选择“文件”“新建”菜单命令,显示出“新建”对话框。单击“文件”标签,在左边的文件类型列。 (3) 表框中选择C++ Source File项,在右边的“文件”下的编辑框中键入Ex_HelloMFC.cpp,单击[确定]按钮。在文档窗口中输入代码 。 (4) 选择“工程”“设置”菜单命令,在出现的对话框中选择“General”标签。然后在“Microsoft Foundation Classes”组合框中,选择“Use MFC in a Shared DLL”。单击[OK]按钮。 (5) 程序运行后,单击鼠标左键,就会弹出一个对话框,结果同Ex_HelloWin。
19
理解程序代码 1. 程序运行机制 MFC是使用afxwin.h来代替头文件windows.h,在Ex_HelloMFC程序中却看不到Windows应用程序所必须的程序入口函数inMain。 自动查找该应用程序类CHelloApp的全局变量eApp,然后自动调用CHelloApp的虚函数InitInstance,该函数会进一步调用相应的函数来完成主窗口的构造和显示工作。 首先执行的是: m_pMainWnd = new CMainFrame(); 然后执行后面两 句,用作窗口的显示和更新。 m_pMainWnd->ShowWindow(m_nCmdShow); m_pMainWnd->UpdateWindow(); 最后返回TRUE,表示窗口创建成功。
20
2.3.3 理解程序代码 映射一个消息的过程是由三个部分组成的:
(1) 在处理消息的类中,使用消息宏LARE_MESSAGE_MAP() 声明对消息映射的支持,并在该宏之前声明消息处理函数。 (2) 使用BEGIN_MESSAGE_MAP和END_MESSAGE_MAP 宏在类声明之后的地方定义该类支持的消息映射入口点,所 有消息映射宏都添加在这里,当然不同的消息MFC都会有不 同的消息映射宏。 (3) 定义消息处理函数。例如: void CMainFrame::OnLButtonDown(UINT nFlags, CPoint point) { MessageBox ("你好,我的Visual C++世界!", "问候", 0) ; CFrameWnd::OnLButtonDown(nFlags, point); }
21
2.3.4 使用MFC AppWizard 表2.2 MFC AppWizard创建的应用程序类型 名 称 项 目
名 称 项 目 ATL COM MFC AppWizard 创建ATL(Active Template Library)应用模块工程 Cluster Resource Type Wizard 创建Cluster Resource(用于Windows NT服务器) Custom MFC AppWizard 创建自己的应用程序向导 Database Project 创建数据库应用程序 DevStudio Add-in Wizard 创建ActiveX组件或VBScript宏 Extended Stored Proc Wizard 创建基于SQL服务器下的外部存储过程 ISAPI Extension Wizard 创建Internet Server程序 MakeFile 创建独立于Visual C++开发环境的应用程序 MFC ActiveX ControlWizard 创建ActiveX Control应用程序 MFC AppWizard(dll) MFC的动态链接库 MFC AppWizard(exe) 一般MFC的Windows应用程序 Utility Project 创建简单实用的应用程序 Win32 Application 其他Win32的Windows应用程序 Win32 Console Application Win32的控制台应用程序 Win32 Dynamic-Link Library Win32的动态链接库 Win32 Static Library Win32的静态链接库
22
2.3.4 使用MFC AppWizard [例Ex_SDIDemo] 创建一个默认的单文档应用程序 1.开始
选择“文件”“新建”菜单,在弹出的“新建”对话框中选择“工程”标签,这时显示出一系列的应用程序项目类型; 2 .选择程序类型 (1) 从应用程序类型单个文档(Single Document,简称SDI)、 多重文档(Multiple Document ,简称MDI)和基本对话框(Dia log Based,基于对话框的应用程序)中选择“单个文档”。 (2) 决定应用程序中是否需要MFC的文档视图(“文档/查看体 系结构支持”)结构的支持。
23
2.3.4 使用MFC AppWizard (3) 选择资源所使用的语言 3. 简单创建
保留其他的默认选项,单击[完成]按钮出现一个对话框,显示 出用户在步骤中作出的选择,单击[确定]按钮系统开始创建。 4. 编译并运行 到这里为止,用户虽然没有编写任何程序代码,但MFC AppW izard已经根据用户的选择内容自动生成基本的应用程序框架。 单击编译工具条 上的运行工具按钮 ”或按快捷键Ctrl+F5,系统开始编连并运行生成的单文档应用程序可执行文件Ex_SDIDemo.exe
24
习 题 (1) 分别编写一个Win32 API应用程序和一个Win32 MFC应用程序,给定一元二次方程的系数,然后将求
习 题 (1) 分别编写一个Win32 API应用程序和一个Win32 MFC应用程序,给定一元二次方程的系数,然后将求 解的结果用消息对话框显示出来。 (2) 编写一个Win32 API应用程序,在主窗口中创建 一个编辑框和一个按钮,单击按钮后,将编辑框的内 容用消息对话框显示出来。 (3) 用MFC AppWizard创建一个单文档应用程序,看 看该文档应用程序组成的类,并说明各类的基类,然 后简要说明各类的作用。 (4) 上机练习本章的示例。
Similar presentations