本程序主要使用了LCUI图形库的Picture_Box和Lable窗口部件。
下面是源代码:
[cpp]
#include "LCUI_Build.h" #include LCUI_MAIN_H /* 包含LCUI库的必须头文件 */ #include LCUI_WIDGETS_H #include LCUI_FONTS_H #include LCUI_INPUT_H #include "all.h" #define ICON_PATH "/mnt/Data/LC-SOFT/LCPhotoViewer/icon.png" /* 图标位置 */ static int is_hide = IS_FALSE;/* 一个标志 */ pthread_t lable_view; /* 线程需要用到 */ void *hide(void *in) /* 用于隐藏图片信息标签 */ { unsigned short int alpha = 255; Lable_Data *lable = (Lable_Data*)in;/* 转换成存储lable部件的数据的结构体 */ while(1){ mark:/* goto语句跳转的位置的标志 */ while(1) { usleep(100000); if(is_hide == IS_FALSE) {/* 如果没有隐藏 */ Lable_Alpha(lable,alpha); break; } } sleep(2);/* 暂停2秒 */ is_hide = IS_TRUE;/* 标记,正在隐藏 */ for(alpha=255;alpha > 0;--alpha) { usleep(10000); if(is_hide == IS_FALSE) {/* 如果不需要隐藏 */ alpha = 255; Lable_Alpha(lable,alpha); goto mark; /* 跳转 */ } Lable_Alpha(lable,alpha);/* 改变lable部件的透明度 */ } alpha = 255;/* 不透明 */ is_hide = IS_TRUE;/* 标记,正在隐藏 */ } pthread_exit(NULL); } void Get_Name(char *filepath,char *out_name) /* 此函数用于获取文件名 */ { int i,n = 0; char *p; for(i=0;i<strlen(filepath);++i) if(filepath[i]=='/') n = i+1; p = filepath + n; strcpy(out_name,p); } int main(int argc,char*argv[]) /* 主函数,程序的入口 */ { LCUI_App LC_Photo_Viewer; /* LCUI程序 */ Lable_Data lable; /* 存储lable部件的数据的结构体 */ Picture_Box_Data pic_box; /* 存储Picture_Box部件的数据的结构体 */ Pic_Data icon,pic,mosaics;/* 用于存储图形数据的结构体 */ int main_window; /* 用于保存窗口识别代号 */ int width,height,temp; char text[512],name[256]; int x,y,key,box_width,box_height,Area_width,Area_height; width = 320; /* 窗口的宽度 */ height = 240; /* 窗口的高度 */ /* 初始化LCUI */ LCUI_Init(&LC_Photo_Viewer); /* 初始化图片数据结构体 */ Pic_Data_Init(&pic); Pic_Data_Init(&mosaics); Pic_Data_Init(&icon); /* 创建一个LCUI程序窗口 */ main_window = Create_Window(&LC_Photo_Viewer,width,height); LCUI_Load_Image(ICON_PATH,&icon); /* 载入图标 */ Set_Window_Icon(&LC_Photo_Viewer,main_window,ICON_CUSTOM,&icon); Title_Text_Size(&LC_Photo_Viewer,main_window,12); /* 标题栏中的文本的字体大小为12 */ /* 在标题栏中添加文本 */ Set_Title_Text(&LC_Photo_Viewer,main_window,"LC照片查看器"); /* 获取窗口内部区域的尺寸 */ box_width = Get_Inside_Box_Width(&LC_Photo_Viewer,main_window); box_height = Get_Inside_Box_Height(&LC_Photo_Viewer,main_window); /* 创建一个Picture_Box部件至LC_Photo_Viewer程序的main_window中 */ Create_Picture_Box(&LC_Photo_Viewer,main_window,&pic_box,box_width,box_height); /* 设定图像处理模式,CENTER表示的是居中显示图像 */ Set_Picture_Box_Size_Mode(&pic_box,CENTER); /* 在窗口内创建一个lable部件 */ Create_Lable(&LC_Photo_Viewer,main_window,&lable); Show_Window(&LC_Photo_Viewer,main_window);/* 显示窗口 */ if(argc == 2){/* 如果总共有2个参数 */ is_hide = IS_FALSE; /* 与lable部件关联的文本为"正在读取图片..." */ Lable_Text(&lable,"正在读取图片..."); temp = LCUI_Load_Image(argv[1],&pic); /* 载入图片 */ /* 如果LCUI_Load_Image()函数的返回值不为0,那么读取图片就是出问题了 */ if(temp != 0) { /* 与lable部件关联的文本为"图片文件读取失败!" */ Lable_Text(&lable,"图片文件读取失败!"); /* 等待按键输入,如果是返回键,就退出循环 */ while(1) if(Get_Key() == KEY_BACK) break; } else{ /* 否则 */ if(pic.type == TYPE_PNG && pic.flag == HAVE_ALPHA){ /* 如果图片类型为PNG,并且有alpha通道 */ Graph_Mosaics(&mosaics);/* 载入马赛克图形数据,此图形数据内置于LCUI图形库中 */ /* 设定Picture_Box部件的背景图像为刚刚载入马赛克图形,并且平铺 */ Set_Picture_Box_Background_Image(&pic_box,&mosaics,TILE); } Get_Name(argv[1],name);/* 获取文件名 */ Pic_Data img; Color_Data back_color,border_color;/* 配色数据的结构体 */ back_color.red = 255; back_color.green = 255;/* 背景为黄颜色 */ back_color.blue = 0; border_color.red = 100;/* 边框为暗黄色 */ border_color.green = 100; border_color.blue = 0; /* 生成文本 */ sprintf(text," 文件名: %s \n 尺 寸: %dx%d ",name,pic.width,pic.height); Lable_Text(&lable,text); /* 为img分配内存,尺寸和lable部件的尺寸一样 */ LCUI_Malloc_Graph(&img,lable.width,lable.height); Fill_Color(&img,back_color);/* 为img填充背景色 */ /* 为img的边缘绘制矩形边框,上下左右的边框尺寸都为1个像素点 */ Draw_Border_To_Graph(&img,border_color,1,1,1,1); Set_Lable_Image(&lable,&img,STRETCH); Lable_Site(&lable,5,5); /* 改变lable部件在窗口中的位置 */ /* 将pic中的图像数据传给Picture_Box部件,让它显示 */ Set_Image_In_Picture_Box(&pic_box,&pic); /* 获取当前所显示的图片内部的区域位置及尺寸 */ x = Get_Area_Start_X(&pic_box); y = Get_Area_Start_Y(&pic_box); /* 获取图片内部显示区域的尺寸 */ pthread_create(&lable_view, NULL, hide, (void*)&lable); while(1){ Area_width = Get_Area_Width(&pic_box); Area_height = Get_Area_Height(&pic_box); key = Get_Key();/* 接受按键 */ /* 如果按的是下面的按键,计算图片内部显示区域的需要移动到的位置坐标 */ if(key == KEY_RIGHT) x += (float)pic.width/10; if(key == KEY_LEFT) x -= (float)pic.height/10; if(key == KEY_UP) y -= (float)pic.height/10; if(key == KEY_DOWN) y += (float)pic.height/10; if(key == KEY_ENTER){ int style; style = Get_Window_Style(&LC_Photo_Viewer,main_window); if(style == Style_LCUI) Set_Window_Style(&LC_Photo_Viewer,main_window,NONE); else Set_Window_Style(&LC_Photo_Viewer,main_window,Style_LCUI); /* 重新获取窗口内部空间的尺寸 */ box_width = Get_Inside_Box_Width(&LC_Photo_Viewer,main_window); box_height = Get_Inside_Box_Height(&LC_Photo_Viewer,main_window); Picture_Box_Size(&pic_box,box_width,box_height); } if(key == 'i' || key == 'I') { is_hide = IS_FALSE;/* 标记,不隐藏 */ } if(key == KEY_BACK) break; if(x<0) x = 0; if(x+Area_width>pic.width) x = pic.width - Area_width; if(y<0) y = 0; if(y+Area_height>pic.height) y = pic.height - Area_height; /* 移动图片浏览区域 */ Move_View_Area(&pic_box,x,y); } pthread_cancel(lable_view);/* 撤销线程 */ } } else { Get_Name(argv[0],name); /* 生成文本,保存至字符串变量text中 */ sprintf(text,"按键操作说明:\n" "确认键: 隐藏标题栏\n" "方向键: 移动可视区域\n" "返回键: 退出本程序\n" "I键: 显示图片信息标签\n" "想打开图片,请在虚拟终端里输入:\n" "%s [图片文件的位置]",name); /* 更改lable部件中的文本内容 */ Lable_Site(&lable,5,5); Lable_Text(&lable,text); /* 等待按键输入,如果是返回键,就退出循环 */ while(1) if(Get_Key() == KEY_BACK) break; } Close_Window(&LC_Photo_Viewer,main_window); /* 关闭窗口 */ return 0; }运行效果截图: