VS创建 Win32 应用程序(实现窗口的创建)(二)

程序框架如下:

一、VS演示流程

打开VS----文件----新建----项目----Windows 桌面应用程序

二、生成代码:(大部分函数在上一篇已经解释)

// 第一个窗口.cpp : 定义应用程序的入口点。
#include "stdafx.h"
#include "第一个窗口.h"
#define MAX_LOADSTRING 100// 全局变量:
HINSTANCE hInst;                                // 当前实例
WCHAR szTitle[MAX_LOADSTRING];                  // 标题栏文本
WCHAR szWindowClass[MAX_LOADSTRING];            // 主窗口类名// 此代码模块中包含的函数的前向声明:
ATOM                MyRegisterClass(HINSTANCE hInstance);    // 注册窗口类
BOOL                InitInstance(HINSTANCE, int);            //窗口初始化(创建、显示、更新)
LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);     // 消息处理
INT_PTR CALLBACK    About(HWND, UINT, WPARAM, LPARAM);       // 弹出对话框

主函数 WinMain

int APIENTRY wWinMain(_In_ HINSTANCE hInstance,_In_opt_ HINSTANCE hPrevInstance,_In_ LPWSTR    lpCmdLine,_In_ int       nCmdShow)
{UNREFERENCED_PARAMETER(hPrevInstance);   //其目的是避免编译器关于未引用参数的警告UNREFERENCED_PARAMETER(lpCmdLine);       //其目的是避免编译器关于未引用参数的警告// TODO: 在此处放置代码。// 初始化全局字符串LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);LoadStringW(hInstance, IDC_MY, szWindowClass, MAX_LOADSTRING);MyRegisterClass(hInstance);// 执行应用程序初始化:if (!InitInstance (hInstance, nCmdShow)){return FALSE;}HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_MY));MSG msg;// 主消息循环:while (GetMessage(&msg, nullptr, 0, 0)){if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)){TranslateMessage(&msg);DispatchMessage(&msg);}}return (int) msg.wParam;
}

注册窗口类MyRegisterClass()

//  函数: MyRegisterClass()
//
//  目标: 注册窗口类。
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{WNDCLASSEXW 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(hInstance, MAKEINTRESOURCE(IDI_MY));wcex.hCursor        = LoadCursor(nullptr, IDC_ARROW);wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);wcex.lpszMenuName   = MAKEINTRESOURCEW(IDC_MY);wcex.lpszClassName  = szWindowClass;wcex.hIconSm        = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));return RegisterClassExW(&wcex);
}

初始化窗口InitInstance()

//   函数: InitInstance(HINSTANCE, int)
//   目标: 保存实例句柄并创建主窗口
//   注释:
//        在此函数中,我们在全局变量中保存实例句柄并
//        创建和显示主程序窗口。
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{hInst = hInstance; // 将实例句柄存储在全局变量中
//注意:此处的窗口类名szWindowClass要与前面注册窗口类的一样HWND hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr);if (!hWnd){return FALSE;}ShowWindow(hWnd, nCmdShow);UpdateWindow(hWnd);return TRUE;
}

消息处理WndProc

//  函数: WndProc(HWND, UINT, WPARAM, LPARAM)
//  目标: 处理主窗口的消息。
//  WM_COMMAND  - 处理应用程序菜单
//  WM_PAINT    - 绘制主窗口
//  WM_DESTROY  - 发送退出消息并返回LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{switch (message){case WM_COMMAND:{int wmId = LOWORD(wParam);// 分析菜单选择:switch (wmId){case IDM_ABOUT:DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);break;case IDM_EXIT:DestroyWindow(hWnd);break;default:return DefWindowProc(hWnd, message, wParam, lParam);}}break;case WM_PAINT:{PAINTSTRUCT ps;HDC hdc = BeginPaint(hWnd, &ps);// TODO: 在此处添加使用 hdc 的任何绘图代码...LPCWSTR text1 = TEXT("VS Win32 窗口创建");TextOut(hdc, 0, 0, text1, lstrlen(text1));MessageBox(NULL, TEXT("VS Win32 窗口创建"), TEXT("hoade"), MB_OK);![](https://img-blog.csdnimg.cn/20190731143942499.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ1MDIxMTgw,size_16,color_FFFFFF,t_70)EndPaint(hWnd, &ps);}break;case WM_DESTROY:PostQuitMessage(0);break;default:return DefWindowProc(hWnd, message, wParam, lParam);}return 0;
}

框的消息处理About

// “关于”框的消息处理程序。
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{UNREFERENCED_PARAMETER(lParam);switch (message){case WM_INITDIALOG:return (INT_PTR)TRUE;case WM_COMMAND:if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL){EndDialog(hDlg, LOWORD(wParam));return (INT_PTR)TRUE;}break;}return (INT_PTR)FALSE;
}

三、代码运行效果:

四、补充:

4.1 UNREFERENCED_PARAMETER的使用

其目的是避免编译器关于未引用参数的警告,告诉编译器,已经使用了该变量,不必检测警告!在VC编译器下,如果您用最高级别进行编译,编译器就会很苛刻地指出您的非常细小的警告。当你生命了一个变量,而没有使用时,编译器就会报警告:“warning C4100: ‘‘XXXX’’ : unreferenced formal parameter.” 所以,为了让编译器不必检测你的警告,就使UNREFERENCED_PARAMETER语句。

4.2 LoadStringW()

函数原型
对项目文件的资源(这里是指字符串,通过ID号找到)加载到实例的缓存区(通过指针加载,且指定缓存区大小)

LoadStringW( _In_opt_ HINSTANCE hInstance,    // 实例句柄    _In_ UINT uID,                   // 已有的资源ID(名字)    _Out_writes_to_(cchBufferMax, return + 1) LPWSTR lpBuffer,//存放资源的缓存区指针  _In_ int cchBufferMax);          // 存放资源缓存区的大小

已有的资源就已经在项目文件中了,项目文件会对资源提供ID号(也就是资源名),我们加载的字符串就是这个资源。缓存区指针就是对加载的资源进行存储区域的指针。存放资源缓存区的大小就是对加载的资源进行存储区域的大小。

4.3 调入加速键表LoadAccelerators()

LoadAccelerators函数功能:调入加速键表。该函数调入指定的加速键表。
加速键也称为键盘快捷键

函数原型:

HACCEL LoadAccelerators(HINSTANCE hlnstance,LPCTSTR lpTableName);

参数:

hlnstance:模块的一个实例的句柄,该模块的可执行文件中包含将要调入的加速键表。

IpTableName:指向一个以空结尾的字符串的指针,该字符串包含了即将调入的加速键表的名字。另一种可选的方案是,该参数可以在加速键表资源的低位字中指定资源标识符,而高位字中全零。MADEINTRESOURCE宏可被用于创建该值。

返回值:

返回值:若函数调用成功,则返回所加载的加速键表句柄 [1] 。若函数调用失败,则返回值为NULL。若要获得更多的错误信息,可以调用GetLastError函数。

4.4 MSG 消息结构

结构原型:

MSG msg;{HWND        hwnd;     //窗口句柄UINT        message;  //消息id,传递过来的消息WPARAM      wParam;   //消息辅助参数LPARAM      lParam;   //消息辅助参数DWORD       time;     //消息产时间POINT       pt;       //消息产生时鼠标所在的位置}

4.5 MAKEINTRESOURCEW的作用

MAKEINTRESOURCE是一个资源名转换的宏,这个宏是把一个数字类型转换成指针类型的宏,它不存在释放的问题。

就是lpName参数需要使用MAKEINTRESOURCE ,因为它需要LPCTSTR类型的参数输入.那么,情况就很清楚了.凡涉及"资源"的API或者MFC类,在参数类型为LPCTSTR时,就应该使用 MAKEINTRESOURCE.这是针对"资源名字"为"数字类型"时的情况.

VS创建 Win32 应用程序(实现窗口的创建)相关推荐

  1. 如何在其他程序的窗口上创建按钮并使之能响应

    如何在其他程序的窗口上创建按钮并使之能响应 源代码下载 环境:Windows NT/2000 实现方法:采用将动态连接库注入到其他进程中的方法来实现. 为了便于选择窗口,我借用了另一个程序" ...

  2. 隐藏win32控制台程序的窗口

    有时侯写一个控制台程序,不需要在前台出现类似DOS窗口的console窗口,这就要隐藏它:隐藏它很简单,只需在程序前面加上 #pragma comment( linker, "/subsys ...

  3. win32程序窗口的创建

    尽管Windows应用程序千变万化,令人眼花缭乱,但,消息机制和窗口过程却始终它们的基础,掌握了这两项技术,也就相当于把握住了问题的关键. 如果你以前是C程序员或是MFC的忠实用户,只要你学习过C语言 ...

  4. 你不得不知道的Visual Studio 2012(3)- 创建Windows应用程序

    创建项目 在Visual Studio中创建一个应用程序,应首先创建一个项和一个解决方案.在此示例中,您将创建Windows presentation foundation应用程序. 创建 WPF 项 ...

  5. close函数 qt_QT5笔记:关闭应用程序和窗口的函数

    23333 QT一坨,求一门面向傻瓜的语言. QT中 quit(),exit()以及close():常用的三个槽 对主程序的退出,可以调用成员函数exit(),同时也可以调用槽quit(),二者此时都 ...

  6. 2020计算机取消vb,2020年全国计算机二级VB复习知识点:创建VB应用程序的一

    [摘要] 即将参加全国计算机等级考试的考生们,考试即将到来,大家的备考工作进行得如何了?考必过为大家精心整理了2020年全国计算机二级VB复习知识点:创建VB应用程序的一,希望能够助力全国计算机等级考 ...

  7. 创建IOS应用程序通用下的Setting以及读取方式

    在iphone和ipad中,有一个东西大家一定很熟悉,那个东西就是Settings. 这次要学习的东西说白了很简单,就是学习如何在Settings中对一个app的某些属性进行设置,反过来,在app中更 ...

  8. 在Windows上创建CUDA C程序

    文章目录 一.安装Visual Studio 二.安装CUDA工具包 (一)查看GPU型号 (二)下载CUDA10.0 (三)安装CUDA10.0 三.初探CUDA C程序 (一)CUDA C程序概述 ...

  9. sharepoint 2016 学习系列篇(5)-创建一个应用程序网站

    前面已经完成了整个sharepoint server 2016的安装和配置,接下来,我们当然是要创建一个应用程序网站. 1.创建应用程序网站 打开sharepoint管理中心,点击Applicatio ...

最新文章

  1. ABAP vs Java, 蛙泳 vs 自由泳
  2. 微软技术专家为您解读深度学习
  3. 难以拒绝的中国风雅致新年元旦海报来袭
  4. [Python] L1-029. 是不是太胖了-PAT团体程序设计天梯赛GPLT
  5. java script 视频教程_智能社JS全套视频教程+高清入门javascript下载
  6. NTKO控件的一些基本方法属性
  7. 任正非发声:把活下来作为最主要纲领;安卓山寨 iOS 启动器下载超 5000 万次;公司停电,程序员去网吧写代码 | EA周报...
  8. windows-API劫持(API-HOOK)
  9. PCWorld盘点2011科技界15大败笔 索尼居首(图)
  10. Unity实现将图片上传到服务器功能
  11. e站app里站hosts_[装修记 天猫家装e站~大庆站]
  12. 交付给事业多少,你就能成就多少事业
  13. JetBrains .idea project directory (详细利用教程)
  14. egret res资源配置文件分包加载
  15. 走进Cosmos之入门
  16. WTK2.2模拟器设置为支持触摸屏状态
  17. ElementUI table实现复杂表格
  18. 打造数字时代的“诺亚方舟”
  19. 直动式球形止回阀DCV-080-PB、DCV-100-PB
  20. DBMS_PIPE包的使用

热门文章

  1. 微信支付.商家转账到零钱案例
  2. python中fun函数求1+2…+n_功能:编写函数fun求1!+2!+3!+ …… +n!的和,在main函 数中由键盘输入n值,并输出运算结果。请编写fun 函数...
  3. 白话空间统计二十五:空间权重矩阵外篇:功能地理学
  4. ubuntu 22端口不通
  5. 如何将Word文档导入Google文档
  6. UDP protocol--udp_rcv
  7. 食谱生成器与营养计算器的核心部分设计
  8. Elasticsearch: 运用 Pinned query 来提高文档的排名 (7.5发行版新功能)
  9. Android中MVP框架理解
  10. 关闭compactos_开启Compact压缩Win10系统文件,为Win10系统盘瘦身