直接看代码吧
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 = , height = ; public Form1() { InitializeComponent(); int i = ; i = Tao.Sdl.Sdl.SDL_Init(flags); if (i != ) { 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, ,Tao.Sdl.Sdl.SDL_SWSURFACE | Tao.Sdl.Sdl.SDL_RESIZABLE); rect = new Tao.Sdl.Sdl.SDL_Rect(, , (short)width, (short)height); Tao.Sdl.Sdl.SDL_Rect rect2 = new Tao.Sdl.Sdl.SDL_Rect(, , (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, , , 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 width, int height, int bpp, int 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 src, ref Sdl.SDL_Rect srcrect, IntPtr dst, refSdl.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 screen, int x, int y, int w, int h);
设置窗口图标
public extern static void SDL_WM_SetIcon(IntPtr icon, byte[] mask);
设置窗口标题
public extern static void SDL_WM_SetCaption(string title, string icon);
title 是窗口标题名字,如果是中文,必须是UTF-8编码。
icon 是窗口最小化采用显示文字。也采用UTF-8编码