Visual C++它大概可以分成三个主要的部分:
3. Platform SDK。这才是Visual C++和整个Visual Studio的精华和灵魂,虽然我们很少能直接接触到它。大致说来,Platform SDK是以Microsoft C/C++编译器为核心(不是Visual C++,看清楚了),配合MASM,辅以其他一些工具和文档资料。上面说到Developer Studio没有编译程序的功能,那么这项工作是由谁来完成的呢?是CL,是NMAKE,和其他许许多多命令行程序,这些我们看不到的程序才是构成Visual Studio的基石。
2. MFC。从理论上来讲,MFC也不是专用于Visual C++,Borland C++,C++Builder和Symantec C++同样可以处理MFC。同时,用Visual C++编写代码也并不意味着一定要用MFC,只要愿意,用Visual C++来编写SDK程序,或者使用STL,ATL,一样没有限制。不过,Visual C++本来就是为MFC打造的,Visual C++中的许多特征和语言扩展也是为MFC而设计的,所以用Visual C++而不用MFC就等于抛弃了Visual C++中很大的一部分功能。但是,Visual C++也不等于MFC。
1. Developer Studio,这是一个集成开发环境,我们日常工作的99%都是在它上面完成的,再加上它的标题赫然写着“Microsoft Visual C++”,所以很多人理所当然的认为,那就是Visual C++了。其实不然,虽然Developer Studio提供了一个很好的编辑器和很多Wizard,但实际上它没有任何编译和链接程序的功能,真正完成这些工作的幕后英雄后面会介绍。我们也知道,Developer Studio并不是专门用于VC的,它也同样用于VB,VJ,VID等Visual Studio家族的其他同胞兄弟。所以不要把Developer Studio当成Visual C++, 它充其量只是Visual C++的一个壳子而已。这一点请切记!
Visual C++6.0不仅是一个C++ 编译器,而且是一个基于Windows操作系统的可视化集成开发环境(integrated development environment,IDE)。Visual C++6.0由许多组件组成,包括编辑器、调试器以及程序向导AppWizard、类向导Class Wizard等开发工具。 这些组件通过一个名为Developer Studio的组件集成为和谐的开发环境。
Visual C++ 6.0,简称VC或者VC6.0,是微软推出的一款C++编译器,将“高级语言”翻译为“机器语言(低级语言)”的程序。Visual C++是一个功能强大的可视化软件开发工具。自1993年Microsoft公司推出Visual C++1.0后,随着其新版本的不断问世,Visual C++已成为专业程序员进行软件开发的首选工具。虽然微软公司推出了 Visual C++.NET(Visual C++7.0),但它的应用的很大的局限性,只适用于Windows 2000、Windows XP和Windows NT4.0。所以实际中,更多的是以Visual C++6.0为平台。
1.使用VC++6.0编译C语言文件(.c)
#include <stdio.h>
int main(int argc, char** argv)
{
printf("Hello World!");
getch();
return ;
}
![](https://images0.cnblogs.com/i/616541/201404/031109482507521.jpg)
![](https://images0.cnblogs.com/i/616541/201404/031109556568258.jpg)
![](https://images0.cnblogs.com/i/616541/201404/031110018128710.jpg)
![](https://images0.cnblogs.com/i/616541/201404/031110101872519.jpg)
2.使用VC++6.0创建MFC对话框程序
![](https://images0.cnblogs.com/i/616541/201404/031118580932342.jpg)
![](https://images0.cnblogs.com/i/616541/201404/031119045311008.jpg)
![](https://images0.cnblogs.com/i/616541/201404/031119110629644.jpg)
![](https://images0.cnblogs.com/i/616541/201404/031119177653699.jpg)
![](https://images0.cnblogs.com/i/616541/201404/031119231096564.jpg)
3.使用API创建Win32窗口简单讲解
int APIENTRY WinMain(HINSTANCE hInstance, // 本模块的实例句柄
HINSTANCE hPrevInstance, // Win16 留下的废物,现在已经不用了
LPSTR lpCmdLine, // 命令行参数
int nCmdShow) // 主窗口初始化时的显示方式
{ // 下面这行代码是我添加的,用于弹出一个小对话框
::MessageBox(NULL, "Hello, Win32 Application", "04Win32AppDemo", MB_OK);
return 0;
}
APIENTRY是__stdcall的宏定义,说明 WinMain 函数采用的是 Windows 标准调用方式。
hInstance 指定了当前模块的实例句柄。其实在 Win32 下,模块的实例句柄和模块句
柄是一样的,只是说法不同,所以可以通过以下语句获得当前可执行模块的实例句柄。
hInstance = ( HINSTANCE )GetModuleHandle(NULL); // 取得应用程序的实例句柄(即模块句柄)
GetModuleHandle 函数的惟一参数是模块的名称,函数会返回这个模块的句柄。模块句柄
的值就是该模块在内存中的首地址。如果为 GetModuleHandle 传递 NULL 的话,函数返回的
是可执行文件所在模块的模块句柄,而不管是在哪个模块中做这个调用的。
lpCmdLine 是命令行参数。其值由 CreateProcess 函数的第二个参数指定。通常应用程
序在初始化时检查这个参数,以决定是否打开特定文档。
nCmdShow 指定了窗口初始化时的显示方式。这个值也是由 CreateProcess 函数传递
的。一般以这个值为参数调用 ShowWindow 就可以了,此函数用于设置窗口的显示状态,
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
CALLBACK 宏是__stdcall 的意思,说明采用 Windows 标准方式传递参数。hWnd 参数标
识了消息到达的窗口;uMsg 参数是一个被命名的常量(消息 ID 号),它指定了所发的消息,
当窗口函数接受到消息时,它使用消息 ID 号来决定如何处理这个消息;wParam 和 lParam 是
消息的两个参数,其值取决于 uMsg。
// 窗口函数的函数原形
LRESULT CALLBACK MainWndProc(HWND, UINT, WPARAM, LPARAM);
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{ char szClassName[] = "MainWClass";
WNDCLASSEX wndclass;
// 用描述主窗口的参数填充 WNDCLASSEX 结构
wndclass.cbSize = sizeof(wndclass); // 结构的大小
wndclass.style = CS_HREDRAW|CS_VREDRAW; // 指定如果大小改变就重画
wndclass.lpfnWndProc = MainWndProc; // 窗口函数指针
wndclass.cbClsExtra = 0; // 没有额外的类内存
wndclass.cbWndExtra = 0; // 没有额外的窗口内存
wndclass.hInstance = hInstance; // 实例句柄
wndclass.hIcon = ::LoadIcon(NULL, IDI_APPLICATION); // 使用预定义图标
wndclass.hCursor = ::LoadCursor(NULL, IDC_ARROW); // 使用预定义的光标
wndclass.hbrBackground = (HBRUSH)::GetStockObject(WHITE_BRUSH); // 使用白色背景画刷
wndclass.lpszMenuName = NULL; // 不指定菜单
wndclass.lpszClassName = szClassName ; // 窗口类的名称
wndclass.hIconSm = NULL; // 没有类的小图标
// 注册这个窗口类
::RegisterClassEx(&wndclass);
// 创建主窗口
HWND hwnd = ::CreateWindowEx(
0, // dwExStyle,扩展样式
szClassName, // lpClassName,类名
"My first Window!", // lpWindowName,标题
WS_OVERLAPPEDWINDOW, // dwStyle,窗口风格
CW_USEDEFAULT, // X,初始 X 坐标
CW_USEDEFAULT, // Y,初始 Y 坐标
CW_USEDEFAULT, // nWidth,宽度
CW_USEDEFAULT, // nHeight,高度
NULL, // hWndParent,父窗口句柄
NULL, // hMenu,菜单句柄
hInstance, // hlnstance,程序实例句柄
NULL) ; // lpParam,用户数据
if(hwnd == NULL)
{ ::MessageBox(NULL, "创建窗口出错!", "error", MB_OK);
return -1;
}
// 显示窗口,刷新窗口客户区
::ShowWindow(hwnd, nCmdShow);
::UpdateWindow(hwnd);
// 从消息队列中取出消息,交给窗口函数处理,直到 GetMessage 返回 FALSE,结束消息循环
MSG msg;
while(::GetMessage(&msg, NULL, 0, 0))
{ // 转化键盘消息
::TranslateMessage(&msg);
// 将消息发送到相应的窗口函数
::DispatchMessage(&msg);
}
// 当 GetMessage 返回 FALSE 时程序结束
return msg.wParam;
}
LRESULT CALLBACK MainWndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{ char szText[] = "最简单的窗口程序!";
switch (message)
{
case WM_PAINT: // 窗口客户区需要重画
{ HDC hdc;
PAINTSTRUCT ps;
// 使无效的客户区变的有效,并取得设备环境句柄
hdc = ::BeginPaint (hwnd, &ps) ;
// 显示文字
::TextOut(hdc, 10, 10, szText, strlen(szText));
::EndPaint(hwnd, &ps);
return 0;
}
case WM_DESTROY: // 正在销毁窗口
// 向消息队列投递一个 WM_QUIT 消息,促使 GetMessage 函数返回 0,结束消息循环
::PostQuitMessage(0) ;
return 0 ;
}
// 将我们不处理的消息交给系统做默认处理
return ::DefWindowProc(hwnd, message, wParam, lParam);
}
分析以上程序,可以得出在桌面上显示一个窗口的具体步骤,这就是主程序的结构流程。
(1)注册窗口类(RegisterClassEx)
(2)创建窗口(CreateWindowEx)
(3)在桌面显示窗口(ShowWindow)
(4)更新窗口客户区(UpdateWindow)
(5)进入无限的消息获取和处理的循环。首先是获取消息(GetMessage),如果有消息到
达,则将消息分派到回调函数处理(DispatchMessage),如果消息是 WM_QUIT,则 GetMessage
函数返回 FALSE,整个消息循环结束。消息具体的处理过程是在 MainWndProc 函数中进行的。
1.注册窗口类
typedef struct _WNDCLASSEX {
UINT cbSize; // WNDCLASSEX 结构的大小
UINT style; // 从这个窗口类派生的窗口具有的风格
WNDPROC lpfnWndProc; // 即 window procedure, 窗口消息处理函数指针
int cbClsExtra; // 指定紧跟在窗口类结构后的附加字节数
int cbWndExtra; // 指定紧跟在窗口事例后的附加字节数
HANDLE hInstance; // 本模块的实例句柄
HICON hIcon; // 窗口左上角图标的句柄
HCURSOR hCursor; // 光标的句柄
HBRUSH hbrBackground; // 背景画刷的句柄
LPCTSTR lpszMenuName; // 菜单名
LPCTSTR lpszClassName; // 该窗口类的名称
HICON hIconSm; // 小图标句柄
} WNDCLASSEX;
2.创建窗口
HWND hwnd = ::CreateWindowEx(
0, // dwExStyle,扩展样式
szClassName, // lpClassName,类名
"My first Window!", // lpWindowName,标题
WS_OVERLAPPEDWINDOW, // dwStyle,窗口风格
CW_USEDEFAULT, // X,初始 X 坐标
CW_USEDEFAULT, // Y,初始 Y 坐标
CW_USEDEFAULT, // nWidth,宽度
CW_USEDEFAULT, // nHeight,高度
NULL, // hWndParent,父窗口句柄
NULL, // hMenu,菜单句柄
hInstance, // hlnstance,程序实例句柄
NULL) ; // lpParam,用户数据
下面列出了一些常见风格的定义,它们是以 WS(Windows Style 的缩写)为前缀的预定
义的值:
WS_BORDER 创建一个单边框的窗口
WS_CAPTION 创建一个有标题框的窗口(包括 WS_BODER 风格)
WS_CHIlD 创建一个子窗口。这个风格不能与 WS_POPVP 风格合用
WS_DISABLED 创建一个初始状态为禁止的子窗口。一个禁止状态的窗日不能接受来自用户
的输人信息
WS_DLGFRAME 创建一个带对话框边框风格的窗口。这种风格的窗口不能带标题条
WS_HSCROLL 创建一个有水平滚动条的窗口
WS_VSCROLL 创建一个有垂直滚动条的窗口
WS_ICONIC 创建一个初始状态为最小化状态的窗口。与 WS_MINIMIZE 风格相同
WS_MAXIMIZE 创建一个具有最大化按钮的窗口。该风格不能和 WS_EX_CONTEXTHELP 风
格同时出现,同时必须指定 WS_SYSMENU 风格
WS_OVERLAPPED 产生一个层叠的窗口。一个层叠的窗口有一个标题条和一个边框。与
WS_TILED 风格相同
WS_OVERLAPPEDWINDOW 创建一个具有 WS_OVERLAPPED,WS_CAPTION,
WS_SYSMENU ,WS_THICKFRAME,WS_MINIMIZEBOX,
WS_MAXMIZEBOX 风格的层叠窗口
WS_POPUP 创建一个弹出式窗口。该风格不能与 WS_CHLD 风格同时使用
WS_POPUPWINDOW 创建一个具有 WS_BORDER,WS_POPUP,WS_SYSMENU 风格的
窗口,WS_CAPTION 和 WS_POPUPWINDOW 必须同时设定才能
使窗口某单可见
WS_SIZEBOX 创建一个可调边框的窗口,与 WS_THICKFRAME 风格相同
WS_SYSMENU 创建一个在标题条上带有窗口菜单的窗口,必须同时设定
WS_CAPTION 风格
WS_THICKFRAME 创建一个具有可调边框的窗口,与 WS_SIZEBOX 风格相同
WS_VISIBLE 创建一个初始状态为可见的窗口
typedef struct tagMSG {
HWND hwnd; // 消息要发向的窗口句柄
UINT message; // 消息标识符,以 WM_ 开头的预定义值(意为 Window Message)
WPARAM wParam; // 消息的参数之一
LPARAM lParam; // 消息的参数之二
DWORD time; // 消息放入消息队列的时间
POINT pt; // 这是一个 POINT 数据结构,表示消息放入消息队列时的鼠标位置
} MSG, *PMSG ;
- Visual C++ 6.0精简绿色版下载及简单使用教程
Visual C++ 6.0精简绿色版下载及简单使用教程 Microsoft Visual C++简介 Visual Studio 是微软公司推出的开发环境,Visual Studio 可以用来创建 ...
- CC++初学者编程教程(2) Microsoft Visual C++ 6.0开发环境搭建
上一篇演示的是如何安装VS2010,本文演示的是如何安装Microsoft Visual C++ 6.0 简称VC6. 有同学经常VC6都是很古董的版本了,为啥他还存在,不得不说VC6是微软一个很经典 ...
- Xamarin For Visual Studio 3.0.54.0 完整离线破解版(C# 开发Android、IOS工具 吾乐吧软件站分享)
Xamarin For Visual Studio就是原本的Xamarin For Android 以及 Xamarin For iOS,最新版的已经把两个独立的插件合并为一个exe安装包了.为了区分 ...
- Asp.Net MVC4.0 官方教程 入门指南之五--控制器访问模型数据
Asp.Net MVC4.0 官方教程 入门指南之五--控制器访问模型数据 在这一节中,你将新创建一个新的 MoviesController类,并编写代码,实现获取影片数据和使用视图模板在浏览器中展现 ...
- Xamarin For Visual Studio 3.0.54.0 完整离线破解版
Xamarin For Visual Studio 3.0.54.0 完整离线破解版 Xamarin For Visual Studio就是原本的Xamarin For Android 以及 Xama ...
- Pycharm中安装package出现microsoft visual c++ 14.0 is required问题解决办法
在利用pycharm安装scrapy包是遇到了挺多的问题.在折腾了差不多折腾了两个小时之后总算是安装好了.期间各种谷歌和百度,发现所有的教程都是利用命令行窗口安装的.发现安装scrapy需要的包真是多 ...
- Visual Leak Detector简明使用教程
Visual Leak Detector是一款内存泄漏检测软件,主要的作用就是检测可能或者是存在内存泄露的地方,具体的功能的话,可以百度下,今天主要简单介绍下怎么使用 首先下载Visual Leak ...
- 微软Visual Studio Code 0.8.0发布,新增多种主题
月30日,Build 开发者大会上,正式宣布了 Visual Studio Code 项目;并将其定义为:一个运行于 Mac OS X.Windows和 Linux 之上的,针对于编写现代 Web 和 ...
- Microsoft Visual SourceSafe 6.0 无法关联项目
最近遇到Microsoft Visual SourceSafe 6.0 安装好以后, 无法关联项目,导致无法进行版本控制,研究以后,发现需要运行一个程序,在安装目录下 ..\Visual Source ...
随机推荐
- Linux系统MySQL开启远程连接
1.远程连接上Linux系统,确保Linux系统已经安装上了MySQL数据库.登陆数据库.mysql -uroot -p(密码). 2.创建用户用来远程连接 GRANT ALL PRIVILEGES ...
- Android ------ handler 异步处理消息
Handler基本概念: Handler主要用于异步消息的处理:当发出一个消息之后,首先进入一个消息队列,发送消息的函数即刻返回,而另外一个部分逐个的在消息队列中将消息取出,然后对消息进行出来,就是发 ...
- misc
1.对于给定的二维码图片不能直接扫描出来的可以进行反色在进行扫描,反色可以直接选中图片然后就会进行反色.2.局域网中抓取的数据包的加密方式可能是aes加密.3.凯撒加密可能是变种的凯撒加密,可能奇数偶 ...
- adapter.notifyDataSetChanged(); 没有反应
为什么是这样,以下是我总结的一些原因: 1.数据源没有更新,调用notifyDataSetChanged无效. 2.数据源更新了,但是它指向新的引用,调用notifyDataSetChanged无效. ...
- 开源的EtherCAT Master简介
EtherCAT的主站开发是基于EtherCAT机器人控制系统的开发中非常重要的环节.目前常见开源的主站代码为的RT-LAB开发的SOEM (Simple OpenSource EtherCAT Ma ...
- 离线安装eclipse的svn插件
原文:http://blog.sina.com.cn/s/blog_8e037f440101ebmz.html 连接不到外网情况下,在eclipse中安装svn插件. 两种方法: 首先下载安装到ecl ...
- iBatis简单介绍
1. Ibatis是开源软件组织Apache推出的一种轻量级的对象关系映射(ORM)框架,和Hibernate.Toplink等在java编程的对象持久化方面深受开发人员欢迎. 对象关系映 ...
- 【css3】--四种气泡
在聊天的场景中,聊天内容需要用到气泡修饰,如下图.下面一一讲解. 图片式: 第一个样式是京东客服,气泡的圆角和钩子都是用了图片.使用了一个table组合成了一个圆角的框框.lm样式拼出了钩子. < ...
- 简介Gulp, Grunt, Bower, 和 Npm 对Visual Studio的支持
[原文发表地址]Introducing Gulp, Grunt, Bower, and npm support for Visual Studio Web 开发,特别是前端 Web 开发,正迅速变得像 ...
- [ZigBee] 4、ZigBee基础实验——中断
前言 上一篇介绍了CC2530的IO的基础知识,并用LED的控制来展示如何配置并控制GPIO的输出,用KEY状态的读取实验来展示如何读取GPIO的状态.从上一节的KEY状态读取的代码看出是采用轮训方式 ...