LPSTR类型的字符串就是char类型的字符串指针
char类型的数据是我们编程必须面对的,网络数据传过来都是char类型,最底层的处理离不开char和char*的数据处理。百度了好久,发现了汗牛充栋的理论,也没有找到几个实用而现成的例子。
例如:
LPSTR:指向一个字符串的32位指针,每个字符占1个字节。
LPCSTR:指向一个常量字符串的32位指针,每个字符占1个字节。
LPTSTR:指向一个字符串的32位指针,每个字符可能占1个字节或2个字节。
LPCTSTR:指向一个常量字符串的32位指针,每个字符可能占1个字节或2个字节。
这样的东西对初学者如云里雾里。今天总算自己摸透了这点东西,分享给初学者。
一、在VS2019里建立一个win32的界面程序(一路“下一步”就可以建立)
二、应用场景:在新建立的窗口客户区中我们要显示char类型的字符串(假设为TCP/IP传过来的char类型数据),分若干行文字显示,象聊天软件一样显示。
三、具体操作:我们肯定是要在窗口过程函数的case WM_PAINT:消息下面来做这项工作的。
四、分析:
win32里面实现这一功能的函数有两个:
DrawTextW(…);
TextOutW(…);
这两个函数要求输入的字符串必须是LPCWSTR类型,这中间必须把char类型转化为它,才能在窗口显示你想显示的内容。
不喜欢废话,上代码:
case WM_PAINT:
{
//声明一个逻辑字体句柄为静态变量//创建逻辑字体
static HFONT hFont= CreateFont(
-15,//高度
-7.5,//宽度
0,//不用管
0,//不用管,
400, //一般这个值设为400,
FALSE, //不带斜体,
FALSE, //不带下划线
FALSE, //不带删除线,
DEFAULT_CHARSET, //这里我们使用默认字符集,还有其他以 _CHARSET 结尾的常量可用
OUT_CHARACTER_PRECIS, CLIP_CHARACTER_PRECIS, //这行参数不用管
DEFAULT_QUALITY, //默认输出质量
FF_DONTCARE, //不指定字体族
L"微软雅黑" //字体名
);
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd, &ps);
//正确定义方法1
//LPSTR TMPT=NULL; //正确用法
//TMPT = new char[1024]; //正确用法,运行中要防止内存泄露
//memset(TMPT, 0, 1024); //正确的姿势
//正确定义方法2(定义在栈上)
//char TMPT[1024];
//正确定义方法3(等同2,定义在堆上)
char* TMPT = new char[1024]; //正确用法
memset(TMPT, 0, 1024); //正确用法
for (INT i = 0; i < 150; i++)
{
//正确1,但是不能字符串拼接,注意sizeof()+24
//strcpy_s(TMPT,sizeof(TMPT)+24, "PYX的第%d次调用函数\n");
//正确2,而且可以进行字符串拼接,注意sizeof()+24
//sprintf_s(TMPT, sizeof(TMPT)+24, "PYX的第%d次调用函数\n", i);
//正确3,而且可以进行字符串拼接,注意strlen结果必须乘以2
//sprintf_s(TMPT, (int)strlen("PYX的第%d次调用函数\n")*2, "PYX的第%d次调用函数\n", i);
//正确4,而且可以进行字符串拼接,注意使用TMPT定义的大小1024
sprintf_s(TMPT, 1024, "PYX的第%d次调用函数\n", i);
//计算char类型字符串TMPT转化为宽字节字符串(UNICODE)以后的字节数
int num = MultiByteToWideChar(0, 0, TMPT, -1, NULL, 0);
wchar_t* wideChar = new wchar_t[num];
MultiByteToWideChar(0, 0, TMPT, -1, wideChar, num);
//sizeNum是为TextOutW函数的最后一个参数Buffer缓冲区的大小做准备,
//要精确匹配字符串的长度,sizeNum太大,字符串结尾输出乱码,sizeNum太小会截断字符串输出
//计算sizeNum要区分奇数还是偶数
//sizeNum加2还是加3,或者加4,取决于LPSTR类型还是char类型
//int sizeNum = strlen(TMPT) ;
//if (sizeNum%2==0)
//{
// sizeNum = sizeNum+3 ;//如果偶数增加三个字节,和\0补齐字符串
//}
//else
//{
// sizeNum = sizeNum+4 ;//如果奇数增加四个字节,用\0结束字符串
//}
//更简单的方法(上面是C库的函数,不提倡在win32里面用)
int sizeNum = lstrlenW(wideChar)-1;//-1是为了去掉\0结束符
TextOutW(hdc, 50, 20 * i, wideChar, sizeNum);
delete[]wideChar;
}
delete[]TMPT;
EndPaint(hWnd, &ps);
}
break;