C++实现第一个Windows程序设计Hello World

C++实现第一个Windows程序设计

目录结构:

控制台的”Hello World”

先回顾一下C语言控制台通过标准输入输出函数输出"Hello world"

#include <stdio.h>
int main(){
printf("Hello World");
return 0;
}

Windows版的”Hello World”

再来看一下Windows版的Hello World!

#include <windows.h>

int WINAPI WinMain(HINSTANCE hInstance ,HINSTANCE hPrevInstance,PSTR szCmdLine,int iCmdShow ){

    MessageBox(NULL,TEXT("Hello World"),TEXT("MessageBox"),0);

    return 0;
}

在VS上编译该代码:打开 解决方案资源管理器 ,右键项目,选择调试->启动新实例,经过编译运行就可得到一个对话框了。

标题是MessageBox,内容为Hello World。一切都是那么的美好。


WinMain函数的参数

1>. WinMain的第一个参数 HINSTANCE hInstance, 用书上的解释为”实例句柄”, 由于第一次接触C语言Windows程序设计, 对这个句柄的概念也不是很了解, 去百科了下, 句柄的解释为:

一个句柄是指使用的一个唯一的整数值,即一个四字节长的数值,来标志应用程序中的不同对象和同类对象中的不同的实例,诸如,一个窗口,按钮,图标,滚动条,输出设备,控件或者文件等。"——引用自百度百科->句柄。

笔者是这样对句柄进行理解的, 在一个应用程序中, 通常创建了很多的窗口、按钮、标签, 或者使用了一个文件等, 在程序的任何地方, 只要能够获得这个被称为句柄的东西, 就能够找到该控件或者窗口在内存中的位置, 从而对其进行操作。感觉有点像带参数的main函数, 只是这里的主函数参数为一个句柄。

2>. WinMain函数的第二个参数, 同样是个实例句柄, 但书上又进一步解释说在32位的Windows程序设计中, WinMain函数的实例句柄概念已不再采用, 因此WinMain的第二个参数通常总是NULL。

3>. WinMain的第三个参数是用来运行程序的命令行, PSTR: 用来指向一个字符串的指针类型, szCmdLine, sz:表示以0结尾的字符串; 目的是通过命令行方式运行程序并向主函数中传入参数, 应该就像给main函数传入参数一样;

4>. WinMain的第四个参数是一个int型参数, 用来指明程序(窗口)最初如何被显示, 例如最小化?最大化?全屏?

笔者的见解: 应该很有用, 经常见一些游戏一启动就是全屏的, 但是这个参数也是操心系统传给程序的么?因为从平时运行Windows程序时都是直接双击, 并没有通过命令行给它传入参数, 在编程时应该对程序启动时的显示方式有交代才对, 这样系统再运行时再把这个交代的参数传入给程序告诉程序启动时应该如何显示.

(在”笔者的见解”部分的观点均为笔者个人的见解, 如果有误肯定指正, 我会及时更正, 避免误导其他读者。)

WinMain函数函数体的MessageBox函数

MessageBox(), 名如其”人”, 不用猜也知道这个就是显示一个对话框的函数, 打开API文档,MSDN Library通过索引找到MessageBox函数, 发现其声明如下:

int MessageBox(
  HWND hWnd,          // handle of owner window, 窗口的一个句柄
  LPCTSTR lpText,     // address of text in message box, 一个文本(字符串)的指针
  LPCTSTR lpCaption,  // address of title of message box, 标题字符串的指针
  UINT uType          // style of message box, 对话框的风格
);

在上面示例中对MessageBox函数的调用如下:

MessageBox( NULL, TEXT("Hello,world!"), TEXT("MessageBox"), 0 );

第一个参数窗口的句柄的实参为NULL, 意思为不属于任何窗口.
第二个参数为对话框的内容, 第三个参数为对话框的标题, 但是这两个参数都使用了一个TEXT()的函数, 书上讲使用TEXT()的目的是将这些字符串打包到TEXT宏代码里面, 笔者尝试了不用这个TEXT()函数而直接像这样:

MessageBox( NULL, "Hello,world!", "MessageBox", 0 );

调用并没有出现警告或者报错信息, 具体使用TEXT()函数的详细原因还不太清楚, 暂时先在这里画个圈。

第四个参数为对话框的风格, 一些以MB_开头的一些常量的组合, 可以使用OR(|)运算进行组合, 这些常量定义在WINUSER.H中, 例如常用的有:

1>.对话框按钮类型:

    #define MB_OK                       0x00000000L            //仅有一个"确定"按钮
    #define MB_OKCANCEL                 0x00000001L            //"确定" + "取消"
    #define MB_ABORTRETRYIGNORE         0x00000002L            //"终止" + "重试" + "忽略"
    #define MB_YESNOCANCEL              0x00000003L            //"是" + "否" + "取消"
    #define MB_YESNO                    0x00000004L            //"是" + "否"
    #define MB_RETRYCANCEL              0x00000005L            //"重试" + "取消"

2>.对话框中的图标类型:

#define MB_ICONHAND                 0x00000010L            //一个红X的错误/停止图标
#define MB_ICONQUESTION             0x00000020L            //一个问号的询问图标
#define MB_ICONEXCLAMATION          0x00000030L            //一个黄色感叹号的警告图标
#define MB_ICONASTERISK             0x00000040L            //一个带有i的信息提示图标

同时, 在这些图标中有的还可以用其他名称代替, 这些别名在WINUSER.H的定义如下:


#define MB_ICONWARNING              MB_ICONEXCLAMATION         //警告
#define MB_ICONERROR                MB_ICONHAND                //错误
#define MB_ICONINFORMATION          MB_ICONASTERISK            //信息
#define MB_ICONSTOP                 MB_ICONHAND                //停止

博主:Now大牛
QQ : 201309512
发布日期:2017-08-15

发布了23 篇原创文章 · 获赞 24 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/qq_35445306/article/details/77173538