admin 管理员组

文章数量: 887021


2024年2月24日发(作者:7种常量元素有哪些)

Visual Studio 2013

编程软件的使用详解

1

Visual Studio 2013 – dektop

Visual C++

可以在微软官方站点直接下载最新的express版本,注册并且免费使用

强大而灵活的 Visual C++ 语言和工具在 Visual Studio 允许在 .NET framework 上运行本机 Windows 应用商店 apps、本机桌面 apps 和托管 apps 的开发。 Visual C++

包含以下元素:

Visual Studio 开发环境

开发环境通过编写代码以支持整个开发工作流,从创建和管理的项目,调试,进行分析并部署到最终用户。

可视化工具 C++compiler

编译器支持本机代码以 .NET 公共语言运行时 (CLR) 的开发和开发。 Visual

C++ 直接支持 x86 计算机的生成,并包括面向 x64 和 ARM 的编译器。 它优化所有平台的性能。

C 运行库 (crt)

包括安全增强选择要了解所造成安全问题的函数。

标准 C++ 库

包含 (mfc) 库和标准模板库 (STL)。

活动模板库 (ATL)

传递给 COM 组件和 apps 的创建。

Microsoft 基础类 (MFC) 库选件

对的桌面 apps 创建具有传统或 Office 样式的用户界面。

并行模式库 (PPL)

对 CPU 执行的异步和并行算法。

C++ AMP (C++ 加速的大量并行)

对于大量在 GPU 执行的并行算法。

Windows 运行时 C++ 模板库 (WRL),

为 Windows 应用商店 apps 和元素的 COM 样式的开发。

.NET framework 选件类库 (通过使用 C++/CLI),STL/CLR 和 C++ 支持库

对托管 apps 的开发。

此外,在中,当使用 Visual C++ 时也可以访问 Windows 应用商店 apps 和桌面 apps

的 windows API。 标头文件和 .winmd 文件这些 API 的包含在 Visual Studio 中,在 Windows 软件开发包 (SDK)Windows 8的。

Visual Studio 2012 - Visual C++

Win32桌面应用程序(Visual C++)

可以创建 Win32 app,如果要在从 Windows 95 的 windows 版本使用基于 windows 的用户界面,并且可以运行到 Windows 8的本机桌面应用程序时。 可以使用 Visual

2

Studio Express 2012 for Windows Desktop 或任何除 Visual Studio Express 2012 for

Windows 8的 Visual Studio 版本。

Win32 应用程序 是使用消息循环处理 windows 消息直接而不是使用一种机制 (如

Microsoft 基础类 (MFC),活动模板库 (ATL) 或 .NET framework app 的约定术语。 虽然这个术语是“Win32”,它可以引用 32 位或 64 位应用程序。 在 C++ 的 Win32 应用程序可以使用 C 运行时 (crt) 和标准模板库 (STL) 选件类和函数,COM 对象和任何公共函数,公共称为 windows API。 有关 Win32 apps 介绍在 C++ 中,请参见 了解到窗口的程序在 C++。

Win32 应用程序是一种创建窗口的本机桌面应用程序;另一种方法是 MFC 应用程序。

MFC 是企业类型的阿普斯特殊的默认值选择阿普斯具有许多用户界面控件或自定义用户控件。 MFC 用于序列化、文本处理、打印和当今用户界面元素提供方便的帮助器类选件例如功能区上。 这些选件类对 Win32 应用程序不可用。 若要创建 MFC 或 ATL 程序需要 Microsoft Visual Studio Professional 2012 或更高版本。 Visual Studio

Express 2012 for Windows Desktop 不包括 MFC 或 ATL 支持。

创建标准C++程序

在 Visual Studio 集成开发环境 (IDE) 可以使用 Visual C++ 创建标准 C++ 程序。

通过采用此演练中的步骤,您可以创建一个项目,向该项目添加一个新文件,修改该文件以添加 C++ 代码,然后使用 Visual Studio 编译并运行程序。

您可以键入自己的 C++ 程序,或者使用示例程序之一。 此演练中的示例程序是一个控制台应用程序。 此应用程序使用标准模板库 (STL) 中的 set 容器。

Visual C++ 使用 2003 C++ 标准进行编译,但有以下几点主要例外之处:两阶段名称查找、异常规范和导出。 此外,Visual C++ 支持若干 C++0x 功能,例如,lambda、自动、static_assert、rvalue 引用和 extern 模板。

说明

如果要求符合标准,请使用 /Za 编译器选项来禁用对该标准的 Microsoft 扩展。

有关更多信息,请参见/Za、/Ze(禁用语言扩展)。

系统必备

若要完成本演练,您必须了解 C++ 语言的基础知识。

创建项目并添加源文件

1.

2.

3.

通过以下方式创建一个项目:指向“文件”菜单上的“新建”,然后单击“项目”。

在“Visual C++”项目类型窗格中,单击“Win32”,然后单击“Win32 控制台应用程序”。

键入项目名称。

3

默认情况下,包含项目的解决方案与项目同名,但您可以键入其他名称。 您也可以为项目键入其他位置。

单击“确定”创建项目。

4.

5.

6.

在“Win32 应用程序向导”中,单击“下一步”,选择“空项目”,然后单击“完成”。

如果未显示“解决方案资源管理器”,请在“视图”菜单上,单击“解决方案资源管理器”。

将一个新源文件添加到项目,如下所示。

a.

b.

在“解决方案资源管理器”中,右击“源文件”文件夹,指向“添加”,然后单击“新建项”。

在“代码”节点中单击“C++ 文件(.cpp)”,为文件键入名称,然后单击“添加”。

该 .cpp 文件即显示在“解决方案资源管理器”中的“源文件”文件夹中,并且文件将在 Visual Studio 编辑器中打开。

7. 在编辑器内的文件中,键入使用标准 C++ 库的有效 C++ 程序,或者复制示例程序之一并将其粘贴在文件中。

例如,您可以使用 set::find (STL Samples)示例程序,该程序是帮助中附带的标准模板库示例之一。

如果使用该示例程序,请注意 using namespace std; 指令。 此指令使程序能够使用 cout 和 endl,而无需完全限定名(std::cout 和 std::endl)。

8.

9.

保存该文件。

在“生成”菜单上,单击“生成解决方案”。

“输出”窗口显示有关编译过程的信息,例如,生成日志的位置,以及指示生成状态的消息。

10. 在“调试”菜单上,单击“开始执行(不调试)”。

如果使用了示例程序,将显示一个命令窗口,其中显示是否在集合中找到了特定的整数。

在命令行上编译本机C++程序

Visual C++ 包括一个 C++ 编译器,可用来创建从基本 Visual C++ 程序到 Windows 窗体应用程序和组件的各种程序。

通过按此演练的过程进行操作,您可以通过使用文本编辑器创建基本的 Visual C++ 程序,然后在命令行上对其进行编译。

也可以编译使用 Visual Studio 集成开发环境 (IDE) 创建的 Visual C++ 程序。 有关更多信息,请参见Walkthrough: Compiling a C++ Program that Targets the CLR in

Visual Studio。

您可以使用自己的 Visual C++ 程序,而不是键入下面步骤中所示的程序。 也可以使用其他帮助主题中的任何 Visual C++ 代码示例程序。

系统必备

4

若要完成本演练,您必须了解 C++ 语言的基础知识。

创建 Visual C++ 源文件并在命令行上对其进行编译

1. 打开“Visual Studio 2010 命令提示”窗口,方法是单击“开始”,指向“所有程序”、“Microsoft Visual Studio 2010”、“Visual Studio 工具”,然后单击“Visual Studio 2010 命令提示”。

可能需要管理员凭据才能成功编译此演练中的代码,具体情况视计算机的操作系统和配置而定。 若要以管理员身份运行“Visual Studio 2010 命令提示”窗口,请右击“Visual Studio 2010 命令提示”,然后单击“以管理员身份运行”。

2.

3.

复制代码

#include

int main()

{

std::cout << "This is a native C++ program." << std::endl;

return 0;

}

4.

5.

6.

在“文件”菜单上,单击“保存”。

这样就创建了一个 Visual C++ 源文件。

关闭记事本。

在命令提示符下,键入 cl /EHsc ,并按 Enter。 /EHsc 命令行选项指示编译器启用 C++ 异常处理。 有关更多信息,请参见/EH(异常处理模型)。

编译器将生成一个名为 的可执行程序。

您可以在编译器显示的多行输出信息中看到可执行程序的名称。

7. 若要查看目录中具有名称 basic 以及任何文件扩展名的文件的列表,请键入

dir basic.* 并按 Enter。

.obj 文件是一个中间格式文件,可以安全地忽略它。

8. 若要运行 程序,请键入 basic 并按 Enter。

该程序显示以下文本并退出:

This is a native C++ program.

9. 若要关闭“Visual Studio 2010 命令提示”窗口,请键入 exit 并按 Enter。

编译使用 .NET 类的 Visual C++ 程序

下面的步骤演示如何编译使用 .NET Framework 类的 Visual C++ 程序。

在命令提示符下,键入 notepad ,并按 Enter。

在系统提示是否创建文件时,单击“是”。

在记事本中,键入下列各行。

5

您必须使用 /clr(公共语言运行时编译)编译器选项,因为此程序使用 .NET 类并且必须包括必要的 .NET 库。 Visual C++ 编译器生成的 .exe 文件包含 MSIL 代码,而不是可由计算机执行的指令。

按照本过程中的步骤编译帮助主题中的任何 Visual C++ 示例程序。

在命令行上编译 Visual C++ .NET 控制台应用程序

1. 打开“Visual Studio 2010 命令提示”窗口,方法是单击“开始”,指向“所有程序”、“Microsoft Visual Studio 2010”、“Visual Studio 工具”,然后单击“Visual Studio 2010 命令提示”。

可能需要管理员凭据才能成功编译此演练中的代码,具体情况视计算机的操作系统和配置而定。 若要以管理员身份运行“Visual Studio 2010 命令提示”窗口,请右击“Visual Studio 2010 命令提示”,然后单击“以管理员身份运行”。

2.

3.

复制代码

int main()

{

System::Console::WriteLine("This is a Visual C++ program.");

}

4. 在“文件”菜单上,单击“保存”。

您已经创建了一个使用 .NET 类 (Console) 的 Visual C++ 源文件,该文件位于

System 命名空间。

5.

6.

7.

关闭记事本。

在命令提示符下,键入 cl /clr ,并按 Enter。 编译器将生成一个名为 的可执行程序。

若要查看目录中具有名称 basicclr 以及任何文件扩展名的文件的列表,请键入 dir basicclr.* 并按 Enter。

.obj 文件是一个中间格式文件,可以安全地忽略它。

.manifest 文件是包含有关程序集的信息的 XML 文件。 (程序集是 .NET 部署单元,例如 .exe 程序或 .dll 组件或库。)

8. 若要运行 程序,请键入 basicclr 并按 Enter。

该程序显示以下文本并退出:

This is a Visual C++ program.

9. 若要关闭“Visual Studio 2010 命令提示”窗口,请键入 exit 并按 Enter。

在Visual Studio中编译面向CLR的C++程序

通过使用 Visual Studio 开发环境,您可以创建使用 .NET 类的 Visual C++ 程序,并对它们进行编译。

6

在命令提示符下,键入 notepad ,并按 Enter。

在系统提示是否创建文件时,单击“是”。

在记事本中,键入下列各行。

在本过程中,您可以键入自己的 Visual C++ 程序,也可以使用示例程序之一。 本过程中使用的示例程序创建一个名为 的文本文件,并将其保存到项目目录中。

系统必备

这些主题假定您具备 C++ 语言的基础知识。

在 Visual Studio 中创建新项目并添加新的源文件

1.

2.

3.

创建新项目。 在“文件”菜单上,指向“新建”,然后单击“项目”。

在“Visual C++ 项目类型”中单击“CLR”,然后单击“CLR 空项目”。

键入项目名称。

默认情况下,包含项目的解决方案与新项目同名,当然,您也可以键入其他名称。

如果愿意,您可以为项目输入一个不同的位置。

单击“确定”创建新项目。

4.

5.

如果“解决方案资源管理器”不可见,请单击“视图”菜单上的“解决方案资源管理器”。

向该项目添加新的源文件:

在解决方案资源管理器中右击“源文件”文件夹,指向“添加”并单击“新建项...”。

单击“C++ 文件(.cpp)”,键入一个文件名,然后单击“添加”。

该 .cpp 文件即显示在“解决方案资源管理器”中的“源文件”文件夹中,并且,在键入要包含在该文件中的代码的位置,出现一个选项卡式窗口。

6. 在 Visual Studio 中,在新创建的选项卡中单击并键入有效的 Visual C++ 程序,或者复制并粘贴示例程序之一。

例如,您可以使用 如何:编写文本文件 (C++/CLI) 示例程序(位于“编程指南”中的“文件处理和 I/O”节点)。

如果要使用示例程序,通知您使用 gcnew关键字而不是 new,在创建 .NET 对象,并且,时 gcnew 返回句柄 (^) 而不是指针 (*):

StreamWriter^ sw = gcnew StreamWriter(fileName);

有关新 Visual C++ 语法的更多信息,请参见 适用于运行时平台的组件扩展。

7. 在“生成”菜单上,单击“生成解决方案”。

“输出”窗口显示有关编译过程的信息,如生成日志的位置,以及指示生成状态的消息。

如果进行了更改,并在未执行生成的情况下运行该程序,则对话框可能指示该项目已过期。 如果要让 Visual Studio 始终使用文件的当前版本,并且在每次生成应用程序时不发出提示,请在单击“确定”之前选中此对话框上的复选框。

8.

9.

在“调试”菜单上,单击“开始执行(不调试)”。

如果您使用的是示例程序,则在运行程序时将显示一个命令窗口,指示已创建了该文本文件。 按任意键,关闭该命令窗口。

文本文件现在位于您的项目目录中。 您可以使用记事本打开此文件。

7

说明

选择空 CLR 项目模板会自动设置 /clr 编译器选项。 若要验证这一点,请在“解决方案资源管理器”中右击该项目,再单击“属性”,然后选中“配置属性”的“常规”节点中的“公共语言运行时支持”选项。

编译C程序

Visual Studio 包括可用来创建从基本基本的 C 程序到 windows API 应用程序的 c.

编译器。

此演练演示如何使用文本编辑器创建一个基本的 C 程序,然后在命令行上对其进行编译。

您可以使用自己的 C 程序,而不是键入此演练中所示的示例程序。 也可以使用帮助主题中包含的任何 C 代码示例程序。

默认情况下,Visual C++ 编译器将以 .c 结尾的所有文件视为 C 源代码,将以 .cpp 结尾的所有文件视为 C++ 源代码。 若要强制编译器将所有文件视为 C(而不管文件扩展名如何),请使用 /Tc 编译器选项。

系统必备

您必须了解 C 语言的基础知识。

创建 C 源文件并在命令行上对其进行编译

1. 打开开发人员命令提示。 在 启动 屏幕的 windows 8,在中,选择 VS2012 开发人员命令提示 平铺。 在早期版本中,选择 启动 按钮,展开 所有程序、Microsoft Visual Studio 2012和 Visual Studio 工具,然后选择 VS2012 开发人员命令提示。

基于 windows 的版本在计算机和系统安全配置中,您可能必须打开 VS2012 开发人员命令提示 的快捷菜单中选择 以管理员身份运行 成功生成和运行按这些步骤创建的应用程序。

说明

VS2012 开发人员命令提示 自动设置 C 编译器和所需的任何库的正确路径。 应使用它而不是使用普通的“命令提示符”窗口。 有关更多信息,请参见为命令行生成设置路径和环境变量。

2. 在命令提示,请创建源文件的目录并使其成为当前工作目录。 例如,键入 md

c:simple 并按 enter 创建名为 Simple 的目录,然后键入 cd c:simple 并按

enter 更改到该目录。

在命令提示符处,键入 notepad 并按 enter。

在记事本中,输入以下行。

3.

4.

8

Visual C++

复制代码

#include

int main()

{

printf("This is a native C program.n");

return 0;

}

5. 在菜单栏上,依次选择 文件,保存 打开 另存为 对话框。 导航到已创建的内容。 在 文件名 框中,输入一个名称为源文件 (例如,simple.c 和中的 保存类型 然后在下拉列表中,选择 所有文件 (*.*)。 选择 保存 按钮创建 c. 源文件在您的工作目录。

关闭记事本。

在命令提示,请与您的源一起的名称指定 cl 命令文件 (例如,cl simple.c—并按 enter 生成程序。 编译器将生成将源文件的名称的可执行程序,但是,有一个 .exe 文件名扩展名 (例如,。

您可以在编译器显示的多行输出信息中看到可执行程序的名称。

Output

x86 copyright (c) Microsoft Corporation 的 Microsoft (r) C/C++ 编译器优化第 17.00.50727.1 版。 保留所有权利。 simple.c Microsoft (r) 增量链接器第 11.00.50727.1 版 copyright (c) Microsoft Corporation。 保留所有权利。 /out:

8.

9.

若要查看文件列表中工作目录中,键入 dir 并按 enter。

.obj 文件是可忽略的中间格式文件。

若要运行程序,键入其名称,不带文件扩展名 (例如,simple—并按 enter。

程序显示此文本然后退出:

This is a native C program.

10. 若要关闭命令提示符窗口,键入 exit 并按 enter。

创建Win32应用程序

本演练演示如何创建基于 Win32 的简单基本应用程序,该应用程序在窗口中显示“Hello, World!”。 您可以使用在此演练中开发的代码作为创建其他基于 Win32 的应用程序的模式。

Win32 API(也称为 Windows API)是用于创建 Windows 应用程序的基于 C 的框架。 有关 Win32 API 的更多信息,请参见 Windows API。

重要事项

为了可以更加清楚地说明本文档内各步骤中的特定代码段,我们可能会省略一个有9

6.

7.

效应用程序所必需的某些代码语句,例如 include 指令和全局变量声明。 本文档末尾的示例一节显示了完整代码。

系统必备

若要完成本演练,您必须了解 C++ 语言的基础知识。

有关视频演示,请参见 Visual Studio 2008 文档中的 Video How to: Creating Win32

Applications (C++)(视频帮助:创建 Win32 应用程序 (C++))。

创建基于 Win32 的项目

1.

2.

在“文件”菜单上,单击“新建”,然后单击“项目”。

在“新建项目”对话框的左侧窗格中,单击“已安装的模板”,单击“Visual

C++”,然后选择“Win32”。 在中间窗格中,选择“Win32 项目”。

在“名称”框中,键入项目名称,例如 win32app。 单击“确定”。

3.

4.

5.

在“Win32 应用程序向导”的“欢迎”页上,单击“下一步”。

在“应用程序设置”页上的在“应用程序类型”下,选择“Windows 应用程序”。 在“附加选项”下,选择“空项目”。 单击“完成”创建项目。

在“解决方案资源管理器”中,右击 Win32app 项目,单击“添加”,然后单击“新建项”。 在“添加新项”对话框中选择“C++ 文件(.cpp)”。 在“名称”框中,键入文件名称,例如 GT_。 单击“添加”。

启动基于 Win32 的应用程序

1. 就像每个 C 应用程序和 C++ 应用程序都以 main 函数作为起点那样,每个基于 Win32 的应用程序同样必须要有 WinMain 函数。 WinMain 具有以下语法。

复制代码

int WINAPI WinMain(HINSTANCE hInstance,

HINSTANCE hPrevInstance,

LPSTR lpCmdLine,

int nCmdShow);

有关此函数的参数和返回值的信息,请参见 WinMain 函数。

2.

复制代码

#include

#include

#include

#include

10

由于应用程序代码必须使用现有定义,因此应将 include 语句添加到文件中。

3. 除 WinMain 函数外,每个基于 Win32 的应用程序还必须具有一个窗口过程函数。 此函数通常名为 WndProc。 WndProc 具有以下语法。

复制代码

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

此函数处理应用程序从操作系统接收的许多消息。 例如,在具有对话框(该对话框中有一个“确定”按钮)的应用程序中,如果用户单击该按钮,操作系统就会向该应用程序发送一条消息,告知已单击该按钮。 WndProc 负责响应该事件。 在此示例中,相应的响应可能是关闭该对话框。

有关更多信息,请参见窗口过程。

向 WinMain 函数添加功能

1. 在 WinMain 函数中,创建 WNDCLASSEX 类型的窗口类结构。 此结构包含有关该窗口的信息,例如,应用程序图标、窗口的背景色、要在标题栏中显示的名称、窗口过程函数的名称等等。 下面的示例演示一个典型 WNDCLASSEX 结构。

复制代码

WNDCLASSEX wcex;

= sizeof(WNDCLASSEX);

= CS_HREDRAW | CS_VREDRAW;

dProc = WndProc;

xtra = 0;

xtra = 0;

nce = hInstance;

= LoadIcon(hInstance,

MAKEINTRESOURCE(IDI_APPLICATION));

r = LoadCursor(NULL, IDC_ARROW);

kground = (HBRUSH)(COLOR_WINDOW+1);

nuName = NULL;

assName = szWindowClass;

m = LoadIcon(nce,

MAKEINTRESOURCE(IDI_APPLICATION));

有关此结构的各字段的信息,请参见 WNDCLASSEX。

2. 现在您已经创建一个窗口类,接下来必须将其注册。 使用 RegisterClassEx 函数,并将窗口类结构作为参数进行传递。

复制代码

11

if (!RegisterClassEx(&wcex))

{

MessageBox(NULL,

_T("Call to RegisterClassEx failed!"),

_T("Win32 Guided Tour"),

NULL);

return 1;

}

3.

复制代码

static TCHAR szWindowClass[] = _T("win32app");

static TCHAR szTitle[] = _T("Win32 Guided Tour Application");

// The parameters to CreateWindow explained:

// szWindowClass: the name of the application

// szTitle: the text that appears in the title bar

// WS_OVERLAPPEDWINDOW: the type of window to create

// CW_USEDEFAULT, CW_USEDEFAULT: initial position (x, y)

// 500, 100: initial size (width, length)

// NULL: the parent of this window

// NULL: this application does not have a menu bar

// hInstance: the first parameter from WinMain

// NULL: not used in this application

HWND hWnd = CreateWindow(

szWindowClass,

szTitle,

WS_OVERLAPPEDWINDOW,

CW_USEDEFAULT, CW_USEDEFAULT,

500, 100,

NULL,

NULL,

hInstance,

NULL

);

if (!hWnd)

{

MessageBox(NULL,

_T("Call to CreateWindow failed!"),

_T("Win32 Guided Tour"),

NULL);

现在可以创建一个窗口。 使用 CreateWindow 函数。

12

return 1;

}

此函数返回 HWND,它是某个窗口的句柄。 有关更多信息,请参见 Windows 数据类型。

4.

复制代码

// The parameters to ShowWindow explained:

// hWnd: the value returned from CreateWindow

// nCmdShow: the fourth parameter from WinMain

ShowWindow(hWnd,

nCmdShow);

UpdateWindow(hWnd);

此时,所显示的窗口不会有太多内容,因为您尚未实现 WndProc 函数。

5. 现在添加一个消息循环以侦听操作系统发送的消息。 如果应用程序收到一条消息,则此循环会将该消息调度至 WndProc 函数以接受处理。 消息循环类似于下列代码。

复制代码

MSG msg;

while (GetMessage(&msg, NULL, 0, 0))

{

TranslateMessage(&msg);

DispatchMessage(&msg);

}

return (int) ;

有关消息循环中各结构和函数的更多信息,请参见 MSG、GetMessage、TranslateMessage 和 DispatchMessage。

此时,WinMain 函数应与下列代码类似。

复制代码

int WINAPI WinMain(HINSTANCE hInstance,

HINSTANCE hPrevInstance,

LPSTR lpCmdLine,

int nCmdShow)

{

13

现在,使用下列代码来显示窗口。

WNDCLASSEX wcex;

= sizeof(WNDCLASSEX);

= CS_HREDRAW | CS_VREDRAW;

dProc = WndProc;

xtra = 0;

xtra = 0;

nce = hInstance;

= LoadIcon(hInstance,

MAKEINTRESOURCE(IDI_APPLICATION));

r = LoadCursor(NULL, IDC_ARROW);

kground = (HBRUSH)(COLOR_WINDOW+1);

nuName = NULL;

assName = szWindowClass;

m = LoadIcon(nce,

MAKEINTRESOURCE(IDI_APPLICATION));

if (!RegisterClassEx(&wcex))

{

MessageBox(NULL,

_T("Call to RegisterClassEx failed!"),

_T("Win32 Guided Tour"),

NULL);

return 1;

}

hInst = hInstance; // Store instance handle in our global variable

// The parameters to CreateWindow explained:

// szWindowClass: the name of the application

// szTitle: the text that appears in the title bar

// WS_OVERLAPPEDWINDOW: the type of window to create

// CW_USEDEFAULT, CW_USEDEFAULT: initial position (x, y)

// 500, 100: initial size (width, length)

// NULL: the parent of this window

// NULL: this application dows not have a menu bar

// hInstance: the first parameter from WinMain

// NULL: not used in this application

HWND hWnd = CreateWindow(

szWindowClass,

szTitle,

WS_OVERLAPPEDWINDOW,

CW_USEDEFAULT, CW_USEDEFAULT,

14

500, 100,

NULL,

NULL,

hInstance,

NULL

);

if (!hWnd)

{

MessageBox(NULL,

_T("Call to CreateWindow failed!"),

_T("Win32 Guided Tour"),

NULL);

return 1;

}

// The parameters to ShowWindow explained:

// hWnd: the value returned from CreateWindow

// nCmdShow: the fourth parameter from WinMain

ShowWindow(hWnd,

nCmdShow);

UpdateWindow(hWnd);

// Main message loop:

MSG msg;

while (GetMessage(&msg, NULL, 0, 0))

{

TranslateMessage(&msg);

DispatchMessage(&msg);

}

return (int) ;

}

向 WndProc 函数添加功能

1. 若要启用 WndProc 函数来处理应用程序所收到的消息,请实现 switch 语句。

要处理的第一条消息是 WM_PAINT 消息。 如果必须更新所显示的应用程序窗口的一部分,该应用程序就会收到此消息。 (首次显示该窗口时,必须将其全部更新。)

若要处理 WM_PAINT 消息,请首先调用 BeginPaint,然后处理用于布局该窗口中的文本、按钮和其他控件的所有逻辑,再调用 EndPaint。 对于此应用程序,开始调用和结束调用之间的逻辑会在窗口中显示字符串“Hello, World!”。 在下列代码中,请注意 TextOut 函数用于显示该字符串。

15

复制代码

PAINTSTRUCT ps;

HDC hdc;

TCHAR greeting[] = _T("Hello, World!");

switch (message)

{

case WM_PAINT:

hdc = BeginPaint(hWnd, &ps);

// Here your application is laid out.

// For this introduction, we just print out "Hello, World!"

// in the top left corner.

TextOut(hdc,

5, 5,

greeting, _tcslen(greeting));

// End application-specific layout section.

EndPaint(hWnd, &ps);

break;

}

2. 应用程序通常会处理许多其他消息,例如 WM_CREATE 和 WM_DESTROY。 下列代码展示了一个基本但完整的 WndProc 函数。

复制代码

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM

lParam)

{

PAINTSTRUCT ps;

HDC hdc;

TCHAR greeting[] = _T("Hello, World!");

switch (message)

{

case WM_PAINT:

hdc = BeginPaint(hWnd, &ps);

// Here your application is laid out.

// For this introduction, we just print out "Hello, World!"

// in the top left corner.

16

TextOut(hdc,

5, 5,

greeting, _tcslen(greeting));

// End application specific layout section.

EndPaint(hWnd, &ps);

break;

case WM_DESTROY:

PostQuitMessage(0);

break;

default:

return DefWindowProc(hWnd, message, wParam, lParam);

break;

}

return 0;

}

示例

生成此示例

1.

2.

3.

4.

创建本演练中之前“创建基于 Win32 的项目”中的基于 Win32 的项目。

复制这些步骤之后的代码,然后将其粘贴到 GT_ 源文件中。

在“生成”菜单上,单击“生成解决方案”。

若要运行该应用程序,请按 F5。 包含文本“hello world”!的窗口应显示在显示的左上角。

代码

复制代码

// GT_

// compile with: /D_UNICODE /DUNICODE /DWIN32 /D_WINDOWS /c

#include

#include

#include

#include

// Global variables

// The main window class name.

static TCHAR szWindowClass[] = _T("win32app");

17

// The string that appears in the application's title bar.

static TCHAR szTitle[] = _T("Win32 Guided Tour Application");

HINSTANCE hInst;

// Forward declarations of functions included in this code module:

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

int WINAPI WinMain(HINSTANCE hInstance,

HINSTANCE hPrevInstance,

LPSTR lpCmdLine,

int nCmdShow)

{

WNDCLASSEX wcex;

= sizeof(WNDCLASSEX);

= CS_HREDRAW | CS_VREDRAW;

dProc = WndProc;

xtra = 0;

xtra = 0;

nce = hInstance;

= LoadIcon(hInstance,

MAKEINTRESOURCE(IDI_APPLICATION));

r = LoadCursor(NULL, IDC_ARROW);

kground = (HBRUSH)(COLOR_WINDOW+1);

nuName = NULL;

assName = szWindowClass;

m = LoadIcon(nce,

MAKEINTRESOURCE(IDI_APPLICATION));

if (!RegisterClassEx(&wcex))

{

MessageBox(NULL,

_T("Call to RegisterClassEx failed!"),

_T("Win32 Guided Tour"),

NULL);

return 1;

}

hInst = hInstance; // Store instance handle in our global variable

// The parameters to CreateWindow explained:

// szWindowClass: the name of the application

18

// szTitle: the text that appears in the title bar

// WS_OVERLAPPEDWINDOW: the type of window to create

// CW_USEDEFAULT, CW_USEDEFAULT: initial position (x, y)

// 500, 100: initial size (width, length)

// NULL: the parent of this window

// NULL: this application does not have a menu bar

// hInstance: the first parameter from WinMain

// NULL: not used in this application

HWND hWnd = CreateWindow(

szWindowClass,

szTitle,

WS_OVERLAPPEDWINDOW,

CW_USEDEFAULT, CW_USEDEFAULT,

500, 100,

NULL,

NULL,

hInstance,

NULL

);

if (!hWnd)

{

MessageBox(NULL,

_T("Call to CreateWindow failed!"),

_T("Win32 Guided Tour"),

NULL);

return 1;

}

// The parameters to ShowWindow explained:

// hWnd: the value returned from CreateWindow

// nCmdShow: the fourth parameter from WinMain

ShowWindow(hWnd,

nCmdShow);

UpdateWindow(hWnd);

// Main message loop:

MSG msg;

while (GetMessage(&msg, NULL, 0, 0))

{

TranslateMessage(&msg);

DispatchMessage(&msg);

}

19

return (int) ;

}

//

// FUNCTION: WndProc(HWND, UINT, WPARAM, LPARAM)

//

// PURPOSE: Processes messages for the main window.

//

// WM_PAINT - Paint the main window

// WM_DESTROY - post a quit message and return

//

//

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)

{

PAINTSTRUCT ps;

HDC hdc;

TCHAR greeting[] = _T("Hello, World!");

switch (message)

{

case WM_PAINT:

hdc = BeginPaint(hWnd, &ps);

// Here your application is laid out.

// For this introduction, we just print out "Hello, World!"

// in the top left corner.

TextOut(hdc,

5, 5,

greeting, _tcslen(greeting));

// End application-specific layout section.

EndPaint(hWnd, &ps);

break;

case WM_DESTROY:

PostQuitMessage(0);

break;

default:

return DefWindowProc(hWnd, message, wParam, lParam);

break;

}

return 0;

}

20

创建MFC应用程序

1.

2.

3.

按照帮助主题用 Visual C++ 应用程序向导创建项目中的说明进行操作。

在“新建项目”对话框中,选择“模板”窗格中的“MFC 应用程序”打开向导。

使用 MFC 应用程序向导定义应用程序设置。

说明

跳过此步骤可保留向导的默认设置。

4. 单击“完成”关闭向导并在开发环境中打开新项目。

创建项目后,可在解决方案资源管理器中查看创建的文件。 有关向导为项目创建的文件的更多信息,请参见项目生成的文件 。 有关文件类型的更多信息,请参见为 Visual C++ 项目创建的文件类型。

创建动态链接库 (DLL) 项目

1.

2.

3.

4.

5.

6.

7.

在菜单栏上,选择“文件”,“新建、“项目”。

在 新建项目 对话框的左侧窗格中,展开 已安装,模板,Visual C++,然后选择 win32。

在中间窗格中,选择 Win32 控制台应用程序。

为项目指定名称 (例如,MathFuncsDll 在 名称 框。 指定名称解决方案 (如

DynamicLibrary,在 解决方案名称 框。 选择“确定”按钮。

在 Win32 应用程序向导 对话框的 概述 页上,选择 下一个 按钮。

在 应用程序设置 页上,在 应用程序类型下,选择 dll。

选择 完成 按钮创建项目。

向动态链接库添加类

1. 若要创建新选件类的一个标头文件,在菜单栏上,选择 项目,添加新项。 在 添加新项 对话框中,在左窗格中,单击 Visual C++下,选择 代码。 在中间窗格中,选择 头文件 (.h)。 为标头指定名称 (此文件,MathFuncsDll.h 然后选择 添加 按钮。 空白标头文件显示。

将以下代码添加到标头文件的开头:

Visual C++

复制代码

// MathFuncsDll.h

#ifdef MATHFUNCSDLL_EXPORTS

#define MATHFUNCSDLL_API __declspec(dllexport)

#else

2.

21

#define MATHFUNCSDLL_API __declspec(dllimport)

#endif

3. 添加一个名为" MyMathFuncs "的基本选件类执行常见的算术运算 (如加、减、乘和除。 代码应类似于:

Visual C++

复制代码

namespace MathFuncs

{

// This class is exported from the

class MyMathFuncs

{

public:

// Returns a + b

static MATHFUNCSDLL_API double Add(double a, double b);

// Returns a - b

static MATHFUNCSDLL_API double Subtract(double a, double b);

// Returns a * b

static MATHFUNCSDLL_API double Multiply(double a, double b);

// Returns a / b

// Throws const std::invalid_argument& if b is 0

static MATHFUNCSDLL_API double Divide(double a, double b);

};

}

当 MATHFUNCSDLL_EXPORTS 定义了该符号,MATHFUNCSDLL_API 符号将在成员函数声明的 __declspec(dllexport) 修饰符此代码。 此修饰符使函数由 DLL 导出,以供其他应用程序。 当 MATHFUNCSDLL_EXPORTS 未定义时,MATHFUNCSDLL_API 定义了成员函数声明的 __declspec(dllimport) 修饰符。 此修饰符使编译器优化导入函数从 DLL 用于其他应用程序。 默认情况下,那么,当您的 MathFuncsDll 生成项目时,MATHFUNCSDLL_EXPORTS 定义。 有关更多信息,请参见dllexport,

dllimport。

说明

如果生成命令行上的 DLL 项目,请使用 /D 编译器选项定义

MATHFUNCSDLL_EXPORTS 符号。

4. 在 解决方案资源管理器的 MathFuncsDll 项目,在 源文件 文件夹中,打开

22

5. 在源文件中实现 MyMathFuncs 的功能。 代码应类似于:

Visual C++

复制代码

// : Defines the exported functions for the DLL application.

//

#include "stdafx.h"

#include "MathFuncsDll.h"

#include

using namespace std;

namespace MathFuncs

{

double MyMathFuncs::Add(double a, double b)

{

return a + b;

}

double MyMathFuncs::Subtract(double a, double b)

{

return a - b;

}

double MyMathFuncs::Multiply(double a, double b)

{

return a * b;

}

double MyMathFuncs::Divide(double a, double b)

{

if (b == 0)

{

throw invalid_argument("b cannot be zero!");

}

return a / b;

}

}

23

6. 通过选择 生成生成动态链接库,在菜单栏上的 生成解决方案。

说明

如果您使用不显示一个 生成 菜单上,在菜单栏上的一个学习版,选择 工具,设置,专家设置 启用它,然后选择 生成,生成解决方案。

说明

如果生成在令行生成项目,请使用 /LD 编译器选项指定输出文件是 DLL。 有关更多信息,请参见/MD、/MT、/LD(使用运行库)。 使用 /EHsc 编译器选项可启用 C++ 异常处理。 有关更多信息,请参见/EH(异常处理模型)。

创建引用 DLL 的应用程序

1.

2.

3.

4.

若要创建将引用,并使用 DLL 在菜单栏上,创建的 c. c++ app,选择 文件,新建,项目。

在左窗格中,单击 Visual C++下,选择 win32。

在中间窗格中,选择 Win32 控制台应用程序。

为项目指定名称 (例如," MyExecRefsDll 在 名称 框。 在 解决方案旁边,选择 添加到解决方案 从下拉列表。 这将新项目添加到包含 DLL 的解决方案。 选择“确定”按钮。

在 Win32 应用程序向导 对话框的 概述 页上,选择 下一个 按钮。

在 应用程序设置 页上,在 应用程序类型下,选择 控制台应用程序。

在 应用程序设置 页上,在 其他选项下,清除 预编译头 复选框。

选择 完成 按钮创建项目。

5.

6.

7.

8.

使用从选件类库功能。app

1.

2.

在创建一个控件个应用程序后,空程序创建您的。 名称为源文件是否与您先前选择的名称。 在本示例中,名为“”。

若要使用在该应用程序在 DLL 创建的算术例程,则必须引用它。 为此,请选择 MyExecRefsDll 项目在 解决方案资源管理器,然后在菜单栏上,选择 项目,引用。 在 属性页 对话框中,展开 通用属性 节点,选择" 框架和引用,然后选择 添加新引用 按钮。 有关“引用”对话框的更多信息,请参见“ 属性页”对话框 ->“通用属性”->“框架和引用”。

添加引用 对话框中可以引用的库。 它们包含的 项目 选项卡列出了当前解决方案中的项目和所有库。 在 项目 选项,请在 MathFuncsDll 旁边的复选框,然后选择 确定 按钮。

若要引用 DLL 的标头文件,必须修改包含的目录路径。 为此,请在 属性页 对话框中,展开 配置属性 节点,展开 C/C++ 节点,然后选择 常规。 在 附加包含目录旁边,请指定 MathFuncsDll.h 标头文件位置的路径。 您可以使用一个相对路径 (例如,。 MathFuncsDll—然后选择 确定 按钮。

现在即可在此应用程序中使用 MyMathFuncs 类。 使用以下代码替换24

3.

4.

5.

“”的内容:

Visual C++

复制代码

//

// compile with: /EHsc /link

#include

#include "MathFuncsDll.h"

using namespace std;

int main()

{

double a = 7.4;

int b = 99;

cout << "a + b = " <<

MathFuncs::MyMathFuncs::Add(a, b) << endl;

cout << "a - b = " <<

MathFuncs::MyMathFuncs::Subtract(a, b) << endl;

cout << "a * b = " <<

MathFuncs::MyMathFuncs::Multiply(a, b) << endl;

cout << "a / b = " <<

MathFuncs::MyMathFuncs::Divide(a, b) << endl;

try

{

cout << "a / 0 = " <<

MathFuncs::MyMathFuncs::Divide(a, 0) << endl;

}

catch (const invalid_argument &e)

{

cout << "Caught exception: " << () << endl;

}

return 0;

}

6. 通过选择 生成生成可执行文件,在菜单栏上 生成解决方案。

25

运行应用程序

1.

2.

3.

确保选择" MyExecRefsDll "作为默认值项。 在 解决方案资源管理器,选择"

MyExecRefsDll,然后在菜单栏上,选择 项目,设为启动项目。

若要运行项目,在菜单栏上,选择 调试,开始执行 (不调试)。 输出应该与下面的内容类似:

+ b = 106.4 a 到 b = -91.6 * 732.6 = a b/b = 0.0747475 捕获异常:b 不能为零!

后续步骤

创建类库

1.

2.

3.

在“文件”菜单上单击“新建”,再单击“项目”。

此时将出现“新建项目”对话框。

在左侧的“已安装的模板”部分中,单击“Visual C++”节点。 在可用模板的列表中,单击“类库”图标。

在“名称”框中为应用程序键入唯一的名称。

说明

也可以在“新建项目”对话框中指定其他项目和解决方案设置。

4.

单击“确定”。

26


本文标签: 项目 使用 创建 应用程序 程序