SDL图片浏览
2012-05-18 17:03:29 来源:WEB开发网核心提示:#include "SDL.h"#include "SDL_ttf.h"#include "SDL_rotozoom.h"#include "SDL_image.h"#include "math.h"#include &
#include "SDL.h"
#include "SDL_ttf.h"
#include "SDL_rotozoom.h"
#include "SDL_image.h"
#include "math.h"
#include "string.h"
#include "SDL_gfxPrimitives.h"
#define MAX 16
#define BMP_NAME "icon.bmp"
#define ICON "sample.bmp"
#define TITLE_NAME "TestSDL"
#define ICON_NAME "My WinFrame" //窗体最小化name
#define TEXT "欢迎光临" //文字设置
#define TEXT_SIZE 50 //设置字体大小
#define WIDTH 640
#define HEIGTH 480
char *picture[] = {
"1.jpg" , "2.jpg" , "3.jpg" , "4.jpg" ,
"5.jpg" , "6.jpg" , "7.jpg" , "8.jpg" ,
"9.jpg" , "10.jpg" , "11.jpg" , "12.jpg" ,
"13.png" , "14.jpg" , "15.jpg" , "16.jpg"
};
static SDL_Surface *screen = NULL;
static SDL_Surface *backpng = NULL;
static SDL_Surface *png = NULL;
static double zoomXY = 1.5;
static int i = 0;
int Init() //初始化SDL
{
if((SDL_Init(SDL_INIT_VIDEO)|IMG_Init(IMG_INIT_PNG)|TTF_Init()) == -1)
{
fprintf(stderr,"SDL init error:%s",SDL_GetError());
return -1;
}
return 0;
}
SDL_Surface *loadBMP(char *fileName) //加载bmp图片
{
SDL_Surface *bmp;
bmp = SDL_LoadBMP(fileName);
if(bmp == NULL)
{
fprintf(stderr,"Could not load %s: %s",fileName,SDL_GetError());
exit(1);
}
return bmp;
}
void creatScreen(int width , int height , int bpp , Uint32 flags) //创建一个VideoMode
{
screen = SDL_SetVideoMode(width , height, bpp , flags);
if(screen == NULL)
{
fprintf(stderr,"Could not Creat a Screen!:%s",SDL_GetError());
exit(1);
}
return ;
}
void show_Pic(SDL_Surface *bmp ,SDL_Rect *rect) //显示bmp图片
{
SDL_BlitSurface(bmp , NULL , screen , rect);
SDL_UpdateRect(screen , 0 , 0 , 0 , 0 );
SDL_FreeSurface(bmp);
return ;
}
int getRightPic(int a)
{
a++;
if(a > 15 )
{
a = 0;
}
return a;
}
int getLeftPic(int a)
{
a--;
if(a < 0)
{
a = 15;
}
return a;
}
void zoomBig(double *a)
{
*a -= 0.25;
if(*a <= 1.5)
{
*a = 1.5;
}
}
void zoomSmall(double *a)
{
*a += 0.25;
if(*a >= 5)
{
*a = 5;
}
}
int mytext(char *string , int size , SDL_Rect *rect)
{
SDL_Rect text_rect;
//double zoomx , zoomy;
SDL_Color color = {0 , 0 , 0};
TTF_Font *font = TTF_OpenFont("simfang.ttf", size);
if(font == NULL)
{
fprintf( stderr, "font open failed: %s\n",TTF_GetError() );
exit(1);
}
SDL_Surface *text = TTF_RenderUTF8_Solid(font , string , color );
if(text == NULL)
{
fprintf(stderr , "text failed: %s\n" , TTF_GetError() );
}
/*
//将字体缩放到按钮的大小,但是字体显得不是那么圆润。
zoomx = (double)((double)rect->w / (double)text->w);
zoomy = (double)((double)rect->h / (double)text->h);
printf("%lf\n" , zoomy);
text = zoomSurface(text, zoomx, zoomy, 1);
*/
//将字体放在按钮的中间位置
text_rect.x =rect->x+(rect->w / 2 -text->w / 2);
text_rect.y = rect->y + (rect->h / 2 - text->h /2);
show_Pic(text , &text_rect);
//SDL_FreeSurface(text);
TTF_CloseFont(font);
return 0;
}
void draw_button(char *str , int flag)
{
SDL_Rect myrect;
if(strcmp(str , "left") == 0)
{
myrect.x = 160 ;
myrect.y = 420 ;
myrect.w = 40;
myrect.h = 40;
boxColor(screen, myrect.x , myrect.y , myrect.x + myrect.w , myrect.y + myrect.h, 0xf3f5ffff);
if(flag == 1)
{
hlineColor( screen, myrect.x , myrect.x + myrect.w , myrect.y + myrect.h , 0x000000ff);
vlineColor( screen, myrect.x + myrect.w , myrect.y , myrect.y + myrect.h , 0x000000ff);
}
mytext("<<" , 20 , &myrect);
}
if(strcmp(str , "right") == 0)
{
myrect.x = 438;
myrect.y = 420;
myrect.w = 40;
myrect.h = 40;
boxColor(screen, myrect.x , myrect.y , myrect.x + myrect.w , myrect.y + myrect.h, 0xf3f5ffff);
if(flag == 1)
{
hlineColor( screen, myrect.x , myrect.x + myrect.w , myrect.y + myrect.h , 0x000000ff);
vlineColor( screen, myrect.x + myrect.w , myrect.y , myrect.y + myrect.h , 0x000000ff);
}
mytext(">>" , 20 , &myrect);
}
if(strcmp(str , "big") == 0)
{
myrect.x = 160;
myrect.y = 20;
myrect.w = 40;
myrect.h = 40;
boxColor(screen, myrect.x , myrect.y , myrect.x + myrect.w , myrect.y + myrect.h, 0xf3f5ffff);
if(flag == 1)
{
hlineColor( screen, myrect.x , myrect.x + myrect.w , myrect.y + myrect.h , 0x000000ff);
vlineColor( screen, myrect.x + myrect.w , myrect.y , myrect.y + myrect.h , 0x000000ff);
}
mytext("+" , 20 , &myrect);
}
if(strcmp(str , "small") == 0)
{
myrect.x = 438;
myrect.y = 20;
myrect.w = 40;
myrect.h = 40;
boxColor(screen, myrect.x , myrect.y , myrect.x + myrect.w , myrect.y + myrect.h, 0xf3f5ffff);
if(flag == 1)
{
hlineColor( screen, myrect.x , myrect.x + myrect.w , myrect.y + myrect.h , 0x000000ff);
vlineColor( screen, myrect.x + myrect.w , myrect.y , myrect.y + myrect.h , 0x000000ff);
}
mytext("-" , 20 , &myrect);
}
show_Pic( screen , &(screen->clip_rect));
return ;
}
int ShowPic(char *string)
{
double zoom_x,zoom_y;
SDL_Rect fillRect;
fillRect.x = 107;
fillRect.y = 80;
fillRect.w = 426;
fillRect.h = 320;
if(strcmp(string , "left") == 0)
{
i = getLeftPic(i);
}
else
i = getRightPic(i);
backpng = IMG_Load(picture[i]);
if(!backpng)
{
fprintf(stderr,"Could not load %s: %s\n",picture[i],SDL_GetError());
exit(1);
}
zoom_x = (double)((screen->w) / (double)(backpng->w));
zoom_y = (double)((screen->h) / (double)(backpng->h));
png = zoomSurface(backpng , (zoom_x / zoomXY), (zoom_y / zoomXY) , 1);
SDL_Rect rect;
rect.x = (screen->w - png->w ) / 2;
rect.y = (screen->h - png->h ) / 2;
rect.w = png->w;
rect.h = png->h;
printf("%d , %d , %d , %d\n" , rect.x, rect.y, rect.w , rect.h );
SDL_FillRect(screen ,&fillRect , 0xffffffff);
SDL_UpdateRect(screen , 0 , 0 , 0 , 0 );
show_Pic(png , &rect);
SDL_FreeSurface(backpng);
return 0;
}
int getNowPic()
{
double zoom_x,zoom_y;
SDL_Rect fillRect;
fillRect.x = 107;
fillRect.y = 80;
fillRect.w = 426;
fillRect.h = 320;
backpng = IMG_Load(picture[i]);
if(!backpng)
{
fprintf(stderr,"Could not load %s: %s\n",picture[i],SDL_GetError());
exit(1);
}
zoom_x = (double)((screen->w) / (double)(backpng->w));
zoom_y = (double)((screen->h) / (double)(backpng->h));
png = zoomSurface(backpng , (zoom_x / zoomXY), (zoom_y / zoomXY) , 1);
SDL_Rect rect;
rect.x = (screen->w - png->w ) / 2;
rect.y = (screen->h - png->h ) / 2;
rect.w = png->w;
rect.h = png->h;
printf("%d , %d , %d , %d\n" , rect.x, rect.y, rect.w , rect.h );
SDL_FillRect(screen ,&fillRect , 0xffffffff);
SDL_UpdateRect(screen , 0 , 0 , 0 , 0 );
show_Pic(png , &rect);
SDL_FreeSurface(backpng);
}
int chooseButton(char *string)
{
draw_button(string , 1) ;
ShowPic(string);
return 0;
}
int do_Button(SDL_Event *event)
{
if((((event->button).x >= 160) && ((event->button).x <= 200 )) && (((event->button).y >= 420) && ((event->button).y <= 460 )))
{
chooseButton("left");
}
if( ((event->button).x >= 438 && (event->button).x <= 478 ) && ((event->button).y >= 420 && (event->button).y <= 460 ) )
{
chooseButton("right");
}
if( ((event->button).x >= 160 && (event->button).x <= 200 ) && ((event->button).y >= 20 && (event->button).y <= 60 ) )
{
zoomBig(&zoomXY);
draw_button("big" , 1) ;
getNowPic();
}
if( ((event->button).x >= 438 && (event->button).x <= 478 ) && ((event->button).y >= 20 && (event->button).y <= 60 ) )
{
zoomSmall(&zoomXY);
draw_button("small" , 1) ;
getNowPic();
}
return 0;
}
int background()
{
double zoom_x , zoom_y;
backpng = IMG_Load(picture[0]);
if(!backpng)
{
fprintf(stderr,"Could not load %s: %s\n",picture[0],SDL_GetError());
exit(1);
}
zoom_x = (double)((screen->w) / (double)(backpng->w));
zoom_y = (double)((screen->h) / (double)(backpng->h));
png = zoomSurface(backpng , zoom_x , zoom_y , 1);
show_Pic(png ,&(screen->clip_rect));
SDL_FreeSurface(backpng);
return 0;
}
int appMode()
{
int width = WIDTH;
int heigth = HEIGTH;
int bpp = 0;
Init();
creatScreen(width , heigth, bpp , SDL_SWSURFACE);
background();
SDL_WM_SetCaption(TITLE_NAME, ICON_NAME); //设置窗口标题
SDL_WM_SetIcon(loadBMP(ICON) , NULL);
return 0;
}
int appEvent()
{
double zoom_x,zoom_y;
SDL_Event event;
while(SDL_WaitEvent(&event))
{
switch(event.type)
{
case SDL_KEYDOWN:
printf("Key Down......\n");
if(event.key.keysym.sym == SDLK_ESCAPE)
{
goto loop;
}
if(event.key.keysym.sym == SDLK_SPACE)
{
background();
}
break;
case SDL_KEYUP:
/*
*keyborad test
*/
printf("Key up......\n");
printf("key : %d\n" , event.key.keysym.sym );
if(event.key.keysym.sym == 269)
{
zoomSmall(&zoomXY);
getNowPic();
}
if(event.key.keysym.sym == 270)
{
zoomBig(&zoomXY);
getNowPic();
}
break;
case SDL_MOUSEMOTION:
break;
case SDL_MOUSEBUTTONDOWN:
draw_button("big" , 0);
draw_button("small" , 0);
draw_button("left" , 0) ;
draw_button("right" , 0) ;
do_Button(&event);
break;
case SDL_MOUSEBUTTONUP:
draw_button("left" , 0) ;
draw_button("right" , 0) ;
draw_button("big" , 0);
draw_button("small" , 0);
break;
case SDL_QUIT:
printf("quit\n");
goto loop;
break;
}
}
loop:
IMG_Quit();
SDL_FreeSurface(screen);
SDL_Quit();
return 0;
}
int main(int argc,char **argv)
{
appMode();
appEvent();
return 0;
}
更多精彩
赞助商链接
