SDL实现按钮
是的,按钮控件很常见,几乎在每一个Windows窗体内都能找到它的身影。SDL作为一套“一套开放源代码的跨平台多媒体开发库”,自然可以实现按钮。而按钮实现的重点,就是SDL的鼠标响应事件。
SDL的鼠标事件包括鼠标移动事件、按下鼠标键、松开鼠标键,和键盘一样,当你移动鼠标时发生鼠标移动事件,按下一个鼠标键,比如说左键时,发生按下鼠标键事件,松开鼠标键时会发生松开鼠标键事件。可以通过
SDL_PollEvent(&Event);
来把上一个事件从事件队列中取出。接下来可以进行判断,如果其type为SDL_MOUSEBUTTONDOWN则为鼠标按下,这时可以进行按下按钮后该做的事情,并把按钮的图片更新为按下后的样式。如果type为SDL_MOUSEBUTTONUP则为鼠标松开,则把按钮图片样式恢复未按下的情况。SDL_MOUSEMOTION表示鼠标在窗口表面移动,这时候可以把按钮更新到被指向的样式。当然,以上的一切更新,都是在鼠标的xy坐标位于按钮上才进行的。
懂了鼠标事件,SDL实现按钮就很容易了。下面我直接贴上源代码,如果要背景图片和按钮图片可以点击下载。这个程序还有一些缺陷,主要是按钮图片有渐变色,去背景不彻底导致不美观。大家可以自己修改按钮图片。当然修改时要把程序中原来的图片宽、高的信息修改。
#include <iostream>
#include <cstdlib>
#include <SDL2/SDL.h>
#include <SDL2/SDL_image.h>
const Uint32 H=,W=;
const Uint32 FPS=;
const char* BuFile[]={"B1.png","B2.png","B3.png"};
SDL_Window *MainWin=NULL;
SDL_Surface *BackGround=NULL,*ButtonSur=NULL;
SDL_Renderer *Render=NULL;
SDL_Texture *BackText=NULL,*ButtonText=NULL;
SDL_Rect ButtRect={,,,};
SDL_Event Mouse;
using namespace std; bool System_Init();
bool DrawBackGround();
bool UpdateButton(Uint32);
bool isOnButton(Uint32,Uint32);
void halt();
void Destroy(); int main(int argc,char *argv[]){
if (!System_Init()) halt();
if (!DrawBackGround()) halt();
bool quit=false;
Uint32 _FPS_Timer=,Buttonnow=;
if (!UpdateButton()) halt();
while (!quit){
while (SDL_PollEvent(&Mouse)){
switch (Mouse.type){
case SDL_QUIT:
quit=true;
break;
case SDL_MOUSEBUTTONDOWN:
if (Mouse.button.button==SDL_BUTTON_LEFT)
if (isOnButton(Mouse.button.x,Mouse.button.y))
if (Buttonnow!=){
if (!UpdateButton()) halt();
Buttonnow=;
}
break;
case SDL_MOUSEMOTION:
if (isOnButton(Mouse.button.x,Mouse.button.y)){
if (Buttonnow!=){
if (!UpdateButton()) halt();
Buttonnow=;
}}else
if (Buttonnow!=){
if (!UpdateButton()) halt();
Buttonnow=;
}
break;
case SDL_MOUSEBUTTONUP:
if (isOnButton(Mouse.button.x,Mouse.button.y)){
if (Buttonnow!=){
if (!UpdateButton()) halt();
Buttonnow=;
}}else
if (Buttonnow!=){
if (!UpdateButton()) halt();
Buttonnow=;
}
}
}
if(SDL_GetTicks()-_FPS_Timer</FPS)
SDL_Delay(/FPS-SDL_GetTicks()+_FPS_Timer);
_FPS_Timer=SDL_GetTicks();
}
return ;
}
void halt(){
cerr<<SDL_GetError()<<endl;
Destroy();
exit(-);
}
bool System_Init(){
if (SDL_Init(SDL_INIT_VIDEO)==-) return false;
if (IMG_Init(IMG_INIT_PNG)==-) return false;
MainWin=SDL_CreateWindow("Button Test",,,W,H,SDL_WINDOW_SHOWN);
if (MainWin==NULL) return false;
Render=SDL_CreateRenderer(MainWin,-,SDL_RENDERER_ACCELERATED);
if (Render==NULL) return false;
return true;
}
bool DrawBackGround(){
BackGround=IMG_Load("BG.png");
if (BackGround==NULL) return false;
BackText=SDL_CreateTextureFromSurface(Render,BackGround);
if (BackText==NULL) return false;
SDL_RenderClear(Render);
SDL_RenderCopy(Render,BackText,NULL,NULL);
SDL_RenderPresent(Render);
return true;
}
void Destroy(){
SDL_FreeSurface(BackGround);
SDL_DestroyWindow(MainWin);
SDL_DestroyRenderer(Render);
SDL_DestroyTexture(BackText);
IMG_Quit();
SDL_Quit();
}
bool UpdateButton(Uint32 ButtonMode){
DrawBackGround();
const char* OpenButton=BuFile[ButtonMode];
ButtonSur=IMG_Load(OpenButton);
Uint32 color_key=SDL_MapRGB(ButtonSur->format,,,);
SDL_SetColorKey(ButtonSur,SDL_TRUE,color_key);
if (ButtonSur==NULL) return false;
ButtonText=SDL_CreateTextureFromSurface(Render,ButtonSur);
if (BackText==NULL) return false;
SDL_RenderCopy(Render,ButtonText,NULL,&ButtRect);
SDL_RenderPresent(Render);
return true;
}
bool isOnButton(Uint32 x,Uint32 y){
if (x>=&&x<=)
if (y>=&&y<=) return true;
return false;
}
Bug Fix(2015-3-13 18:02):解决了鼠标提起那个时候按钮不能切换到状态0的问题。
SDL实现按钮的更多相关文章
- SDL Guide 中文译版
SDL即Simple DirectMedia Layer,类似DirectX,是完整的游戏.多媒体开发包,但不同的是它跨越几乎所有的平台,有各种语言的接口,多种语言的文档,而这一切都是广大志愿者完成的 ...
- 【C语言探索之旅】 第三部分第二课:SDL开发游戏之创建窗口和画布
内容简介 1.第三部分第二课: SDL开发游戏之创建窗口和画布 2.第三部分第三课预告: SDL开发游戏之显示图像 第三部分第二课:SDL开发游戏之创建窗口和画布 在上一课中,我们对SDL这个开源库做 ...
- 【C语言探索之旅】 第三部分第一课:SDL开发游戏之安装SDL
内容简介 1.课程大纲 2.第三部分第一课: SDL开发游戏之安装SDL 3.第三部分第二课预告: SDL开发游戏之创建窗口和画布 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题,并会 ...
- 2.SDL规范文档
01.安全设计Checklist 输入验证 校验跨信任边界传递的不可信数据(策略检查数据合法性,含白名单机制等)格式化字符串时,依然要检验用户输入的合法性,避免可造成系统信息泄露或者拒绝服务 禁止向J ...
- SDL 开发实战(四): SDL 事件处理
在前面学习SDL的例子运行时,我们发现我们的窗口只停留了几秒,但是如果设置更长时间显然也有其他的弊端. 那么有没有一种好的办法可以解决这个问题呢?例如:能不能让窗口一直显示,直到检测到用户用鼠标点击关 ...
- Beginning SDL 2.0(5) 基于MFC和SDL的YuvPlayer
本文是在“Beginning SDL 2.0(4) YUV加载及渲染”(以下简称BS4)基础上做的功能完善,如果你对之间介绍的内容了解不多,麻烦先阅读之前的内容. 本文主要介绍如何完成一个基于MFC和 ...
- 音视频处理之FFmpeg+SDL+MFC视频播放器20180411
一.FFmpeg+SDL+MFC视频播放器 1.MFC知识 1).创建MFC工程的方法 打开VC++ 文件->新建->项目->MFC应用程序 应用程序类型->基于对话框 取消勾 ...
- FFmpeg再学习 -- FFmpeg+SDL+MFC实现图形界面视频播放器
继续看雷霄骅的 课程资料 - 基于FFmpeg+SDL的视频播放器的制作最后一篇,主要是想学一下 MFC 创建和配置. 一.创建 MFC 工程 文件->新建->项目->Visual ...
- ExtJS 4.2 Date组件扩展:添加清除按钮
ExtJS中除了提供丰富的组件外,我们还可以扩展他的组件. 在这里,我们将在Date日期组件上添加一个[清除]按钮,用于此组件已选中值的清除. 目录 1. Date组件介绍 2. 主要代码说明 3. ...
随机推荐
- 【CSS】Beginner5:Margins&Padding
1.Properties for spacing-out elements 外边距:A margin is the space space outside something 内边距:padding ...
- 【转载】HBase 数据库检索性能优化策略
转自:http://www.ibm.com/developerworks/cn/java/j-lo-HBase/index.html 高性能 HBase 数据库 本文首先介绍了 HBase 数据库基本 ...
- MSSQL效率优化随记
1.尽量不要在where中进行计算,尤其是需要遍历的情况原来代码,执行大约40秒 INSERT INTO @TransferCode ( PROXY_NO, TING_NO, WTotal, BTot ...
- 神奇的问题记录【SqlDataAdapter Fill DataSet】
今天发现程序中有一张报表查询速度很慢[全条件要二分钟左右],查找相关原因,准备进行优化处理.注:报表调用存储过程,存储过程返回两个table就有以下神奇的故事: 直接将SQL语句在SSMS中执行发现全 ...
- Go语言简介
Go语言简介 - Go语言是由Google开发的一个开源项目,目的之一为了提高开发人员的编程效率. Go语言简介 Go语言是由Google开发的一个开源项目,目的之一为了提高开发人员的编程效率. Go ...
- mybatis的$存在安全问题,为什么又不得不用?
1.mybatis的官网关于$和#的字符串替换符号区别描述如下: http://www.mybatis.org/mybatis-3/zh/sqlmap-xml.html#Parameters 上面的意 ...
- 【python自动化第八篇:网络编程】
一.拾遗 动态导入模块 目的是为了在导入模块的过程中将模块以字符的格式导入. #!/usr/bin/env python # -*- coding:utf-8 -*- #Author:wanghui ...
- Hibernate继承映射
在面向对象的程序领域中,类与类之间是有继承关系的,例如Java世界中只需要extends关键字就可以确定这两个类的父子关系,但是在关系数据库的世界中,表与表之间没有任何关键字可以明确指明这两张表的父子 ...
- sudo apt-get install gksu
exmyth@Inspiron-5437:/etc/default$ gksu gedit apport 程序“gksu”尚未安装. 您可以使用以下命令安装:sudo apt-get install ...
- c#中cookies的存取操作
在客户端创建一个username的cookies,其值为gjy,有效期为1天. 方法1: Response.Cookies["username"].Value="zxf& ...