C++使用代码创建一个Windows桌面应用程序
WinMain函数
Windows应用程序的唯一程序入口。
函数原型
int WINAPI WinMain
{
HINSTANCE hInstancem
HINSTANCE hPreInstance,
LPSTR lpCmdLine,
int nCmdShow
}
WINAPI定义如下
#define WINAPI _stdcall
_stdcall是一个函数调用约定,除此之外,还有__cdecl,fastcall,thiscall,naked call等函数调用约定。
_stdcall调用约定又称Pascal调用约定,也是Pascal语言的调用约定。它使用的方式为:
int __stdcall sum(int a,int b);
__stdcall:函数的多个参数由调用者按从右到左的顺序压入堆栈,被调用函数获得参数的序列是从左到右的的;清理堆栈的工作由被调用函数负责。
在Visual C++中,常用宏WINAPI或CALLBACK来表示__stdcall调用约定。
更详细的说明可以查看
https://docs.microsoft.com/en-us/cpp/cpp/stdcall?view=vs-2019
__cdecl(也可写成_cdecl)调用约定又称C调用约定,是C函数默认的调用约定,也是C++全局函数的默认调用约定,通常省略。
如
int sum(int a,int b);
int __cdecl sum(int a,int b);
__cdecl:函数的多个参数由调用者按从右向左的顺序压入堆栈,被调函数获得参数的序列是从左到右的;清理堆栈的工作由调用者负责
。
更详细的说明可以查看
https://docs.microsoft.com/en-us/cpp/cpp/cdecl?view=vs-2019
WinMain函数的各参数说明
hInstance
应用程序当前运行的实例的句柄,该句柄由Windows系统生成。
hPrevInstance
当前实例的前一个实例的句柄,在Win32环境下,该参数总是NULL,不再起作用
lpCmdLine
一个以空终止的字符串,代表传递给程序的命令行参数。
nCmdShow
指定窗口的显示状态
常用值如下
nCmdShow = 0;不显示
nCmdShow = 1;正常显示(默认)
nCmdShow = 2;最小化显示
nCmdShow = 3;最大化显示
使用代码创建Windows程序的步骤
1、设计一个Windows类
2、在Windows系统中注册Windows类
3、用该Windows类创建一个窗口
4、创建一个消息循环
5、创建一个窗口过程函数WndProc
一、设计Windows类
在创建一个窗口前,必须对窗口进行设计,指定窗口的属性。系统已经定义了WNDCLASS结构用于描述待创建窗口的参数。
WNDCLASS声明如下
typedef struct tagWNDCLASSA {
UINT style;
WNDPROC lpfnWndProc;
int cbClsExtra;
int cbWndExtra;
HINSTANCE hInstance;
HICON hIcon;
HCURSOR hCursor;
HBRUSH hbrBackground;
LPCSTR lpszMenuName;
LPCSTR lpszClassName;
} WNDCLASSA, *PWNDCLASSA, *NPWNDCLASSA, *LPWNDCLASSA;
下面介绍各参数
style
窗口样式,可用值如下
CS_VREDRAW:垂直重绘,当窗口垂直方向上的高度发生变化时,将重新绘制整个窗口。如果没有指定这一样式,在垂直方向上调整窗口高度时,将不会重绘窗口。
CS_HREDRAW:水平重绘,当窗口水平方向上的宽度发生变化时,将重新绘制整个窗口。如果没有指定这一样式,在水平方向上调整窗口高度时,将不会重绘窗口。
CS_OWNDC:独占设备描述表,为该类中的每个窗口分配一个单值的设备描述表。
CS_SAVEBITS:在一个窗口中保存用户图像,以便于在该窗口被遮住、移动时不必每次刷新屏幕。但是,这样会占用更多的内存,并且比人工进行同样操作时要慢得多。
CS_DBLCLKS:使窗口可以检测到鼠标双击事件,当用户在窗口中双击鼠标时,向窗口过程发送鼠标双击消息
CS_BYTEALLGNCLIENT:鼠标用户区域按字节对齐显示。
CS_BYTEALLGNWINDOW:鼠标用户窗口按字节对齐显示。
CS_PARENTDC:在父窗口中设定一个子窗口的剪切区,以便于子窗口能够画在父窗口中。
CS_NOCLOSE:系统菜单中没有CLOSE菜单项,窗口没有关闭按钮。
lpfnWndProc
指向窗口过程函数的函数指针。窗口过程函数是一个回调函数,针对Windows的消息处理机制,窗口过程函数被调用的过程如下:
1、在设计窗口类的时候,将窗口过程函数的地址赋给lpfnWndProc成员变量
2、调用RegisterClass(&wndclass)注册窗口类,系统就有了用户编写的窗口过程函数的地址
3、当应用程序接收到某一窗口的信息时,调用DispatchMessage(&msg)将消息回传给系统。系统则利用先前注册窗口类时得到的函数指针,调用窗口过程函数对消息进行处理
cbClsExtra
Windows系统为窗口类结构分配追加的额外字节数。一般为0
cbWndExtra
Windows系统为窗口实例分配或追加的额外字节数,一般为0。如果应用程序使用资源文件里的CLASS指令创建对话框,并用WNDCLASS结构注册对话框框时,cbWndExtra必须设置成DLGWINDOWEXTRA
hInstance
包含窗口过程程序的实例句柄。一般直接赋WinMain()的hInstance即可
hIcon
窗口类的图标资源。这个成员变量必须是一个图标资源的句柄。可以使用LoadIcon()函数加载图标,如果hIcon为NULL,窗口将使用系统提供的默认图标
hCursor
窗口类的光标句柄。这个成员变量必须是一个光标资源的句柄。可以使用LoadCursor()函数加载光标。如果hCursor为NULL,应用程序必须在鼠标进入应用程序窗口时,明确设置光标的形状
hbrBackground
窗口类的背景画刷句柄。当窗口发生重绘时,系统使用这里指定的画刷来填充窗口的背景。该成员可以指定为用于绘制背景的物理画刷的句柄,也可以指定为标准的系统颜色值。如下:
BLACK_BRUSH 黑色
DKGRAY_BRUSH 深灰
GRAY_BRUSH 灰色
HOLLOW_BRUSH 空
LTGRAY_BRUSH 浅灰
NULL_BRUSH 等同于HOLLOW_BRUSH
WHITE_BRUSH 白色
BLACK_BRUSH 黑色
lpszMenuName
指向一个以空终止的字符串,该字符串描述菜单的资源名。若使用整数来标识菜单,需要用MAKEINTRESOURCE宏来进行转换。如果lpszMenuName设置为NULL,那么基于窗口类创建的窗口将没有默认菜单
lpszClassName
指向一个以空终止的字符串,该字符串描述窗口类的名字。这个类名可以是由RegisterClass或者RegisterClassEx注册的名字,或者是任何预定义的控件类名
WNDCLASS使用实例如下
WNDCLASS wc; wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = ;
wc.cbWndExtra = ;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WINDOWSPROJECT1));
wc.hCursor = LoadCursor(nullptr, IDC_ARROW);
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+);
wc.lpszMenuName = MAKEINTRESOURCEW(IDC_WINDOWSPROJECT1);
wc.lpszClassName = szWindowClass;
二、注册Windows类
Windows类设计完成时,需要调用RegisterClass()函数去注册这个类,才可以创建该类型的窗口
ATOM RegisterClass(
const WNDCLASSA *lpWndClass
);
注册代码如下
if(!RegisterClass(&wc))
{
return ;
}
三、创建窗口
使用CreateWindow函数创建窗口,如果函数调用成功,返回值为新窗口的句柄;如果调用失败,返回值为NULL。可以使用GetLastError()函数获取错误信息
HWND CreateWindow(
LPCTSTR lpClassName,
LPCTSTR lpWindowName,
DWORD dwStyle,
int x,
int y,
int nWidth,
int nHeight,
HWND hWndParent,
HMENU hMenu,
HANDLE hInstance,
PVOID lpParam
);
未完
C++使用代码创建一个Windows桌面应用程序的更多相关文章
- 使用PHP-GTK编写一个windows桌面应用程序
PHP-GTK的下载地址:http://gtk.php.net/download.php?language=en-US, 猿哥选择了最新版本(beta版),可能有人会问我们为啥不选最新的stable版 ...
- 创建一个Windows服务程序与实现定时器效果
1.创建一个Windows服务程序 一. 新建Window服务项目 二. 添加安装程序 三. 配置服务属性 四. 编写定时器代码 publicpartialclassService1 ...
- C#创建一个Windows Service
Windows Service这一块并不复杂,但是注意事项太多了,网上资料也很凌乱,偶尔自己写也会丢三落四的.所以本文也就产生了,本文不会写复杂的东西,完全以基础应用的需求来写,所以不会对Window ...
- 为MongoDB创建一个Windows服务
一:选型,根据机器的操作系统类型来选择合适的版本,使用下面的命令行查询机器的操作系统版本 wmic os get osarchitecture 二:下载并安装 附上下载链接 点击安装包,我这里是把文件 ...
- Visual C++ Windows 桌面应用程序样例(摘抄)
//================================== //Windows应用程序框架结构(例子) //参考:<Visual C++宝典>陈国建等编著 //======= ...
- 适用于Windows桌面应用程序的.NET Core 3
介绍 9月,微软发布了新版.NET Core,用于构建Windows桌面应用程序,包括WPF和Windows Forms.从那时起开发人员可以将传统的nfx桌面应用程序(和控件库)迁移到.NET Co ...
- 对Windows桌面应用程序进行UI自动化测试
题记:本文简述如何利用appium对Windows桌面应用程序进行UI自动化测试. 所谓UI自动化测试,就是模拟一个用户,对应用程序的UI进行操作,以完成特定场景的功能性集成测试. 要对Windows ...
- [ASP.NET MVC2 系列] ASP.Net MVC教程之《在15分钟内用ASP.Net MVC创建一个电影数据库应用程序》
[ASP.NET MVC2 系列] [ASP.NET MVC2 系列] ASP.Net MVC教程之<在15分钟内用ASP.Net MVC创建一个电影数据库应用程序> ...
- [WCF学习笔记] 我的WCF之旅(1):创建一个简单的WCF程序
近日学习WCF,找了很多资料,终于找到了Artech这个不错的系列.希望能从中有所收获. 本文用于记录在学习和实践WCF过程中遇到的各种基础问题以及解决方法,以供日后回顾翻阅.可能这些问题都很基础,可 ...
随机推荐
- Spark在美团的实践
https://tech.meituan.com/2016/03/31/spark-in-meituan.html 本文已发表在<程序员>杂志2016年4月期. 前言 美团是数据驱动的互联 ...
- 各种系统性能优化技术,采用vilocity实现商品页面静态化
1.大型门户网站系统:>10万的访问量 行业网站(当当网,卓越网):20万-30万,一个小时内会跟数据库的交互至少20万-30万,会产生数据库瓶颈,每个数据库都有一个最大连接数(socket ...
- Pygame 贪吃蛇
目录 代码 遇到的问题 参考 代码 #-*-encoding=utf-8-*- # Wormy(a Nibbles clone) # By Al Sweigart al@inventwithpytho ...
- 单细胞数据整合方法 | Comprehensive Integration of Single-Cell Data
操作代码:https://satijalab.org/seurat/ 依赖的算法 CCA CANONICAL CORRELATION ANALYSIS | R DATA ANALYSIS EXAMPL ...
- 解决vs2010按ctrl+f5,调试窗口一闪而过的方法
vs2010调试按F5与按Ctrl+F5有什么区别 Ctrl F5测试运行后不自动推出控制台,直接按F5会自动退出去 解决vs2010按ctrl+f5,调试窗口一闪而过的方法 http://hi.ba ...
- Linux下emacs如何安装
ftp://ftp.gnu.org/gnu/emacs/ 下载对应版本编译安装 cd 自己想安装的目录 sudo wget ftp://ftp.gnu.org/gnu/emacs/emacs-24.4 ...
- Docker搭建Kafka
下载Kafka和Zookeeper镜像文件 1,docker pull wurstmeister/kafka 2,docker pull wurstmeister/zookeeper 先运行zk,再运 ...
- Oracle 性能分析
1.--查出耗时长的 10条SQL select * from (select v.sql_id, v.child_number, v.sql_text, v.elapsed_time, v.cpu_ ...
- prettier
prettier,是一个自以为是 Opinionated 的代码格式化工具,用来批量处理旧代码的统一. 涉及引号,分号,换行,缩进. prettier 支持我们大前端目前大部分语言处理,包括 Jav ...
- redis密码配置
配置密码 重启密码会失效 配置在redis.conf中 requirepass test123,则重启不会失效