一:学习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;
}
现在我们提出一个需求,想要在中的文字前面加上一个感叹号图标要怎么做!
查看函数档案,会发现需要传入该参数MB_ICONEXCLAMATION,但是该函数有四个参数,该怎么办呢,这时候要使用成员的或操作符了!
#include
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int CmdShow)
{
MessageBox(NULL, TEXT("我爱你!"), TEXT("表白小程序"), MB_OK | MB_ICONWARNING);
return 0;
}
运行结果:
设置为其他参数,就会有其他的的图标,这里就不演示了!
接下来我们看一下这一组参数的用法!!
在前面的程序可以发现打开后,默认的在确定上面,那如果想换到取消上咋,这时候就需要在传入一个参数了!
程序如下:
#include
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int CmdShow)
{
MessageBox(NULL, TEXT("我爱你!"), TEXT("表白小程序"), MB_OKCANCEL | MB_ICONWARNING | MB_DEFBUTTON2);
return 0;
}
接下来我们就来探究一下,为什么用|操作符就可以把这三个参数加起来呢?
可以看到这些参数是定义的宏,那么把这些参数或在一起后,比如: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加上我们的字符串,那是这样的话,我们就可以改一下我们的程序!
我们发现这样也是可以的,那么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把他放到静态区中,不要放在栈中,这是作者的建议!
通过上面的我们可以看到,如果使用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论坛!!!
新手上路,如有错误,请大佬多多指教!!!!