从0开始学习《Windows程序设计》:UinCode解决方案

一:学习MessageBox API
详细MessageBox的API档案请点击:https://fishc.com.cn/forum.php?mod=viewthread&tid=46730&extra=page%3D1%26filter%3Dtypeid%26typeid%3D420
转自:鱼C论坛。

#include
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int CmdShow)
{
	MessageBox(NULL, TEXT("我爱你!"), TEXT("表白小程序"), MB_OK);
	return 0;
}

从0开始学习《Windows程序设计》:UinCode解决方案_第1张图片
现在我们提出一个需求,想要在中的文字前面加上一个感叹号图标在这里插入图片描述要怎么做!

查看函数档案,会发现需要传入该参数MB_ICONEXCLAMATION,但是该函数有四个参数,该怎么办呢,这时候要使用成员的或操作符了!

#include
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int CmdShow)
{
	MessageBox(NULL, TEXT("我爱你!"), TEXT("表白小程序"), MB_OK | MB_ICONWARNING);
	return 0;
}

运行结果:
从0开始学习《Windows程序设计》:UinCode解决方案_第2张图片
设置为其他参数,就会有其他的的图标,这里就不演示了!

接下来我们看一下这一组参数的用法!!
从0开始学习《Windows程序设计》:UinCode解决方案_第3张图片
在前面的程序可以发现打开后,默认的在确定上面,那如果想换到取消上咋,这时候就需要在传入一个参数了!
从0开始学习《Windows程序设计》:UinCode解决方案_第4张图片
从0开始学习《Windows程序设计》:UinCode解决方案_第5张图片
程序如下:

#include
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int CmdShow)
{
	MessageBox(NULL, TEXT("我爱你!"), TEXT("表白小程序"), MB_OKCANCEL | MB_ICONWARNING | MB_DEFBUTTON2);
	return 0;
}

接下来我们就来探究一下,为什么用|操作符就可以把这三个参数加起来呢?

从0开始学习《Windows程序设计》:UinCode解决方案_第6张图片
可以看到这些参数是定义的宏,那么把这些参数或在一起后,比如:0010|0101 的结果是0111。 windows只需要检查对应的位是否是1就可以判断是输入了哪个参数了。

二、ASCII导致的问题
美国的标准,只需要7个比特为就能表示所有字符,就能承载美国的文化。
但是我大中国上下五千年文明7个比特位怎能表示全呢?就连我大中华的7000简体汉子都表示不玩,所以windows就提出了一个解决方案,用TEXT把字符串括起来。使用双字节字符集(DBCS),使用ANSI编码标准,但是这有存在一个问题,汉字的编码中有单字节,也有双字节,而英文都是单字节的,这样不方便得到字符串的长度,所以后来又提出了UinCode方案,随着技术发展,内存的扩展,UinCode的解救方案,统一所有的字符使用两个字节来存放。这样不管是中文还是英文都使用两个字节来存放,那么就很方便计算长度了。还有一点是把所有国家的语言都扔进字符集里面,这样就不会出现把简体中文给了繁体中文的朋友,会解析出乱码的情况了。那对C语言有了解的朋友知道,后C语言加了一个wchar_t类型,这样就可以对汉子很好的支持了。

#include
#include
#include

int main()
{
	wchar_t str[] = L"我爱你";
	setlocale(LC_ALL, "Chs");
	printf("%ls  %lc\n", str, str[1]);
	return 0;
}

讲到这,我们再来看一下,TEXT是什么呢?我们点击转到定义。

在这里插入图片描述
在这里插入图片描述
那么我们可以看出,这又是一个宏,(##是成员中的宏的黏贴符)是L加上我们的字符串,那是这样的话,我们就可以改一下我们的程序!
从0开始学习《Windows程序设计》:UinCode解决方案_第7张图片
我们发现这样也是可以的,那么TEXT实际上就是做了这样一种替换。也就是Windows就是在字符串前面加上一个L,来把它变成宽字符!
那为什么要是使用TEXT,不用L呢?
在C语言中我们用char定义一个一个字节的字符,用wchar_t定义一个宽字符,但是在windows这两个我们都不用,我们使用TCHAR,那TCHAR又是个什么东西呢?
在这里插入图片描述
我们可以看到,TCHAR就是WCHAR.

#include
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int CmdShow)
{
	TCHAR *szContent = TEXT("小姐姐,我是XXX, 我是坐在你对面那个他\n你喜欢我吗!");
	static TCHAR szCaption[] = TEXT("表白小程序");
	int result = MessageBox(NULL, szContent, szCaption, MB_OKCANCEL | MB_ICONWARNING);
	return 0;
}

那在windows中我们定义字符呢,我们就可以这样写了,有两种方式,一种是字符指针,一种是字符数组,字符数组呢,建议加上static把他放到静态区中,不要放在栈中,这是作者的建议!
从0开始学习《Windows程序设计》:UinCode解决方案_第8张图片
从0开始学习《Windows程序设计》:UinCode解决方案_第9张图片
通过上面的我们可以看到,如果使用UinCode字符串,就使用WCHAR, 如果不是,那TCHAR就是char, 使用单字节编码。那字符串里面什么内容,那TEXT就是什么内容。

如果还有朋友对Uincode感兴趣的朋友,可以看这篇文章!《第002讲:Unicode 的解救方案》
https://fishc.com.cn/forum.php?mod=viewthread&tid=47025&extra=page%3D1%26filter%3Dtypeid%26typeid%3D407
转自鱼C论坛!!!

新手上路,如有错误,请大佬多多指教!!!!

你可能感兴趣的:(从0开始学习《Windows程序设计》:UinCode解决方案)