〇.前言————————————————————

+

学Windows窗体已经有一段时日了,奈何没有什么浅显易懂(&便宜!!)的书籍 , 就想来 , 算是记笔记吧 , 顺便还能给你们总结一些经验

注:有许多内容源于我看过的一些视频 , 比如Chili和Cherno的 , 大家也可以去搜一搜

一.准备————————————————————

我为什么要写这一栏,又不是OpenGL,算了,我喜欢~

1.Windows 10

2. VisualStudio2022 (没错,我可勇了)

3.笔记本

4.你的注意力(好吧,我承认,这是不可能的)

二.开始————————————————————

今天,我们的目标是,制作一个空白窗口

1.创建——————————

step1:新建项目 -> 选择空项目

             不要选WindowsXXXXXX的,它有附带文件,一上来你可能看不懂

step2:填入解决方案名称

             选择文件路径

             点击创建

step3:右键"源文件" -> 选择"添加" -> 选择"新建项"

step4:选择C++文件

            文件名取"WinMain.cpp"

            点击添加

 step5:右键"解决方案"下面的"WinMain" -> 选择"属性"

step6:选择"所有配置"

             找到配置属性 -> 链接器 -> 系统

 step7:将"子系统"改为"窗口"

2.代码——————————

首先,让我们来认识一下,你所见过的最简单的窗体程序,当然是Visu记事本

一个极简的窗体,实际上只有窗体内部,但记事本还加上了菜单滑动条,默认地,窗体会自带最小化全屏关闭,你可以在WM_中设置

你看,当你在记事本中按一些按键的时候,他居然也能显示相同的字母!!

别觉得我很奇怪,这并不是理所当然的,这是由消息处理函数决定的,这在以后的事件中会讲解

最后,和控制台程序类似,窗体程序需要一个进入点main,在窗体程序中,它叫做WinMain

————————————————————

0.头文件——Windows.h

既然是Windows窗体程序,那肯定要Windows.h头文件啦~

#include <Windows.h>

————————————————————

1.WinMain——窗体程序的进入点

WinMain有个固定的格式:

int __stdcall WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPWSTR    lpCmdLine,int       nCmdShow
)

解析

这些内容由系统指定:

__stdcall:这是一个扩展,我们平常看到的CALLBAK等宏都是指它

__stdcall指定了参数传递的方式,及堆栈的管理者

hInstance = handle(句柄) + Instance(实例)

指当前程序的句柄(类比指针)用于之后的创建

hPrevInstance = handle + Previous(上一个) + Instance

指上一级程序的句柄,Win16使用,现今基本不用

LPWSTR = Long + Pointer(指针) + Wide + STRing(字符串)

在定义中,我们可以发现它是WCHAR(宽字符串)的指针

lpCmdLine = LPWSTR + Command(命令) + Line

                用于传递命令(类型为WCHAR)

nCmdShow:n+ Command + Show

用于设置默认窗口样式,不是特别有用

——————————————————————

好的,既然已经把进入点准备好了,那么点击“编译”,你就会得到……什么都没有

当然啦,你都没有“召唤”出你的窗口界面,所以我们需要定制它的样式,它的属性,这些,我们需要在窗口类注册

————————————————————

2.注册窗口类

首先,我们需要定义一个类:WNDCLASS(WindowClass),放在WinMain()中

此处我们使用加强(EX)版和Ansi(多字节字符串)版本,即WNDCLASSEXA

那这个对象我们不妨取作WC咳咳,Winc

WNDCLASSEXA Winc;Winc = { 0 };ZeroMemory( &Winc, sizeof( Winc ) );

接下来,我们需要把它清空,可以直接让他 = { 0 },也可以用ZeroMemory

创建好对象后,我们来看看它的其中一部分属性

Winc.cbSize        =
Winc.style         =
Winc.lpfnWndProc   =
Winc.cbClsExtra    =
Winc.cbWndExtra    =
Winc.hInstance     =
Winc.hIcon         =
Winc.hCursor       =
Winc.hbrBackground =
Winc.lpszMenuName  =
Winc.lpszClassName = 

别被吓到啦,来看看这些属性分别是什么意思:

cbSize              ——        类的大小,填 sizeof( Winc ) 即可

style                 ——        Class样式,具体参考Microsoft —— ClassStyle

要同时选用多种,用 隔开eg.  CS_A | CS_B

lpfnWndProc   ——        消息处理函数,后面会讲

cbClsExtra       ——        类额外字节数,一般置0

cbWndExtra      ——       窗体额外字节数,一般置0

hInstance          ——        输入WinMain中的hInstance即可

hIcon、hCursor、hbrBackground之后再讲解

lpszMenuName ——        菜单栏样式,在resource.h与资源文件夹中定义

lpszClassName ——        类名,输入一个字符串即可

在注册完之后,我们把它丢到RegisterClass中就可以啦(EXA解释同上)

//这边是示例
WNDCLASSEXA Winc = { 0 };Winc.cbSize = sizeof( Winc );
Winc.style = CS_OWNDC;
Winc.lpfnWndProc = MessageSetup;
Winc.cbClsExtra = 0;
Winc.cbWndExtra = 0;
Winc.hInstance = hInstance;
Winc.hIcon = nullptr;
Winc.hCursor = nullptr;
Winc.hbrBackground = nullptr;
Winc.lpszMenuName = nullptr;
Winc.lpszClassName = "wind2067 is handsome";RegisterClassExA( &Winc );

————————————————————

3.CreateWindow——创建窗口组件

这边需要声明的是,我们先前认识的窗口,其实很狭义,事实上按钮文本框复选框以及它本身,都叫做Window

为了简化格式,我们使用Ansi版本的函数,即CrateWindowA(实际上是EXA)

CreateWindowA的定义如下:

HWND WINAPI CreateWindowExA(_In_     DWORD dwExStyle,_In_opt_ LPCSTR lpClassName,_In_opt_ LPCSTR lpWindowName,_In_     DWORD dwStyle,_In_     int X,_In_     int Y,_In_     int nWidth,_In_     int nHeight,_In_opt_ HWND hWndParent,_In_opt_ HMENU hMenu,_In_opt_ HINSTANCE hInstance,_In_opt_ LPVOID lpParam);

emm,先不管"_In_opt"这些,先来赏析一下这些形参:

DOWRD                ——        就是int

dwExStyle            ——        增强版窗口样式,参考Microsoft —— Extended WindowStyle

lpClassName       ——        我们刚刚定义的类名

lpWindowName   ——        窗口标题

dwStyle                ——        窗口样式,参考Microsoft —— WindowStyle

X、Y                      ——        窗口出现时的位置(相对坐标)

nWidth、nHeight ——        窗口出现时的宽高

hWndParent         ——        父窗口,需要WS_CHILD

lpParam                ——        由于涉及到消息处理,之后再谈

创建完之后,我们得到了一个HWND(Handle Window),需要用HWND接收:

HWND hWnd = CreateWindow( … );

最后,我们将它用ShowWindow显示出来:

ShowWindow( hWnd, SW_SHOWDEFAULT );

注:SW = Show + Window

//这边是示例
hWnd = CreateWindowA("wind2067 is handsome","Subscribe!!!",WS_SYSMENU,CW_USEDEFAULT, CW_USEDEFAULT,    //CW = CreateWindow0, 0,nullptr, nullptr,hInstance,nullptr;
);ShowWindow( hWnd, SW_SHOWDEFAULT );

就这样,点击编译,你就可以看到一个白白嫩嫩的窗口啦~~~

C++ Windows 窗体程序入门 - 1.你的第亿个窗体程序相关推荐

  1. Windows网络编程入门:简单的客户端和服务器通信程序调试

    昨日入手Windows网络编程经络这本书,第一章给了Echo客户端和服务器的简单通信实例程序.从小白到入门目测都是比较苦逼,居然想不到怎么来测试结果.什么同时运行啊.分别编译运行啊乱七八糟的想法就开始 ...

  2. 小程序入门开发(一)注册激活小程序、发布小程序

    文章目录 小程序注册 下载开发工具 你的第一个小程序 app.json页面 pages window tabBar 项目打包 1.修改小程序id 2.上传 3.小程序管理页面 审核失败 小程序官方文档 ...

  3. 小程序入门教程之微信-02-页面样式

    这个系列的,上一篇教程教大家写了一个最简单的 Hello world 微信小程序. 但是,那只是一个裸页面,并不好看.今天接着往下讲,如何为这个页面添加样式,使它看上去更美观,教大家写出实际可以使用的 ...

  4. 微信小程序入门开发视频教程

    最近录了一个小程序入门开发的视频教程,主要讲解小程序项目结构.flex布局.官方文档使用.综合demo等. 有兴趣的可以观看,希望看后给一些反馈意见. 视频:http://it.zhenzikj.co ...

  5. 小程序入门教程之微信-03-脚本编程

    本篇的难度要大于前两篇,如果觉得不好理解,可以先跟着例子,动手做一遍,然后再读文字说明,可能就容易理解了. 所有示例的完整代码,都可以从 GitHub 的代码仓库下载. 一.数据绑定 前面的所有示例, ...

  6. Windows API程序设计入门(新手的第一个Windows程序)

    Windows API程序设计入门 一.实验目的 二.实验工具 三.参考资料 四.步骤 五.代码分析 六.运行效果 七.补充 一.实验目的 了解 windows操作系统应用程序开发的基本概念,win3 ...

  7. C# Windows 窗体编程入门详解

    C# Windows 窗体编程入门详解 基于Web的B/S架构应用程序近年来确实非常流行,B/S易于部署.易于维护的特点使Web应用程序开发得到了前所未有的发展.但是,Web应用程序的缺点是,它们有时 ...

  8. Windows 8 JavaScript Metro应用程序--入门(上)

    Windows 8 JavaScript Metro应用程序--入门(上) 如你所知的Windows8允许你通过以下几种方式创建Metro应用程序: C++ C# JavaScript 第一部分将侧重 ...

  9. Windows MFC编程入门——应用程序框架

    一.SDK应用程序与MFC应用程序运行过程对比 程序运行都要有入口函数,在C/C++程序中都是main函数,而windows应用程序的入口函数是WinMain或wWinMain.MFC程序也是从这个入 ...

最新文章

  1. [转]使用wget命令下载Google drive上的文件
  2. C语言能否写windows应用程序,C语言能写windows的窗口吗?
  3. Java StringBuilder codePointBefore()方法与示例
  4. django3与vue3本地搭建
  5. const与修饰函数形参
  6. 多物理场面向对象模拟环境MOOSE学习手册
  7. 电脑无线网络显示红叉_Maxidix Wifi Suite下载_无线网络管理软件中文版v14.5.8
  8. 深度学习、机器学习、自然语言处理NLP优秀文章整理
  9. java记事本写玫瑰花代码_第一个用记事本写的java代码
  10. g++ 安装python_Python趣用—配平化学方程式!
  11. oracle同义词6,Oracle同义词
  12. 解析MySQL ibd文件
  13. 如何在Mac和Windows PC之间无线共享文件
  14. 基于SSH框架的学生考试系统(注意看文档目录)
  15. CISP与CISSP证书的区别,那个能适合现在的市场环境
  16. Pinyin4j 详解及使用
  17. 有关神经网络的训练算法,深度神经网络训练方法
  18. 酷友观点/经验:iphone 5\6\6p各尺寸参照图(原创)
  19. Google 搜索的运作方式
  20. 桌面计算机没有了 怎么恢复,告诉你电脑桌面图标都没了怎么恢复

热门文章

  1. List集合去重的几种方式
  2. Windows系统 Docker 相关命令报错
  3. 利用4位led显示本机秒表时间的单片机c语言程序,基于单片机的一个2位的led数码显示作为_秒表_设计.doc...
  4. STM32驱动eMMC读写数据
  5. [Power Designer]创建需求模型RQM
  6. Linux 下Shell的学习-优秀demo详解
  7. StyleGAN及StyleGANv2论文解读
  8. 何为Referring Expression(指称表达)?
  9. 黑马旅游网编写练习(3)--登录和退出功能
  10. 联想旭日410M笔记本,在Windows Server 2003系统下的声卡驱动安装问题