首页 技术 正文
技术 2022年11月9日
0 收藏 402 点赞 3,853 浏览 7345 个字

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 ;
}

Visual C++ 6.0使用教程

Visual C++ 6.0使用教程

Visual C++ 6.0使用教程

Visual C++ 6.0使用教程

2.使用VC++6.0创建MFC对话框程序

Visual C++ 6.0使用教程

Visual C++ 6.0使用教程

Visual C++ 6.0使用教程

Visual C++ 6.0使用教程

Visual C++ 6.0使用教程

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 ; 

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,488
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,903
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,736
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,487
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:8,127
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:5,289