zoukankan      html  css  js  c++  java
  • Visual C++ 6.0使用教程

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

     

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

     

    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 ; 
  • 相关阅读:
    安全编码1
    VPP tips
    VPP概述汇总
    C语言安全编码摘录
    TCP-proxy
    Scipy Lecture Notes学习笔记(一)Getting started with Python for science 1.4. Matplotlib: plotting
    Scipy Lecture Notes学习笔记(一)Getting started with Python for science 1.3. NumPy: creating and manipulating numerical data
    Scipy Lecture Notes学习笔记(一)Getting started with Python for science 1.2. The Python language
    Scipy Lecture Notes学习笔记(一)Getting started with Python for science 1.1. Python scientific computing ecosystem
    25马5跑道,求最快的五匹马的需要比赛的次数
  • 原文地址:https://www.cnblogs.com/myall/p/3642493.html
Copyright © 2011-2022 走看看