本程序主要使用了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;
- }
運行效果截圖: