C++ 窗体程序初步(全网最全)

这篇具有很好参考价值的文章主要介绍了C++ 窗体程序初步(全网最全)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


官方入门文档:[Create a traditional Windows Desktop application (C++)](https://docs.microsoft.com/en-us/cpp/windows/walkthrough-creating-windows-desktop-applications-cpp#:~:text=From the main menu%2C choose,Desktop Wizard then choose Next.)


IDE的选择
  1. 窗体程序的开发我会推荐大家使用微软旗下的Microsoft Visual Studio
  2. 打开网页后下拉到最下方,选择对应版本就可以直接下载
    • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LN78QTeB-1660453573869)(https://f.pz.al/pzal/2022/08/14/2faeac26253ef.gif)]
  3. 下载后双击运行,选择如下图的所需配置项(没有python需求的可以不勾选python,对窗体程序开发并没有影响)
    • C++ 窗体程序初步(全网最全)
  4. 然后点击下载并安装
    • C++ 窗体程序初步(全网最全)
  5. 接着就可以使用Visual Studio了

创建项目
  1. 点击Create a new project
    • C++ 窗体程序初步(全网最全)
  2. 选择语言、终端、应用层,之后选择桌面窗口引导程序
    • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rL30XNYV-1660453573872)(https://f.pz.al/pzal/2022/08/14/8059401279784.png)]
  3. 接着点击下一步,填写项目名称以及选择项目保存路径
    • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mDol3NIk-1660453573874)(https://f.pz.al/pzal/2022/08/14/f0a6d9f1f427d.png)]
  4. 点击Create即可创建成功

开发记录

程序主入口(WinMain()
  1. 首先,窗体程序和C++程序都会有一个程序入口,在C++程序中主入口如==code1-1,在窗体程序中主入口如code1-2==

    1.  int main()
       {
           // Your Own Code
       }
      
    2.  int WinMain()
       {
           // Your Own Code
       }
      
  2. 其次,在窗体程序中同样需要引入头文件,但与C++程序不同!!并且不需要定义命名空间!,C++程序头部如==code2-1,窗体程序头部如’code2-2’==

    1.  #include <iostream>
       using namespace std;
      
    2.  #include <windows.h>
       #include <tchar.h> // 有时候需要,有时候可以不用
      
      • 关于是否需要使用<tchar.h>模块,具体请看官方文档
  3. 在窗体程序中==WinMain()==也是一种函数封装

    • 官方给出的封装原型如下:

    •   int WINAPI WinMain(
           _In_ HINSTANCE hInstance,
           _In_opt_ HINSTANCE hPrevInstance,
           _In_ LPSTR     lpCmdLine,
           _In_ int       nCmdShow
        );
      
    • 那么在源文件中可以直接写成如下形式:

    •   int WINAPI WinMain(HINSTANCE hInstance,
                           HINSTANCE hPrevInstance,
                           LPSTR lpCmdLine,
                           int nCmdShow) {
            // 各种配置项写在这里
        }
      
  4. 对于==WinMain()==的配置项如下:

    • 写法:

    •   WNDCLASSEX wcex;
        
        wcex.cbSize         = sizeof(WNDCLASSEX);
        wcex.style          = CS_HREDRAW | CS_VREDRAW;
        wcex.lpfnWndProc    = WndProc;
        wcex.cbClsExtra     = 0;
        wcex.cbWndExtra     = 0;
        wcex.hInstance      = hInstance;
        wcex.hIcon          = LoadIcon(wcex.hInstance, IDI_APPLICATION);
        wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);
        wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
        wcex.lpszMenuName   = NULL;
        wcex.lpszClassName  = L"test";
        wcex.hIconSm        = LoadIcon(wcex.hInstance, IDI_APPLICATION);
      
    • 其中有些需要特别注意:

    •   wcex.lpfnWndProc    = WndProc;
      
    • 向wcex.lpfnWndProc赋的值须与LRESULT CALLBACK定义的函数名相同

    •   wcex.cbClsExtra     = 0;
        wcex.cbWndExtra     = 0;
      
    • 句柄和窗体的额外内存,一般都默认为0

    •   wcex.hIcon          = LoadIcon(wcex.hInstance, IDI_APPLICATION);
        wcex.hIconSm        = LoadIcon(wcex.hInstance, IDI_APPLICATION);
      
    • 窗口的Icon图标,如果没有,可以将IDI_APPLICATION替换为NULL,同时也可以使用已有的 .ico文件,其他系统图标参见官方文档

    •   wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);
      
    • 当光标进入程序窗口后鼠标的样式可参照官方文档

    •   wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
      
    • 背景样式及颜色也可以更改,参考官方文档

    •   wcex.lpszClassName  = _T("test");
      
    • 这个是窗体的类名,格式即为_T"类名",并且此类名会在创建窗体的时候用到

  5. 在这之后呢我们还需要进行判断,判断窗体程序是否注册窗体成功

    • 代码如下:

    •   if (!RegisterClassEx(&wcex))
            {
                MessageBox(NULL,
                    _T("Call to RegisterClassEx failed!"),
                    _T("Hello World!"),
                    NULL);
        
                return 1;
            }
      
    • 这一段一定要加上,否则窗体无法显示!

  6. 接下来我们还需要把窗体句柄写入全局变量中

    • 代码如下:

    •   hInst = hInstance;
      
    • 但是一定要在全局变量中定义hInst这个变量名!

  7. 接下来我们需要创建窗体

    1. 可以使用一个函数对窗体句柄进行创建

      •   HWND hWnd = CreateWindow(_T("test"),
                                   _T("Hello Wold!"),
                                   WS_OVERLAPPEDWINDOW,
                                   CW_USEDEFAULT,
                                   CW_USEDEFAULT,
                                   500,
                                   500,
                                   NULL,
                                   NULL,
                                   hInstance,
                                   NULL);
        
      • 具体的功能可以参考官方文档

      • 使用Visual Studio开发的小伙伴其实可以直接在IDE里面就能够知道每个位置对应什么功能

    2. 窗体的配置已经OK了,但同样还需要进行判断是否创建成功

      • 代码如下:

      •   if (!hWnd)
              {
                  MessageBox(NULL,
                      _T("Call to CreateWindow failed!"),
                      _T("Windows Desktop Guided Tour"),
                      NULL);
          
                  return 1;
              }
        
      • 这一段其实可以不写,但为了后期维护方便检查是否为窗体创建失败还是挺有用的

    3. 窗体现在是创建好了,但是需要展示出来,所以就有了以下的代码

      •   ShowWindow(hWnd, nCmdShow);
          UpdateWindow(hWnd);
        
      • 这一段就这样写就行,详情移步至官方文档

    4. 而后呢,我们需要接受、翻译、执行窗体发送回来的Message

      • 代码如下:

      •   MSG msg;
          while (GetMessage(&msg, NULL, 0, 0))
          {
             TranslateMessage(&msg);
             DispatchMessage(&msg);
          }
          
          return (int) msg.wParam;
        
      • 了解更多有关Message的知识,就看看官方文档过过眼就行

窗体创建过渡(WinProc()
  1. 在窗体构建完成之前也会有一个过程,这是毋庸置疑的,官方也对此给出了一个函数封装,使用方法与==``WinMain()`==类似,

    • 封装原型:

    •   LRESULT CALLBACK WndProc(
           _In_ HWND   hWnd,
           _In_ UINT   message,
           _In_ WPARAM wParam,
           _In_ LPARAM lParam
        );
      
    • 使用写法:

    •   LRESULT CALLBACK WndProc(HWND hWnd,
                                 UINT message,
                                 WPARAM wParam,
                                 LPARAM lParam) {
            // 窗体内容及功能
        }
      
  2. 接下来我们就来实现一个简单的功能

    • 我们希望在窗体左上角显示Hello, Windows desktop!,那么接下来我们就需要在WinProc函数中调用WM_PAINT指令

    • 并将上面那段话显示出来

    • 代码如下:

    •   PAINTSTRUCT ps;
            HDC hdc;
            TCHAR greeting[] = _T("Hello, Windows desktop!");
        
            switch (message)
            {
            case WM_PAINT:
                hdc = BeginPaint(hWnd, &ps);
        
                // Here your application is laid out.
                // For this introduction, we just print out "Hello, Windows desktop!"
                // in the top left corner.
                TextOut(hdc,
                    5, 100,
                    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;
      
  3. WinProc函数写好之后我们还得在WinMain函数前进行调用

    • 代码如下:

    •   LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
      
代码展示
  1. 代码到目前就写完了

    1. 所有代码:

      •   #include <windows.h>
          #include <stdlib.h>
          #include <string.h>
          #include <tchar.h>
          
          static TCHAR szWindowClass[] = _T("test");
          static TCHAR szTitle[] = _T("Hello World!");
          HINSTANCE hInst;
          LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
          
          int WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPSTR lpCmdLine, _In_ int nCmdShow)
          {
              WNDCLASSEX wcex;
          
              wcex.cbSize = sizeof(WNDCLASSEX);
              wcex.style = CS_HREDRAW | CS_VREDRAW;
              wcex.lpfnWndProc = WndProc;
              wcex.cbClsExtra = 0;
              wcex.cbWndExtra = 0;
              wcex.hInstance = hInstance;
              wcex.hIcon = LoadIcon(wcex.hInstance, IDI_APPLICATION);
              wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
              wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
              wcex.lpszMenuName = NULL;
              wcex.lpszClassName = _T("test");
              wcex.hIconSm = LoadIcon(wcex.hInstance, IDI_APPLICATION);
              
              if (!RegisterClassEx(&wcex))
              {
                  MessageBox(NULL,
                      _T("Call to RegisterClassEx failed!"),
                      _T("Windows Desktop Guided Tour"),
                      NULL);
          
                  return 1;
              }
          
              // Store instance handle in our global variable
              hInst = hInstance;
          
              // The parameters to CreateWindowEx explained:
              // WS_EX_OVERLAPPEDWINDOW : An optional extended window style.
              // 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 = CreateWindowEx(
                  WS_EX_OVERLAPPEDWINDOW,
                  _T("test"),
                  _T("Hello World!"),
                  WS_OVERLAPPEDWINDOW,
                  CW_USEDEFAULT,
                  CW_USEDEFAULT,
                  500, 500,
                  NULL, NULL,
                  hInstance, NULL
              );
              
              if (!hWnd)
              {
                  MessageBox(NULL,
                      _T("Call to CreateWindow failed!"),
                      _T("Windows Desktop 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)msg.wParam;
          }
          
          //  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, Windows desktop!");
          
              switch (message)
              {
              case WM_PAINT:
                  hdc = BeginPaint(hWnd, &ps);
          
                  // Here your application is laid out.
                  // For this introduction, we just print out "Hello, Windows desktop!"
                  // in the top left corner.
                  TextOut(hdc,
                      5, 100,
                      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;
          }
        
    2. 代码截图:文章来源地址https://www.toymoban.com/news/detail-439573.html

      • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vzbaaxKi-1660453573875)(https://f.pz.al/pzal/2022/08/14/22f23be857c3c.png)]

调试记录

  • 调试方法其实非常简单
    1. cpp文件进行构建(可使用快捷键Ctrl+B
      • C++ 窗体程序初步(全网最全)
      • C++ 窗体程序初步(全网最全)
    2. F5运行即可
      • C++ 窗体程序初步(全网最全)

到了这里,关于C++ 窗体程序初步(全网最全)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C++八股】全网最全的C++语言基础八股准备(持续更新)

    指针是一个实体,需要分配内存空间。引用只是变量的别名,不需要分配内存空间。 引用在定义的时候必须进行初始化,并且不能够改变。指针在定义的时候不一定要初始化,并且指向的空间可变。(注:不能有引用的值不能为NULL) 有多级指针,但是没有多级引用,只能有

    2024年02月07日
    浏览(45)
  • 业余无线电新手入门基础知识(全网最全)

    无线电通信是世界中的一项重要组成部分 一项鼓励人们去从事无线电收信和发信的业余爱好活动 业余无线电爱好者也被称为火腿、HAM 业余无线电叫HAM的由来 远在业余无线电发明之初的1908年,美国哈佛大学有一个业余无线电社团其成员为亚伯特.海曼(Elbert.S.Hyman)、巴伯.兹美

    2024年02月09日
    浏览(55)
  • C#程序设计——Windows应用程序开发,1、初步掌握Windows应用程序的设计方法。2、掌握常用窗体控件的使用方法。

    初步掌握Windows应用程序的设计方法。 掌握常用窗体控件的使用方法。 1、设计一个Windows应用程序,创建一个用于添加学生个人基本信息的窗体,窗体下方法同时滚动信息“天行健,君子以自强不息!”。   要示如下: 如图1所示,设计窗体界面控件的布局 图1 学生信息管理

    2024年02月10日
    浏览(80)
  • 全网最全Pytest框架使用教程和项目实战~从入门到精通

    pytest是一个非常成熟的python单元测试框架,比unittest更灵活、更容易上手 pytest可以和selenium、requests、appinum结合实现web自动化、接口自动化、app自动化 pytest可以是实现测试用例的跳过以及reruns失败用例重试 pytest可以和aliure生成非常美观的测试报告 pytest可以和jenkins持续集成

    2024年02月06日
    浏览(45)
  • C++中string类型和int类型之间的相互转换【全网最全】

    字符串操作是各种算法题中的常客,很多数据常常以字符串形式给出,其中有的需要自己转化成整数,而一些整型数据有时转换成字符串处理起来更加方便,比如判断一个整数是否是回文数,所以字符串和整数的转换是一些问题处理的基础步骤, C++  在处理这类问题时并不像

    2024年02月04日
    浏览(62)
  • 【C/Python】用GTK实现多文档窗体程序

    在GTK+(GIMP Toolkit)中实现多文档接口(MDI)程序 可以使用多种方法。GTK+本身并没有提供专用的MDI窗口小部件,但可以使用标签页(Notebook)或多个窗口(Window)来模拟MDI的功能。以下步骤将概述如何使用GtkNotebook来创建一个带有标签页的多文档接口程序: 1. 创建一个新的G

    2024年02月20日
    浏览(32)
  • matlab从无到有系列(九):Simulink基础仿真详解(全网最全,从入门到放弃)

    🔗 运行环境:Matlab 🚩 作者:左手の明天 🥇 精选专栏:《python》 🔥 推荐专栏:《算法研究》 📚 选自专栏:《数学建模》 🧿 优秀专栏:《Matlab神经网络案例分析》 目前持续更新的专栏: 🥇 专栏:Matlab GUI编程技巧 🔥 专栏:

    2024年02月02日
    浏览(38)
  • Visual Studio中C++部分的官方文档链接【微软(Microsoft)所有产品的官方文档链接】

    目前(2022年07月),微软官方网站上关于Visual Studio的文档,最老的版本也是VS2015了,如下图所示: 微软所有产品的文档目录: 中文版:https://docs.microsoft.com/zh-CN/documentation/ 英文版:https://docs.microsoft.com/en-us/documentation/ Visual Studio中C++部分的官方文档: 中文版:https://docs.microso

    2024年02月07日
    浏览(65)
  • uniapp微信小程序地图实现绘制polygon(保姆级教程 全网最全!!!)

    用户需求:需要在填写表单信息时,在地图上标绘自己房屋的位置信息。 这个问题处理了很久,在网上也没有找到全面的相关案例,所以我将我的思路分享给大家,希望可以解决大家遇到的问题。如果大家有更好的思路,欢迎评论区留言,大家一起学习,共同进步! 实现最

    2024年02月04日
    浏览(92)
  • OpenLayers7官方文档翻译,OpenLayers7中文文档,OpenLayers快速入门

    这个入门文档向您展示如何放一张地图在web网页上。 开发设置使用 NodeJS (至少需要Nodejs 14 或更高版本),并要求安装 git 。 开始使用OpenLayers构建项目的最简单方法是运行: npm create ol-app 第一个命令将创建一个名为 my-app 的目录(如果您愿意,可以使用不同的名称),安装

    2024年02月10日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包