下面六星教育整理使用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语言的调用约定。它使用的方式为:

1 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     = 0;wc.cbWndExtra     = 0;wc.hInstance      = hInstance;wc.hIcon          = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WINDOWSPROJECT1));wc.hCursor        = LoadCursor(nullptr, IDC_ARROW);wc.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);wc.lpszMenuName   = MAKEINTRESOURCEW(IDC_WINDOWSPROJECT1);wc.lpszClassName  = szWindowClass;

二、注册Windows类

Windows类设计完成时,需要调用RegisterClass()函数去注册这个类,才可以创建该类型的窗口

ATOM RegisterClass(
const WNDCLASSA *lpWndClass
);
注册代码如下

if(!RegisterClass(&wc))
{
return 0;
}

三、创建窗口

使用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/C++入门到精通企业级项目实战http://ke.qq.com/course/349354》来自世界百强公司一线互联网的大师执教,分享多年宝贵开发经验,全程项目实战贯穿,由浅入深通俗易懂。如果对C++感兴趣的话,想学C++培训的,可以搜索六星教育C++培训,我们将竭诚为你解答。

使用C++代码创建一个Windows桌面应用程序相关推荐

  1. 如何创建一个 Windows 桌面应用程序?

    工具:Visual Studio 2017 Community 在大学期间,不过学习 C/C++ 还是 Java,每次写的程序都是控制台黑框框,有时候想设计一个可视化的应用程序却不知从何下手,大学里面 ...

  2. 创建一个Windows Service应用程序

    创建一个Windows Service应用程序 下载本文代码 见资源 正是由于.NET Framework的出现,才使你能够构建出在系统重新启动时自动运行的.无人参与的(unattended)应用程序 ...

  3. 使用python创建一个windows桌面在线翻译小程序

    1.首先需要制造打包的gui界面 这里小编使用的是 wxFormBuilder 下载地址:链接:https://pan.baidu.com/s/1DOe7TA6ap07ZsjcH4qzBIQ 密码:2 ...

  4. 使用PHP-GTK编写一个windows桌面应用程序

    PHP-GTK的下载地址:http://gtk.php.net/download.php?language=en-US, 猿哥选择了最新版本(beta版),可能有人会问我们为啥不选最新的stable版 ...

  5. 利用c语言在屏幕上画出窗口,第一课:创建一个windows窗口

    跟我一起学图形编程                               作者:姚明联系方式: 欢迎使用我的图形学教程.我是计算机专业的学生,对图形图像技术有浓厚的兴趣,就读期间广泛的涉及相关知 ...

  6. 创建传统的Windows桌面应用程序

    文章目录 前言 代码 运行结果 前言 目标:创建的示例应用程序,使用 Windows API 显示 "Hello,Windows desktop!" 应用程序. 教学资料:[SDK ...

  7. python kivy显示图片_python基于Kivy写一个图形桌面时钟程序代码示例

    本篇文章小编给大家分享一下python基于Kivy写一个图形桌面时钟程序代码示例,文章代码介绍的很详细,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看. Kivy 是一个开源的 ...

  8. C#创建一个Windows Service

    Windows Service这一块并不复杂,但是注意事项太多了,网上资料也很凌乱,偶尔自己写也会丢三落四的.所以本文也就产生了,本文不会写复杂的东西,完全以基础应用的需求来写,所以不会对Window ...

  9. 创建一个windows服务的小程序及注意事项

    1,首先在vs中创建一个windows服务项目 会生成一个Service1.cs的文件  打开该文件 切换到代码视图  有两个方法   OnStart(string[] args)和OnStop()方 ...

最新文章

  1. 问题1 机器学习篇 如何解决过拟合(overfiting)?
  2. 利用cookie显示上次浏览的时间
  3. 集合添加数据类型出现:unhashable type: ‘list‘
  4. opengl 相关资料
  5. 手把手带你写Node.JS版本小游戏
  6. Android中用OpenGL ES Tracer分析绘制过程
  7. Android studio 使用心得(八)----测试程序单元测试
  8. mysql去掉重复数据只保留一条,以及取分组后的一条数据
  9. html在线编辑器 哪个好用,可视化HTML富文本编辑器有哪些?哪个好用?
  10. matlab-博弈演化
  11. 程序开发中版本管理之命名规则及格式
  12. 代码走查和代码审查_代码审查是个好主意的其他原因
  13. 韦根协议——STM32收发
  14. 淘宝联盟api对接,实现优惠券查询功能
  15. 《指弹:周杰伦青花瓷》
  16. Airtest双11领喵币代码
  17. What?Poly又双叒叕发新品了?
  18. 【自然语言处理基础技能(NLP)】jieba中文文本处理
  19. 计算机网络抓包工具——tcpdump详解
  20. 基于CPLD的主板上电时序控制--状态机方式

热门文章

  1. CSS3基础(4)——CSS3 渲染属性
  2. SFC游戏<战区88>,买100W战斗机的测试
  3. python---导入 py文件
  4. [转] MATLAB快捷键
  5. 企业经营核心要素框架
  6. 视频片段怎么做成gif图?快试试这2种方法
  7. *p++,*(p++),*++p,(*p)++区别?
  8. Qt5鼠标移动事件 抖动问题
  9. Arduino学习笔记:基本直流电机驱动
  10. 不是每个捕鱼都叫捕鱼达人:Cocos精品《捕鱼达人4》华丽升级