直接看代码吧

  1. using System;
  2.  
  3. using System.Collections.Generic;
  4.  
  5. using System.ComponentModel;
  6.  
  7. using System.Data;
  8.  
  9. using System.Drawing;
  10.  
  11. using System.Text;
  12.  
  13. using System.Windows.Forms;
  14.  
  15. namespace WindowsFormsApplication1
  16.  
  17. {
  18.  
  19. public partial class Form1 : Form
  20.  
  21. {
  22.  
  23. int flags = (Tao.Sdl.Sdl.SDL_INIT_VIDEO | Tao.Sdl.Sdl.SDL_INIT_TIMER |Tao.Sdl.Sdl.SDL_INIT_AUDIO);
  24.  
  25. IntPtr surfacePtr;
  26.  
  27. Tao.Sdl.Sdl.SDL_Rect rect;
  28.  
  29. int width = , height = ;
  30.  
  31. public Form1()
  32.  
  33. {
  34.  
  35. InitializeComponent();
  36.  
  37. int i = ;
  38.  
  39. i = Tao.Sdl.Sdl.SDL_Init(flags);
  40.  
  41. if (i != )
  42.  
  43. {
  44.  
  45. MessageBox.Show("SDL初始化失败!");
  46.  
  47. return;
  48.  
  49. }
  50.  
  51. Tao.Sdl.Sdl.SDL_WM_SetCaption("SDL", "MY 1ST SDL");
  52.  
  53. IntPtr icoptr = Tao.Sdl.Sdl.SDL_LoadBMP("E:\\2.bmp");
  54.  
  55. Tao.Sdl.Sdl.SDL_WM_SetIcon(icoptr, null);
  56.  
  57. surfacePtr = Tao.Sdl.Sdl.SDL_SetVideoMode(width, height, ,Tao.Sdl.Sdl.SDL_SWSURFACE | Tao.Sdl.Sdl.SDL_RESIZABLE);
  58.  
  59. rect = new Tao.Sdl.Sdl.SDL_Rect(, , (short)width, (short)height);
  60.  
  61. Tao.Sdl.Sdl.SDL_Rect rect2 = new Tao.Sdl.Sdl.SDL_Rect(, , (short)width, (short)height);
  62.  
  63. Tao.Sdl.Sdl.SDL_SetClipRect(surfacePtr, ref rect);
  64.  
  65. IntPtr bmpptr = Tao.Sdl.Sdl.SDL_LoadBMP("E:\\1.bmp");
  66.  
  67. Tao.Sdl.Sdl.SDL_BlitSurface(bmpptr, ref rect, surfacePtr, ref rect2);
  68.  
  69. Tao.Sdl.Sdl.SDL_Flip(surfacePtr);
  70.  
  71. Tao.Sdl.Sdl.SDL_UpdateRect(surfacePtr, , , rect.w, rect.h);
  72.  
  73. Tao.Sdl.Sdl.SDL_FreeSurface(bmpptr);
  74.  
  75. }
  76.  
  77. private void Form1_FormClosed(object sender, FormClosedEventArgs e)
  78.  
  79. {
  80.  
  81. Tao.Sdl.Sdl.SDL_FreeYUVOverlay(yuv);
  82.  
  83. Tao.Sdl.Sdl.SDL_FreeSurface(surfacePtr);
  84.  
  85. Tao.Sdl.Sdl.SDL_Quit();
  86.  
  87. }
  88.  
  89. }
  90.  
  91. }

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编码

SDL第一个程序:加载一张图片的更多相关文章

  1. Android Bitmap 全面解析(二)加载多张图片的缓存处理

    一般少量图片是很少出现OOM异常的,除非单张图片过~大~ 那么就可以用教程一里面的方法了通常应用场景是listview列表加载多张图片,为了提高效率一般要缓存一部分图片,这样方便再次查看时能快速显示~ ...

  2. 32位汇编第二讲,编写窗口程序,加载资源,响应消息,以及调用C库函数

    32位汇编第二讲,编写窗口程序,加载资源,响应消息,以及调用C库函数 (如果想看所有代码,请下载课堂资料,里面有所有代码,这里会讲解怎么生成一个窗口程序) 一丶32位汇编编写Windows窗口程序 首 ...

  3. ELF程序头部及程序加载

    程序头部 程序头部描述与程序执行直接相关的目标文件结构信息.用来在文件中定位各个段的映像.同时包含其他一些用来为程序创建进程映像所必需的信息. 可执行文件或者共享目标文件的程序头部是一个结构数组,每个 ...

  4. 关于Windows平台下应用程序加载DLL模块的问题.

    本文将讨论以下问题: (1)Windows可执行程序会从哪些目录下加载DLL. (2)如何将可执行使用的DLL放置到统一的目录下,而不是与EXE同一目录. (3)可执行程序加载了不该加载的DLL. ( ...

  5. 无法为具有固定名称“MySql.Data.MySqlClient”的 ADO.NET 提供程序加载在应用程序配置文件中注册的实体框架提供程序类型“MySql.Data.MySqlClient.MySqlProviderServices,MySql.Data.Entity.EF6”

    "System.InvalidOperationException"类型的未经处理的异常在 mscorlib.dll 中发生 其他信息: 无法为具有固定名称"MySql. ...

  6. 无法为具有固定名称“System.Data.SqlClient”的 ADO.NET 提供程序加载在应用程序配置文件中注册的实体框架提供程序类型“System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer”。请确保使用限定程序集的名称且该程序集对运行的应用程序可用。有关详细信息,请参阅 http://go.m

    Windows服务中程序发布之后会如下错误: 无法为具有固定名称“System.Data.SqlClient”的 ADO.NET 提供程序加载在应用程序配置文件中注册的实体框架提供程序类型“Syste ...

  7. 刚部署的程序加载不出来css,js以及图片

    刚部署的程序加载不出来css,js以及图片,解决方式 需要在配置中加入静态资源 方法一: controller.xml中加入 <mvc:annotation-driven/> <mv ...

  8. 使用SplashScreenManager控件定制程序加载页面

    需要devexpress版本在12.0及以上才支持 https://www.cnblogs.com/wuhuacong/p/6112461.html 在DevExpress程序中使用SplashScr ...

  9. cordova程序加载pdf文件的2种方法(ios/android)

    前言 公司目前的前端架构是微信端由vue全家桶负责h5网站的单页应用,android端和ios端则选择cordova打包成apk和app.其中,有一个业务逻辑是点击某个链接进入pdf的展示,h5的方案 ...

  10. .js控制一次加载一张图片,加载完后再加载下一张

    js怎么控制一次加载一张图片,加载完后再加载下一张 (1)方法1 (1)方法2

随机推荐

  1. 两种交换机配置模式,以配置基于端口划分的VLAN为例

    关于交换机的配置模式,大体上可以分为两类:其一以CISCO交换机为代表的配置模式,其二以Huawei.H3C交换机为代表的配置模式.其实这两种配置模式并没有本质的不同,只是配置的命令名称和配置方式存在 ...

  2. Xstream学习资料

    java中有关xml操作的,我们项目中首推Xstream.至于原因不说了.跟着大众的脚步走应该没错的.有关Xstream的文档如下. 官方文档 XStream完美转换XML.JSON XStream实 ...

  3. ipv4理论知识2-分类编址、ip分类、网络标识、主机标识、地址类、地址块

    分类编址 ipv4的体系结构中有分类编址和无分类编址(后续会介绍到),在分类编址时,ipv4地址分为A.B.C.D.E这5类.每类占用的IP比例和个数如下图: ipv4分类识别 计算机以二进制方式存储 ...

  4. WPF系列 Style

        参考 WPF: Customize your Application with Styles and Control Templates (Part 2 of 2)

  5. 与JSP的初次邂逅……

    JSP是可以内嵌在网页中,由服务器端来执行与解释的程序,是一种动态网页技术标准. 在传统的HTML文件(*.htm或*.html)中加入Java程序片段和JSP标记,就构成了JSP网页(*.jsp). ...

  6. python利用unrar实现rar文件解压缩

    python第三方包unrar可以实现rar文件的解压缩,它以动态库UnRAR为基础,封装而成 1. 下载UnRAR动态库 https://pypi.python.org/pypi/unrar/0.2 ...

  7. Hibernate入门

    脏检查及刷新缓存机制: 脏检查:当事物提交时,Hibernate会对session中持久状态的对象进行检测, 判断对象的数据是否发生改变 为什么要进行脏检查? 如果对象发生了改变,就需要将改变更新到数 ...

  8. Bean生命周期及BeanFactory

    1.spring通过BeanFactory灵活配置.管理bean,Spring对管理的bean没有任何特别的要求,完全支持对POJO的管理: 2.BeanFactory有个ApplicationCon ...

  9. ES5/标准 ECMAScript 内置对象

    https://www.w3.org/html/ig/zh/wiki/ES5/%E6%A0%87%E5%87%86_ECMAScript_%E5%86%85%E7%BD%AE%E5%AF%B9%E8% ...

  10. 通过trie树实现单词自动补全

    /** * 实现单词补全功能 */ #include <stdio.h> #include <stdlib.h> #include <string.h> #incl ...