SDL显示图像和文字

这两天在做一个视频分析软件需要用到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 <stdio.h>
#include <stdlib.h>
#include <string>
#include <Windows.h>

#include "SDL.h"
#include "SDL_ttf.h"

/* 屏幕分辩率 */
#define  SCREEN_WIDTH   720
#define  SCREEN_HEIGHT  480
#define  SCREEN_BPP     32

const 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/[email protected]/blog/static/17059659520112711935975/

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

时间: 2024-11-15 05:40:44

SDL显示图像和文字的相关文章

UIKit框架之UIButton详解

UIKit框架是iPhone应用程序开发中最基本的框架,也是用得最多.最重要的框架,今天要和大家分享的就是UIKit中的UIButton相关知识,一起来看看吧. 1.实例化: 1.1.init方式: 1 UIButton *button = [[UIButton alloc] initWithFrame:rect]; 1.2.类方法方式: 1 UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 其中按钮类型枚

FFmpeg学习2:解码数据结构及函数总结

在上一篇文章中,对FFmpeg的视频解码过程做了一个总结.由于才接触FFmpeg,还是挺陌生的,这里就解码过程再做一个总结.本文的总结分为以下两个部分: 数据读取,主要关注在解码过程中所用到的FFmpeg中的结构体. 解码过程中所调用的函数 在学习的过程主要参考的是dranger tutorial,所以跟着教程在本文的最后使用SDL2.0将解码后的数据输出到屏幕上. 数据的读取 一个多媒体文件包含有多个流(视频流 video stream,音频流 audio stream,字幕等):流是一种抽象

0821基础控件(UIButton常用属性)

一.可以通过代码的方式创建UIButton 1.通用实例化对象方法: UIButton *button = [[UIButton alloc] initWithFrame:rect]; 2.快速实例化对象方法: UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 提示: 在OC开发中,实例化任何类型的非自定义对象,都请首先尝试一下是否存在快速定义方法.如果存在快速定义方法,就尽量不要使用init之类的方法实例

移动开发(IOS) – UIKit框架

1.UIView 1.1.所有 UI 控件都继承自 UIView. 1.2.每一个 UIView 都是一个容器,可以容纳其他 UIView.其中容器视图被称为父视图,而被包含的视图或者控件被成为子视图或者子控件. 1.3.视图对应的文件通常是 storyboard 或者 xib 文件.在许多 iOS 应用程序中,通常不必为视图编写任何代码. 1.4.UIView 负责界面的显示. 1.5.常用属性: superview 获得自己的父控件对象 subviews 获得自己的所有子控件对象 一个视图最

VAST3.0规范

VAST3.0视频广告投放规范 Posted on 2014年2月15日 1.术语 随着视频广告行业的发展,某些术语已经得到了广泛的采用.以下定义该文档中与视频广告投放相关的一些术语: 广告荚(Ad Pod):广告荚是一序列线性广告(Linear ads )来回播放,像多个电视插播广告,属于一个商业的暂停休息. 伴随广告(Companion Ad):通常是页面的显示横幅广告(banner)或富媒体(rich media)广告,这些广告出现在视频播放器之外.伴随广告在相关In-Stream广告结束

C#开发小技巧

001.判断一个Form是否已关闭并释放,需要从引用和对象两方面来判断,判断引用是否为null:mainfm==null判断引用的对象是否已释放:mainfm.IsDisposedMainFormmainfm;......privatevoidbutton_ok_Click(objectsender,EventArgse){if(mainfm==null||mainfm.IsDisposed){mainfm=newMainForm();mainfm.Show();}else{mainfm.Sho

alt text 与 tooltip区别

在做工具的Accessiblity测试时, 对于image对象,一直分不清它的alt属性与tooltip属性的区别与用法, 从网上查了下, 比较认同这样的观点: alt属性: alternative text, 是在浏览器不能显示图像的时候用来代替图像而显示的文字.本质上讲,用户看到的要么是图像,要么是alt文字,但是用户不能即看到图片,又看到它的替代文字. tooltip属性:用于对图像进行补充说明的文字, 用户将鼠标移动到图像上, 鼠标附近跳出一段描述性的文字. 用法: 使用alt属性来显示

第3课、UIButton的常用属性

一. 可以通过代码的方式创建UIButton 1. 通用实例化对象方法: UIButton *button = [[UIButton alloc] initWithFrame:rect]; 2. 快速实例化对象方法: UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 提示: 1) 在OC开发中,实例化任何类型的非自定义对象,都请首先尝试一下是否存在快速定义方法. 如果存在快速定义方法,就尽量不要使用init

【C语言探索之旅】第三部分第三课:SDL开发游戏之显示图像

内容简介 1.第三部分第三课: SDL开发游戏之显示图像 2.第三部分第四课预告: SDL开发游戏之事件处理 第三部分第三课:SDL开发游戏之显示图像 上一课中,我们学习了如何加载SDL库(SDL_Init),释放SDL库(SDL_Quit),如何打开一个窗口(Window),如何使用表面(Surface). 这些都是SDL库最最基本的操作.暂时,我们只会给窗口自带的表面上点颜色,好像挺乏味的. 这一课我们来学习如何插入图片.上一课我们说过,SDL中绘制图样需要在Surface上进行.Surfa