LPSTR类型的字符串用法

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;

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值