博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SDL显示图像和文字
阅读量:4109 次
发布时间:2019-05-25

本文共 4161 字,大约阅读时间需要 13 分钟。

这两天在做一个视频分析软件需要用到SDL显示图像及文字,将阶段成果做一下总结:

SDL本身并没有实际文字的功能,需要用到其扩展库SDL_ttf,下载地址:

http://www.libsdl.org/projects/SDL_ttf/docs/SDL_ttf.html

闲话少说,请看代码(工程环境:VS2005):

#include "stdafx.h"#pragma comment(lib,"SDL.lib")#pragma comment(lib,"SDL2_image.lib")#pragma comment(lib,"SDL_ttf.lib")#include 
#include
#include
#include
#include "SDL.h"#include "SDL_ttf.h"/* 屏幕分辩率 */#define SCREEN_WIDTH 720#define SCREEN_HEIGHT 480#define SCREEN_BPP 32const SDL_Color RGB_Black = { 0, 0, 0 };const SDL_Color RGB_Red = { 255, 0, 0 };const SDL_Color RGB_White = { 255, 255, 255 };const SDL_Color RGB_Yellow = { 255, 255, 0 };void ApplySurface(int x, int y, SDL_Surface* pSrc, SDL_Surface* pDest){ SDL_Rect rect; rect.x = x; rect.y = y; rect.w = pSrc->w; rect.h = pSrc->h; SDL_BlitSurface(pSrc, NULL, pDest, &rect);}char *localeToUTF8(char *src){ static char *buf = NULL; wchar_t *unicode_buf; int nRetLen; if(buf){ free(buf); buf = NULL; } nRetLen = MultiByteToWideChar(CP_ACP,0,src,-1,NULL,0); unicode_buf = (wchar_t*)malloc((nRetLen+1)*sizeof(wchar_t)); MultiByteToWideChar(CP_ACP,0,src,-1,unicode_buf,nRetLen); nRetLen = WideCharToMultiByte(CP_UTF8,0,unicode_buf,-1,NULL,0,NULL,NULL); buf = (char*)malloc(nRetLen+1); WideCharToMultiByte(CP_UTF8,0,unicode_buf,-1,buf,nRetLen,NULL,NULL); free(unicode_buf); return buf;}int main(int argc,char * argv[]){ SDL_Surface *pScreen; SDL_Surface *pBackground; SDL_Surface *pText; SDL_Event myEvent; TTF_Font *font; char szEnglish[] = "Hello World!"; wchar_t wszChinese[] = L"世界,你好!"; /* 初始化 SDL */ if (SDL_Init(SDL_INIT_VIDEO) == -1) return 0; /* 初始化窗口 */ pScreen = SDL_SetVideoMode(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP, SDL_SWSURFACE | SDL_HWSURFACE); if (NULL == pScreen)//检测是否初始化成功 return 0; /* 初始化字体库 */ if (TTF_Init() == -1 ) return 0; /* 设置窗口名字和图标 */ SDL_WM_SetCaption(localeToUTF8("测试SDL显示文字"), NULL); /* 打开simfang.ttf 字库,设字体为20号 */ font = TTF_OpenFont("C:\\Windows\\Fonts\\simhei.ttf", 20); if (font == NULL) { return 0; } /* 显示背景 */ pBackground = SDL_LoadBMP(".\\22.bmp"); if (NULL != pBackground) { ApplySurface(0, 0, pBackground, pScreen); SDL_FreeSurface(pBackground); } /* 设置字体样式(加粗|斜体)*/ TTF_SetFontStyle(font, TTF_STYLE_BOLD | TTF_STYLE_ITALIC); /* 显示英文 */ pText = TTF_RenderText_Solid(font, szEnglish, RGB_Red); if (NULL != pText) { ApplySurface(80, 120, pText, pScreen); SDL_FreeSurface(pText); } pText = TTF_RenderText_Shaded(font,szEnglish,RGB_Red, RGB_White); if (NULL != pText) { ApplySurface(80, 150, pText, pScreen); SDL_FreeSurface(pText); } pText = TTF_RenderText_Blended(font,szEnglish,RGB_Red); if (NULL != pText) { ApplySurface(80, 180, pText, pScreen); SDL_FreeSurface(pText); } /* 显示中文 */ pText = TTF_RenderUNICODE_Solid(font, (const Uint16 *)wszChinese, RGB_Red); if (NULL != pText) { ApplySurface(280, 120, pText, pScreen); SDL_FreeSurface(pText); } pText = TTF_RenderUNICODE_Shaded(font, (const Uint16 *)wszChinese, RGB_Red, RGB_White); if (NULL != pText) { ApplySurface(280, 150, pText, pScreen); SDL_FreeSurface(pText); } pText = TTF_RenderUNICODE_Blended(font, (const Uint16 *)wszChinese, RGB_Red); if (NULL != pText) { ApplySurface(280, 180, pText, pScreen); SDL_FreeSurface(pText); } /* 将缓冲在界面显示出来 */ SDL_Flip(pScreen); /* 事件处理 */ int quit = 0; while (!quit) { if (SDL_PollEvent(&myEvent)) { if (SDL_QUIT == myEvent.type) { quit = 1; } } } return 0;}

我将要点写成了一个DEMO程序:http://download.csdn.net/detail/skywalker_leo/8368025

参考链接:

http://blog.csdn.net/leixiaohua1020/article/details/8652605

http://blog.163.com/niuxiangshan@126/blog/static/17059659520112711935975/

http://www.cnblogs.com/landmark/archive/2012/06/01/2526140.html

你可能感兴趣的文章
维吉尼亚之加解密及破解
查看>>
TCP/IP协议三次握手与四次握手流程解析
查看>>
PHP 扩展开发 : 编写一个hello world !
查看>>
inet_ntoa、 inet_aton、inet_addr
查看>>
用模板写单链表
查看>>
用模板写单链表
查看>>
链表各类操作详解
查看>>
C++实现 简单 单链表
查看>>
数据结构之单链表——C++模板类实现
查看>>
Linux的SOCKET编程 简单演示
查看>>
正则匹配函数
查看>>
Linux并发服务器编程之多线程并发服务器
查看>>
聊聊gcc参数中的-I, -L和-l
查看>>
[C++基础]034_C++模板编程里的主版本模板类、全特化、偏特化(C++ Type Traits)
查看>>
C语言内存检测
查看>>
Linux epoll模型
查看>>
Linux系统编程——线程池
查看>>
Linux系统编程——线程池
查看>>
yfan.qiu linux硬链接与软链接
查看>>
Linux C++线程池实例
查看>>