从0开始的WinAPI学习(1)——初识WinAPI

WindowsAPI程序的入口函数为WinMain

下面是一个最基本的WinAPI程序,用于打印 “hello world”

#include<Windows.h>

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
	MessageBox(NULL, TEXT("Hello World"), TEXT("Caption"), MB_OKCANCEL | MB_ICONINFORMATION | MB_DEFBUTTON2);
	return 0;
}

运行结果如下:
请添加图片描述

分析源码内容:
其中MessageBox为窗口函数,前一个TEXT为内容,后一个TEXT为标题,MB_OKCANCEL 表示消息框将显示一个“确定”按钮和一个“取消”按钮,MB_ICONINFORMATION 表示消息框将显示一个感叹号图标,MB_DEFBUTTON2 表示将第二个按钮(在这种情况下是“取消”按钮)设置为默认按钮,即我们对程序按下回车键的话会选择第二个选项执行。

这些函数句柄后面后会有详细表述,这里就不过多赘述了

此外,在上述示例代码中,WinMain函数中有四个函数参数,分别是:

  • 1.HINCTANCE hInstancehInstance 是一个表示当前应用程序实例的句柄(handle)。使用 hInstance 可以访问应用程序的资源,比如图标、对话框、菜单等。在编写 Windows 应用程序时,通常需要在启动应用程序时获取 hInstance,以便正确地加载和使用这些资源。

  • 2.HINSTANCE hPrevInstacehPrevInstance 是一个表示先前实例的句柄(handle)的参数。这个参数通常用于指示先前运行的实例是否仍然在内存中。在早期的 Windows 版本中,当一个应用程序被启动时,Windows 会检查是否已经有一个相同的实例正在运行。如果是,则将先前的实例句柄传递给新实例,以便新实例可以与先前的实例进行通信或共享资源。但是,从 Windows XP 开始,这个参数始终为 NULL,因为 Windows 已经不再使用它来传递先前实例的句柄。因此,虽然 hPrevInstance 参数仍然存在于 WinMain 函数的参数列表中,但它基本上被弃用了,现在几乎总是被设置为 NULL。在编写 Windows 应用程序时,通常不需要关注 hPrevInstance 参数。

  • 3.LPSTR lpCmdLine:这是一个指向应用程序命令行参数字符串的指针,不包括可执行文件名。要获取整个命令行,可以调用GetCommangLine函数,例如,在D盘下有一个111.txt文件,当我们用鼠标双击启动这个.txt文件的时候,我们先启动的是记事本程序,此时系统会将D:\111.txt作为命令行参数传递给记事本程序的WinMain函数,记事本程序在得到这个文件的路径后,就会在窗口中显示该文件。

  • 4.int nCmdShow:指定应用程序最初如何显示,例如这里是正常显示,但我们还可以将窗口最大化显示等多种显示方式

介绍完了WinMain的参数,下面来讲一下MessageBox函数,其同样也包含四个参数:

int
WINAPI
MessageBoxW(
    _In_opt_ HWND hWnd,            //窗口句柄
    _In_opt_ LPCWSTR lpText,       //要显示的消息内容
    _In_opt_ LPCWSTR lpCaption,    //消息框标题
    _In_ UINT uType);              //消息框显示的图标和按钮样式

MessageBox函数的功能是显示一个参数提示框,其中可以包含一个系统图标,一组按钮、一个消息标题和一条简短的消息内容,这个函数有很多常量,这里会一一给大家介绍

这里是一些按钮的样式:

常量显示的按钮
MB_ABORTRETRYIGNORE中止、重试和忽略
MB_CANCELTRYCONTINUE取消、重试和忽略
MB_HELP确定、帮助
MB_OK确定
MB_OKCANCLE确定、取消
MB_RETRYCANCEL重试、取消
MB_YESNO是、否
MB_YESNOANCEL是、否和取消

这是一些图标的样式:

常量显示的图标
MB_ICONEXCLAMATION感叹号图标
MB_ICONWARNING感叹号图标
MB_ICONINFORMATION在一个圆圈中有一个小写字母i组成的图标
MB_ICONASTERISK在一个圆圈中有一个小写字母i组成的图标
MB_ICONQUESTION问号图标
MB_ICONSTOP停止标志图标
MB_ICONERROR停止标志图标
MB_ICONHAND停止标志图标

虽然它们的描述相同,但具体的图标还是有一些区别的

下面是用来指定消息框默认按钮的参数,按下Enter键就相当于单击了这个按钮

常量含义
MB_DEFBUTTON1第1个按钮是默认按钮
MB_DEFBUTTON2第2个按钮是默认按钮
MB_DEFBUTTON3第3个按钮是默认按钮
MB_DEFBUTTON4第4个按钮是默认按钮

MessageBox函数执行成功会返回一个整数值,用于指明用户单击了哪个按钮,如下表

返回值含义
IDABORT单击了中止按钮
IDCANCEL单击了取消按钮,若消息框有取消按钮,则当按下Esc键或单击取消按钮时,函数都将返回IDCANCEL
IDCONTINUE单击了继续按钮
IDIGNORE单击了忽略按钮
IDNO单击了否按钮
IDOK单击了确定按钮
IDRETRY单击了重试按钮
IDTRYAGAIN单击了重试按钮
IDYES单击了是按钮

下面是一个示例程序:

#include<Windows.h>

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
	int nRet=MessageBox(NULL, TEXT("Hello World"), TEXT("Caption"), MB_OKCANCEL | MB_ICONINFORMATION | MB_DEFBUTTON2);
	switch (nRet) {
	case IDOK:
		MessageBox(NULL, TEXT("用户单击了确定按钮"), TEXT("Caption"), MB_OK);
		break;
	case IDCANCEL:
		MessageBox(NULL, TEXT("用户单击了取消按钮"), TEXT("Caption"), MB_OK);
		break;
	}
	return 0;
}

当我们单击确定或者取消时,就会显示对应的输出窗口。此外,在这段代码中,出现了非常重要的一个东西——TEXT宏,在头文件中有如下定义

#define __TEXT(quote) L##quote      // r_winnt

#else   /* UNICODE */               // r_winnt

#ifndef _TCHAR_DEFINED
typedef char TCHAR, *PTCHAR;
typedef unsigned char TBYTE , *PTBYTE ;
#define _TCHAR_DEFINED
#endif /* !_TCHAR_DEFINED */

typedef LPCH LPTCH, PTCH;
typedef LPCCH LPCTCH, PCTCH;
typedef LPSTR PTSTR, LPTSTR, PUTSTR, LPUTSTR;
typedef LPCSTR PCTSTR, LPCTSTR, PCUTSTR, LPCUTSTR;
typedef PZZSTR PZZTSTR, PUZZTSTR;
typedef PCZZSTR PCZZTSTR, PCUZZTSTR;
typedef PZPSTR PZPTSTR;
typedef PNZCH PNZTCH, PUNZTCH;
typedef PCNZCH PCNZTCH, PCUNZTCH;
#define __TEXT(quote) quote         // r_winnt

#endif /* UNICODE */                // r_winnt
#define TEXT(quote) __TEXT(quote)   // r_winnt

其中##为”令牌粘贴“,表示把字母L和宏参数拼接在一起。例如,假设宏参数quote是"Hello",那么L##quote就是L"Hello"
也许用代码的形式会更加便于理解:

TCHAR szBuf[] = TEXT("C语言");

至此,我们对WinAPI也许有了一个大概的认知,这一节的内容已经可以带我们离开黑漆漆的控制台窗口了,之后的程序会更加丰富多彩

  • 9
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
消息对话框(MessageBox)是一种常见的对话框控件,通常用于显示简单的信息或提示用户进行某些操作。在Windows操作系统中,MessageBox是一个API函数,可以在各种编程语言中调用。 MessageBox函数的语法如下: ```c++ int MessageBox(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType); ``` 其中,参数含义如下: - hWnd:父窗口句柄,可以为NULL。 - lpText:消息文本,可以是字符串或者资源ID。 - lpCaption:对话框标题,可以是字符串或者资源ID。 - uType:消息类型,可以是以下之一或者它们的组合: - MB_OK:显示一个确定按钮。 - MB_OKCANCEL:显示确定和取消按钮。 - MB_YESNO:显示是和否按钮。 - MB_YESNOCANCEL:显示是、否和取消按钮。 - MB_RETRYCANCEL:显示重试和取消按钮。 - MB_ABORTRETRYIGNORE:显示中止、重试和忽略按钮。 - MB_ICONHAND:显示一个停止图标。 - MB_ICONQUESTION:显示一个问号图标。 - MB_ICONEXCLAMATION:显示一个感叹号图标。 - MB_ICONASTERISK:显示一个星号图标。 MessageBox函数的返回值是用户所选择的按钮的ID,可以根据返回值来判断用户的选择。 下面是一个示例代码: ```c++ #include <windows.h> int main() { MessageBox(NULL, TEXT("Hello world!"), TEXT("MessageBox Demo"), MB_OK); return 0; } ``` 这个程序会弹出一个MessageBox对话框,显示一个“Hello world!”的消息,标题为“MessageBox Demo”,并且只有一个确定按钮。当用户点击确定按钮时,MessageBox函数返回ID为IDOK(一般为1)。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值