视频图像处理系列索引 || Arcgis/Engine/Server开发索引 || Web Map Gis开发索引 || jquery表格组件 JQGrid索引
WPF MVVM模式开发实现简明教程索引 || ArcGIS Runtime WPF(.net C#)开发简明教程索引

SDL第一个程序:加载一张图片

直接看代码吧

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

 

namespace WindowsFormsApplication1

{

    public partial class Form1 : Form

    {

        int flags = (Tao.Sdl.Sdl.SDL_INIT_VIDEO | Tao.Sdl.Sdl.SDL_INIT_TIMER |Tao.Sdl.Sdl.SDL_INIT_AUDIO);

 

        IntPtr surfacePtr;

        Tao.Sdl.Sdl.SDL_Rect rect;

        int width = 640, height = 480;

 

        public Form1()

        {

            InitializeComponent();

 

            int i = 0;

            i = Tao.Sdl.Sdl.SDL_Init(flags);

            if (i != 0)

            {

                MessageBox.Show("SDL初始化失败!");

                return;

            }

 

Tao.Sdl.Sdl.SDL_WM_SetCaption("SDL", "MY 1ST SDL");

IntPtr icoptr = Tao.Sdl.Sdl.SDL_LoadBMP("E:\\2.bmp");

            Tao.Sdl.Sdl.SDL_WM_SetIcon(icoptr, null);

 

            surfacePtr = Tao.Sdl.Sdl.SDL_SetVideoMode(width, height, 0,Tao.Sdl.Sdl.SDL_SWSURFACE | Tao.Sdl.Sdl.SDL_RESIZABLE);

            rect = new Tao.Sdl.Sdl.SDL_Rect(0, 0, (short)width, (short)height);

            Tao.Sdl.Sdl.SDL_Rect rect2 = new Tao.Sdl.Sdl.SDL_Rect(0, 0, (short)width, (short)height);

            Tao.Sdl.Sdl.SDL_SetClipRect(surfacePtr, ref rect);

 

            IntPtr bmpptr = Tao.Sdl.Sdl.SDL_LoadBMP("E:\\1.bmp");

            Tao.Sdl.Sdl.SDL_BlitSurface(bmpptr, ref rect, surfacePtr, ref rect2);

 

            Tao.Sdl.Sdl.SDL_Flip(surfacePtr);

            Tao.Sdl.Sdl.SDL_UpdateRect(surfacePtr, 0, 0, rect.w, rect.h);

 

            Tao.Sdl.Sdl.SDL_FreeSurface(bmpptr);

        }

 

        private void Form1_FormClosed(object sender, FormClosedEventArgs e)

        {

            Tao.Sdl.Sdl.SDL_FreeYUVOverlay(yuv);

            Tao.Sdl.Sdl.SDL_FreeSurface(surfacePtr);

            Tao.Sdl.Sdl.SDL_Quit();

        }

    }

}

 

 

SDL的初始化函数SDL_Init()。该函数可以确定希望激活的子系统。SDL_Init()函数原型如下:

public static int SDL_Init(int flags);

其中,flags可以取下列值:

SDL_INIT_TIMER:定时器
SDL_INIT_AUDIO:音频
SDL_INIT_VIDEO:视频
SDL_INIT_JOYSTICK:摇杆
SDL_INIT_HAPTIC:触摸屏
SDL_INIT_GAMECONTROLLER:游戏控制器
SDL_INIT_EVENTS:事件
SDL_INIT_NOPARACHUTE:不捕获关键信号(这个不理解)
SDL_INIT_EVERYTHING:包含上述所有选项

SDL各个子系统

名称 

常量

说明 

自动初始化

定时器

SDL_INIT_TIMER  

0x00000001

 初始化时间子系统

 否

音频

SDL_INIT_AUDIO  

0x00000010

 初始化音频子系统

 否

视频

SDL_INIT_VIDEO

0x00000020

 初始化视频子系统

 否

CDROM

SDL_INIT_CDROM  

0x00000100

 初始化CDROM子系统

 否

游戏杆

SDL_INIT_JOYSTICK 

0x00000200

 初始化JOYSTICK子系统

 否

错误捕获

SDL_INIT_NOPARACHUTE 

0x00100000

 避免捕获致命错误

 是

线程

SDL_INIT_EVENTTHREAD 

0x01000000

 初始化线程子系统

 是

全部子系统

SDL_INIT_EVERYTHING 

0x0000FFFF

 初始化上述所有子系统

 否

 

 SDL各个子系统

名称      常量         值     说明        自动初始化

定时器     SDL_INIT_TIMER            0x00000001     初始化时间子系统       否

音频         SDL_INIT_AUDIO           0x00000010     初始化音频子系统       否

视频         SDL_INIT_VIDEO     0x00000020     初始化视频子系统       否

CDROM   SDL_INIT_CDROM         0x00000100     初始化CDROM子系统        否

游戏杆     SDL_INIT_JOYSTICK        0x00000200     初始化JOYSTICK子系统      否

错误捕获         SDL_INIT_NOPARACHUTE      0x00100000     避免捕获致命错误       是

线程         SDL_INIT_EVENTTHREAD      0x01000000     初始化线程子系统       是

全部子系统     SDL_INIT_EVERYTHING          0x0000FFFF      初始化上述所有子系统      否

返回值:

-1  On error

0     On success

 

采用 SDL_SetVideoMode()来初始化屏幕。这个屏幕是特指SDL绘制的窗口,并不是指整个屏幕。

 

public extern static IntPtr SDL_SetVideoMode(int widthint heightint bppint flags);

  width,height是输出高和宽,bitsperpixel 就是指bpp.即每点像素数,取值 8,16,32,值越大,说明屏幕表现力越丰富。它取决于显示器或LCD的硬件性能。一般桌面显示器是32.嵌入式设备的bpp可以用fbset 命令来查看。

 

flags 常见取值有如下(可以取多个值)

SDL_SWSURFACE :数据区建立在系统内存之上

SDL_HWSURFACE:数据区建立在显存之上

SDL_FULLSCREEN:全屏模式

SDL_NOFRAME:取消边框和标题栏

SDL_DOUBLEBUF:硬件双缓冲,必须与SDL_HWSURFACE同时使用。

 

把一个Surface数据拷入屏幕

public extern static int SDL_BlitSurface(IntPtr srcref Sdl.SDL_Rect srcrectIntPtr dstrefSdl.SDL_Rect dstrect);

   这里dst是输出surface(不一定是屏幕Surface,也可以另外一个Surface).

  dstrect是src在dst中相应的位置.

 

刷新屏幕

   public extern static int SDL_Flip(IntPtr screen);

   把更新后的Surface数据显示在屏幕上,SDL_BlitSurface数据加入屏幕后,不执行这一句,将不会更新到屏幕上显示。

 

部分更新屏幕

   如果每次都更新整个屏幕,效率这样很低,可以用SDL_UpdateRect更新部分区域

   public extern static void SDL_UpdateRect(IntPtr screenint xint yint wint h);

 

设置窗口图标

public extern static void SDL_WM_SetIcon(IntPtr iconbyte[] mask);

设置窗口标题

public extern static void SDL_WM_SetCaption(string titlestring icon);

title 是窗口标题名字,如果是中文,必须是UTF-8编码。

icon 是窗口最小化采用显示文字。也采用UTF-8编码

posted @ 2016-04-26 09:46  jhlong  阅读(1444)  评论(2编辑  收藏  举报
海龙的博客 jhlong@cnblogs 版权所有© 转载请注明链接.有用请推荐一下
代码全部经过本人测试,但不保证复制粘贴就正常运行,更不保证能解决你的问题,请结合前后代码及描述理解后修改和使用