C++ Windows 窗体程序入门 - 1.你的第亿个窗体程序
〇.前言————————————————————
+
学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:no + 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.你的第亿个窗体程序相关推荐
- Windows网络编程入门:简单的客户端和服务器通信程序调试
昨日入手Windows网络编程经络这本书,第一章给了Echo客户端和服务器的简单通信实例程序.从小白到入门目测都是比较苦逼,居然想不到怎么来测试结果.什么同时运行啊.分别编译运行啊乱七八糟的想法就开始 ...
- 小程序入门开发(一)注册激活小程序、发布小程序
文章目录 小程序注册 下载开发工具 你的第一个小程序 app.json页面 pages window tabBar 项目打包 1.修改小程序id 2.上传 3.小程序管理页面 审核失败 小程序官方文档 ...
- 小程序入门教程之微信-02-页面样式
这个系列的,上一篇教程教大家写了一个最简单的 Hello world 微信小程序. 但是,那只是一个裸页面,并不好看.今天接着往下讲,如何为这个页面添加样式,使它看上去更美观,教大家写出实际可以使用的 ...
- 微信小程序入门开发视频教程
最近录了一个小程序入门开发的视频教程,主要讲解小程序项目结构.flex布局.官方文档使用.综合demo等. 有兴趣的可以观看,希望看后给一些反馈意见. 视频:http://it.zhenzikj.co ...
- 小程序入门教程之微信-03-脚本编程
本篇的难度要大于前两篇,如果觉得不好理解,可以先跟着例子,动手做一遍,然后再读文字说明,可能就容易理解了. 所有示例的完整代码,都可以从 GitHub 的代码仓库下载. 一.数据绑定 前面的所有示例, ...
- Windows API程序设计入门(新手的第一个Windows程序)
Windows API程序设计入门 一.实验目的 二.实验工具 三.参考资料 四.步骤 五.代码分析 六.运行效果 七.补充 一.实验目的 了解 windows操作系统应用程序开发的基本概念,win3 ...
- C# Windows 窗体编程入门详解
C# Windows 窗体编程入门详解 基于Web的B/S架构应用程序近年来确实非常流行,B/S易于部署.易于维护的特点使Web应用程序开发得到了前所未有的发展.但是,Web应用程序的缺点是,它们有时 ...
- Windows 8 JavaScript Metro应用程序--入门(上)
Windows 8 JavaScript Metro应用程序--入门(上) 如你所知的Windows8允许你通过以下几种方式创建Metro应用程序: C++ C# JavaScript 第一部分将侧重 ...
- Windows MFC编程入门——应用程序框架
一.SDK应用程序与MFC应用程序运行过程对比 程序运行都要有入口函数,在C/C++程序中都是main函数,而windows应用程序的入口函数是WinMain或wWinMain.MFC程序也是从这个入 ...
最新文章
- [转]使用wget命令下载Google drive上的文件
- C语言能否写windows应用程序,C语言能写windows的窗口吗?
- Java StringBuilder codePointBefore()方法与示例
- django3与vue3本地搭建
- const与修饰函数形参
- 多物理场面向对象模拟环境MOOSE学习手册
- 电脑无线网络显示红叉_Maxidix Wifi Suite下载_无线网络管理软件中文版v14.5.8
- 深度学习、机器学习、自然语言处理NLP优秀文章整理
- java记事本写玫瑰花代码_第一个用记事本写的java代码
- g++ 安装python_Python趣用—配平化学方程式!
- oracle同义词6,Oracle同义词
- 解析MySQL ibd文件
- 如何在Mac和Windows PC之间无线共享文件
- 基于SSH框架的学生考试系统(注意看文档目录)
- CISP与CISSP证书的区别,那个能适合现在的市场环境
- Pinyin4j 详解及使用
- 有关神经网络的训练算法,深度神经网络训练方法
- 酷友观点/经验:iphone 5\6\6p各尺寸参照图(原创)
- Google 搜索的运作方式
- 桌面计算机没有了 怎么恢复,告诉你电脑桌面图标都没了怎么恢复
热门文章
- List集合去重的几种方式
- Windows系统 Docker 相关命令报错
- 利用4位led显示本机秒表时间的单片机c语言程序,基于单片机的一个2位的led数码显示作为_秒表_设计.doc...
- STM32驱动eMMC读写数据
- [Power Designer]创建需求模型RQM
- Linux 下Shell的学习-优秀demo详解
- StyleGAN及StyleGANv2论文解读
- 何为Referring Expression(指称表达)?
- 黑马旅游网编写练习(3)--登录和退出功能
- 联想旭日410M笔记本,在Windows Server 2003系统下的声卡驱动安装问题