首先,我们从WIN10系统以下路径中找到字体库:simsun.ttc,他的路径一般为:

C:\Windows\Fonts

文件夹中的宋体,常规即是我们要的内容

将其拷贝出来,即可作为我们显示时所用的字体库。

SDL显示字体的一般流程为:

首先使用SDL_CreateWindow;以及SDL_CreateRenderer函数分别创建SDL窗口以及窗口对应的渲染器。

1. 使用TTF_OpenFont()函数打开字体库,同时设置字体大小;

2. 根据打开的字体库,要显示的内容以及字体颜色创建文本表面Surface,根据你采用的编码不同使用的函数为:(本文推荐采用UNICODE编码,这意味着字符需要采用16位来表示,这样可以同时显示中英文内容)

TTF_RenderText_Blended(TTF_Font *font,
                const char *text, SDL_Color fg);
TTF_RenderUTF8_Blended(TTF_Font *font,
                const char *text, SDL_Color fg);
TTF_RenderUNICODE_Blended(TTF_Font *font,
                const Uint16 *text, SDL_Color fg);;

3. 根据得到的Surface使用SDL_CreateTextureFromSurface()函数创建纹理Texture;

4. 使用SDL_RenderCopy()函数将文本纹理复制到窗口渲染器,以及使用SDL_RenderPresent(pWndRenderer);   将渲染器内容显示出来;

5. 使用    SDL_DestroyTexture(pTextTexture);  SDL_FreeSurface(pTextSurface);函数释放Surface以及Texture。通常这2个函数的错误使用往往会照成多次显示内容后,内存疯狂泄露,解决办法是:每使用一次TTF_RenderUNICODE_Blended()、SDL_CreateTextureFromSurface()函数,就执行一次对应的释放函数,注意是每一次。

假如你在某个调用函数中多次执行这2个函数,而只在该函数退出前执行了一次对应的内存释放,恭喜你,你的操作将会造成大量的内存泄露,不信你放在while循环里泡个几百遍看看

记住是每使用一次TTF_RenderUNICODE_Blended()、SDL_CreateTextureFromSurface()函数,在退出前就执行一次对应的释放函数,注意是每一次,而不是退出时仅执行一次。

6. 注意事项:如果你要显示出来的字体无失真,不要自己指定显示内容所需要的区域大小,而是指定显示起始位置,使用TTF_SizeUNICODE()函数计算所需要的显示区域,如果需要调整字体大小,请使用TTF_OpenFont()函数更改。这样你的字体才能保证不失真变形。

以下是代码部分:

首先是主函数:

int main()
{

SDL_Window* pSDLWindow = NULL;  //sdl窗口
    SDL_Renderer* pWndRenderer = NULL;//窗口渲染器

wchar_t display_word[] = L"H***************你好啊,jackiewmt!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*";

//初始化SDL  
    if (SDL_Init(SDL_INIT_EVERYTHING) < 0) return -1;

//创建窗口  
    pSDLWindow = SDL_CreateWindow("SDLWind", 200, 200, 1600, 800, SDL_WINDOW_RESIZABLE);
    if (NULL == pSDLWindow) return -1;

//创建窗口渲染器
    pWndRenderer = SDL_CreateRenderer(pSDLWindow, -1, 0);
    
    sdl_OutWord(pSDLWindow, pWndRenderer,display_word);

SDL_Event sdl_event;
    bool bQuit = false;
    while (!bQuit)
    {
        
        if (SDL_PollEvent(&sdl_event))
        {
            switch (sdl_event.type)
            {
            case SDL_QUIT:
                bQuit = true;
                break;
            case SDL_WINDOWEVENT:
            {
                if (sdl_event.window.event == SDL_WINDOWEVENT_RESIZED)
                {    
                    SDL_DestroyRenderer(pWndRenderer);
                    pWndRenderer = SDL_CreateRenderer(pSDLWindow, -1, 0);
                    //创建窗口渲染器
                    sdl_OutWord(pSDLWindow, pWndRenderer, display_word);

printf("一次  ");
                    break;
                }
                else
                    break;
            }
            default:
                break;
            }
        }
    }
    SDL_DestroyRenderer(pWndRenderer);
    SDL_DestroyWindow(pSDLWindow);

}

然后是调用函数部分:

void sdl_OutWord(SDL_Window* pSDLWindow, SDL_Renderer* pWndRenderer, wchar_t* display_word)
{
    
    
    SDL_Surface * pTextSurface = NULL;//文本表面
    SDL_Texture* pTextTexture = NULL;//文本纹理

int Font_size = 32;

//文本显示区域
    SDL_Rect rcText;
    rcText.x = 0;
    rcText.y = 0;
    rcText.w = 0;
    rcText.h = 0;

//设置窗口背景色
    SDL_SetRenderDrawColor(pWndRenderer, 120, 120, 120, 255);
    //用设置的颜色清屏窗口渲染器
    SDL_RenderClear(pWndRenderer);

//初始化字体库
    if (TTF_Init() == -1)
        return;
    //打开字体
    TTF_Font *font;
    font = TTF_OpenFont("data/simsun.ttc", Font_size);
    if (!font)
    {
        printf("TTF_OpenFont: Open simsun.ttf %s\n", TTF_GetError());
        return;
    }
    
    TTF_SizeUNICODE(font, (const Uint16 *)display_word, &rcText.w, &rcText.h);//计算所需要的显示区域大小

//创建文本表面
    SDL_Color color2 = { 255,255,255 };
    pTextSurface = TTF_RenderUNICODE_Blended(font, (Uint16*)display_word, color2);

//创建文本纹理
    pTextTexture = SDL_CreateTextureFromSurface(pWndRenderer, pTextSurface);

//将文本纹理复制到窗口渲染器
    SDL_RenderCopy(pWndRenderer, pTextTexture, NULL, &rcText);  // NULL means that use all texture( and renderer)  
    
    //刷新窗口渲染器的显示
    SDL_RenderPresent(pWndRenderer);

//清理  
    TTF_CloseFont(font);
    TTF_Quit();
    SDL_RenderClear(pWndRenderer);
    SDL_DestroyTexture(pTextTexture);
    SDL_FreeSurface(pTextSurface);
    return ;
    }
显示效果如下:

当然,这个函数也有弊端,那就是当你缩小显示区域的时候,会发现显示部分超出了显示框,像下面这样:

所以也可以稍作更改,将显示内容做到自动换行,具体效果如下:

至于具体实现,下次有空了再发吧。

关于SDL混合显示中英文标准字体的方式以及SDL显示可能带来的内存泄露相关推荐

  1. android字体有些显示不正常显示,android系统字体调到超大后显示不全

    昨天遇着这样一个Bug,系统设置里把字体设置为超大后并切换为英文模式下,程序中的字体便显示不全. 在这里总结一下,常用解决解决办法有两个: 一.在xml文件里设置字体: 把字体大小从textSize= ...

  2. ivx中字体显示_html-中文字体在CSS中的显示(Unicode编码)(转载)

    为了方便需要的朋友快速使用,下表中列出了一些常用中文字体的Unicode编码: 宋体                   SimSun     \5B8B\4F53 黑体                ...

  3. android字体有些显示不正常显示,为什么iconfont字体图标在安卓机上显示不出来

    模拟器和ios上都能正常显示,但安卓机上显示不了,准确地说显示为一个带框的X css代码如下: @font-face { font-family: "iconfont"; src: ...

  4. freetype显示中英文

    freetype显示中英文 参考博客: 04.freetype显示中文_//查无此人的博客-CSDN博客_freetype 中文 freetype的安装与使用_explore_world的博客-CSD ...

  5. MATLAB画图中英文不同字体混合显示标题、坐标轴标签(完美解决方案)

    MATLAB是吾等理工狗常用的求生工具.在画图时对中英文标题均支持较好,但学术出版物常常对字体有所要求.对于英文出版物一切好说,设置成相应字体即可.而对于中文出版物.中文毕业论文.报告,则常常需要混合 ...

  6. matplotlib设置中英文多种字体混合坐标轴名称

    在利用matplotlib绘图时,常常需要添加图例与坐标轴名称,而在论文中,对中英文有严格的不同的字体要求,但默认的方法中(如下所示),无法分别为中文.英文指定不同字体(如下图),因此需要借助其他方法 ...

  7. 通过字体映射 Fontlink 美化中文显示

    通过字体映射 Fontlink 美化中文显示 声明:以下均是个人见解,非引战 目前最好的编程字体当属 Fira Code 了,而最好的中文字体当属方正兰亭黑了.在 Fira Code - Github ...

  8. 中英文怎么算 字符长度_如何将混合了中英文及不同数量空格的文本,快速拆分成多列...

    前段时间学员小D咨询到:有什么简便的方法,可以将将混合了中英文及不同数量空格的文本,快速拆分成多列?下图所示是小D的问题: 小D需要将这列数据拆分成如下图所示的4列数据: 刚一开始看到这个表格的时候, ...

  9. cdr文字内容显示不出来_cdr中字体预览不显示 字体安装后cdr不显示

    换了cdr2017,字体在子菜单里显示不出来? 我已经厌倦这个问题快半年了.最后,我自己摸索.找到显示方法.首先打开CDR 017版本.输入字体并选择字体.然后单击[字体列表]在头部顶部显示四个小图标 ...

最新文章

  1. XenApp_XenDesktop_7.6实战篇之八:申请及导入许可证
  2. 第三方医药物流的现状及发展
  3. Web API应用架构设计分析(1)
  4. 以太网、局域网、互联网区别
  5. C++前插法实现链表
  6. SAP Spartacus 最后渲染出的页面和后台 CMS 页面元数据的一一对应
  7. Python程序生成.exe的可执行文件
  8. linux修改端口cost值,Linux下通过修改网卡驱动的参数调整Intel网卡的性能
  9. win10家庭版 安装docker并成功使用
  10. python批处理将图片进行放大实例代码
  11. html 进度条roll,js实现增加数字显示的环形进度条效果
  12. vsan Linux 网络磁盘,理解vSAN中的磁盘空间占用
  13. jquery 获取同级元素_如何在jQuery中获取元素的同级
  14. vue3.0 音频插件(vue-aplayer)
  15. Web渗透测试之信息收集
  16. 小学教师计算机培训记录内容,中小学教师信息技术培训计划
  17. VMware使用OVFTool导入虚拟机
  18. 解决CentOS7 安装后无法识别windows分区问题
  19. 什么是应届生?要不要签三方?看看就知道了
  20. Docker:Unable to find image ‘mysql:latest‘ locally

热门文章

  1. 计算机主机的光驱怎么打开,笔记本光驱怎么打开【方法步骤】
  2. 全世界都在劝退学Android的程序员
  3. access调整行高和列宽_access数据表中改变行高和列宽有哪几种方法?
  4. C语言 结构体,内存对齐,对齐参数,偏移量
  5. python查看数据类型的方法_pycharm下查看python的变量类型和变量内容的方法
  6. 【JZOJ5263】分手是祝愿
  7. 自定义Toolbar去掉默认项目名称
  8. 俄罗斯陨石坠落伤者超过100人
  9. 【清橙A1094】【牛顿迭代法】牛顿迭代法求方程的根
  10. 京东系再添新力军,物流整合再提速,快递企业未来路在何方?