C++ Builder 关于TRichEdit的字符颜色标记处理

//积累经验每一天,以后忘记好搜索

 

void __fastcall TForm2::btn3Click(TObject *Sender)
{
//初始化验证
            mmo->SelStart=0;
            mmo->SelLength=mmo->Text.Length();
            mmo->SelAttributes->Color=clBlack;
String CGh=Edit->Text;
String CGb =CGh.SubString(1,1);
String CGs =CGh.SubString(2,1);
String CGg =CGh.SubString(3,1);
int HH =0;
int Lnum=mmo->Lines->Strings[0].Length()+2;
//HH=Lnum;
String Mtxt = mmo->Text;
for(int i=1;i<=Mtxt.Length();i++)
{
   if(i%Lnum<=14)
    {
        if(Mtxt.SubString(i,1)==CGb)
        {
            mmo->SelStart=i-1-HH;
            mmo->SelLength=1;
            mmo->SelAttributes->Color=clRed;

        }
    }
    else if(i%Lnum<=33 && i%Lnum>14)
    {
        if(Mtxt.SubString(i,1)==CGs)
        {
            mmo->SelStart=i-1-HH;
            mmo->SelLength=1;
            mmo->SelAttributes->Color=clRed;

        }
    }
    else //if(i%Lnum<=52 && i%Lnum>33)
    {
        if(Mtxt.SubString(i,1)==CGg)
        {
            //ShowMessage(mmo->Text.SubString(i-HH,1)) ;
            mmo->SelStart=i-1-HH;
            mmo->SelLength=1;
            mmo->SelAttributes->Color=clRed;

        }
    }
   //-----每一行,会有换行符占二个字节,原本一行是52+2=54
    if(i%Lnum==0)
       HH++;
}
//mmo->SelAttributes->Color=clBlack;
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
要将通过UART串口通信获得的汉字点阵转换为汉字并显示在Memo中,可以按照以下步骤进行操作: 1. 通过UART串口通信获取汉字点阵数据,可以使用C++ Builder自带的TComPort组件或第三方的串口通信库,如TurboPower Async Professional等。 2. 将获取到的汉字点阵数据转换为汉字,可以使用Windows API函数GetFontData和CreateFontIndirect来实现。具体步骤如下: a. 使用GetFontData函数获取汉字点阵数据,需要指定字体名称、字体大小和字符编码等参数。 b. 将获取到的点阵数据转换为16进制字符串。 c. 将16进制字符串转换为汉字,可以使用Windows API函数MultiByteToWideChar和WideCharToMultiByte来实现。 3. 将转换后的汉字显示在Memo中,可以使用Memo的Lines属性来添加文本。 下面是一个示例代码: ```c++ #include <Windows.h> #include <Vcl.ComCtrls.hpp> // 获取汉字点阵数据 bool GetFontData(const wchar_t* fontName, int fontSize, wchar_t ch, std::vector<BYTE>& data) { HDC hdc = GetDC(NULL); HFONT hFont = CreateFontIndirect(&LOGFONT{ fontSize * -GetDeviceCaps(hdc, LOGPIXELSY) / 72, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, DEFAULT_CHARSET, OUT_TT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_SWISS, fontName }); SelectObject(hdc, hFont); DWORD size = GetFontData(hdc, 0, 0, NULL, 0); std::vector<BYTE> buffer(size); DWORD result = GetFontData(hdc, 0, 0, &buffer[0], size); DeleteObject(hFont); ReleaseDC(NULL, hdc); if (result == GDI_ERROR) return false; int glyphIndex = GetGlyphIndicesW(hdc, &ch, 1, NULL, 0); if (glyphIndex == GDI_ERROR) return false; data.resize(size); result = GetFontData(hdc, 0, glyphIndex, &data[0], size); return result != GDI_ERROR; } // 将点阵数据转换为16进制字符串 std::string HexString(const BYTE* data, size_t size) { std::string result(size * 2, '\0'); for (size_t i = 0; i < size; ++i) sprintf_s(&result[i * 2], 3, "%02X", data[i]); return result; } // 将16进制字符串转换为汉字 std::wstring HexToWString(const std::string& hex) { std::wstring result; for (size_t i = 0; i < hex.size(); i += 4) { wchar_t ch = 0; swscanf_s(hex.c_str() + i, L"%04X", &ch); result += ch; } return result; } // 将汉字点阵数据转换为汉字并显示在Memo中 void DisplayChineseCharacter(const wchar_t* fontName, int fontSize, BYTE* data, size_t size, TRichEdit* memo) { std::string hex = HexString(data, size); std::wstring text = HexToWString(hex); memo->Lines->Add(text.c_str()); } // 示例用法 void ExampleUsage() { // 假设从串口中获取到一个字体为"宋体",大小为16的汉字点阵数据,编码为"你"(0xC4E3) wchar_t fontName[] = L"宋体"; int fontSize = 16; wchar_t ch = L'你'; std::vector<BYTE> data; if (GetFontData(fontName, fontSize, ch, data)) { DisplayChineseCharacter(fontName, fontSize, &data[0], data.size(), Memo1); } } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lzksword

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值