📄 softlock.cpp
字号:
/*E2键盘软锁v3.02008-2-1written by letterb @scnu_cs _05Email : boy.letterb@yahoo.com.cn 或 letterb@tom.comthanks lasly(sdk)*/#define QT_NO_DRAGANDDROP#define QT_NO_PROPERTIES#include <E2_EZX_ZApplication.h>#include <E2_EZX_ZKbMainWidget.h>#include <E2_EZX_ZMessageDlg.h>#include <E2_EZX_ZLabel.h>#include <E2_EZX_ZScrollPanel.h>#include <E2_EZX_ZSoftKey.h>#include <E2_EZX_ZFormContainer.h>#include <qpainter.h>#include <qlabel.h>#include <stdio.h>#include <stdlib.h>#include <qfile.h>#include <qtextcodec.h>#include <qlayout.h>#include <string.h>#include <time.h>#include <unistd.h>#include <qtimer.h>#include "SpeciOperation.h"#include "misscall.h"#define KEY_LOCKING_STR "键盘己锁"#define KEY_ULOCK_STR " 解锁"#define KEY_NOTIFY "请按*键解锁"#define KEY_MEDIA "播放键被按下"#define SCREEN_W 240#define SCREEN_H 320extern "C" int UTIL_GetBatteryLevel(); //电池水平extern "C" int UTIL_GetSignalQuality(); //信号质量typedef struct tagDate //日期格式{ int day; int month; int year;}Date,*PDate;QString ChineseAndEnglish(const char*ChineseString);QTextCodec* gbk_codec = QTextCodec::codecForName("UTF-8");
QString ChineseAndEnglish(const char*ChineseString)
{
return gbk_codec->toUnicode(ChineseString);
} enum clock_type //模拟时钟{ CLK_SEC, CLK_MIN};class MyZKbMain : public ZKbMainWidget{ Q_OBJECT////////////////// public: long pre_main_db_size; //原main.db的大小 long now_main_db_size; //当前main.db的大小 u_int ulock_timeout; //解锁超时 int start_x; //绘制原点 int start_y; int sec_len; //秒针长 int min_len; int hou_len; int clk_center_x; //时钟中心 int clk_center_y; int dot_r; //时钟点 int sec_width; //秒针宽度 int min_width; int hou_width;// int clk_color; int sec_color; //秒针颜色 int min_color; int hou_color; int dig_color; //数码时钟颜色 int date_color; //日期颜色 int dot_color; //模拟时钟中心颜色// int dig_size;// int date_size; int date_flag; //日期排版(居中、靠右、靠左) int date_x; //日期位置 int date_y; int dig_format; //数码时钟格式(12/24进制) int dig_x; //数码时钟位置 int dig_y; int font_size; //字体大小 int color_default;//缺省颜色 int x_default; //缺省位置 int y_default; int flag_default; //缺省排版格式 int battery_w; //电池宽 int battery_h; //电池高 int battery_x; //电池位置 int battery_y; int battery_color; //电池颜色 int battery_r; //电池圆角角度 int signal_space; //信号条间隔 int signal_min; //信号最小长 int signal_max; //信号最大长 int signal_w; //信号条宽 int signal_x; //信号间隔 int signal_y; int signal_color; //信号颜色///////////////////////////////////////////////////// bool flag_update_part; //是否部分更新 bool flag_media_key; //是否按下音乐键 char curinfo[300]; //当前状态信息 QImage myimg; //内存图片// QImage dotimg;// QImage clockimg;// uchar imgbits[240*3*320]; char str_default[256]; //缺省字符 bool flag_w_unlock; //是否按下*键 struct tm * timeinfo; //时间格式 int clk_x_arr[5]; //保存之前和当前的模拟时钟x坐标 int clk_y_arr[5]; // public: MyZKbMain(char * currentpath):ZKbMainWidget((ZHeader::HEADER_TYPE)3,NULL , "ZMainWidget" , 0) { ini_soft(); //初始化 setMainWidgetTitle("softlock3"); // QVBoxLayout* layout = getVBoxLayout(); // inifontfile(); setFullScreenMode(true, true); myimg.load("softlock.png"); //装载图片// dotimg.load("dot.png");// clockimg.load("softlock.png");/* uchar * bit=myimg.bits(); for(int j=0 ; j<320 ; j++) for(int i=0;i<240*3;i++) imgbits[i]=bit[i][j];*/// imgbits=img.bits(); startTimer(1000); //激活timer}public :void drawdate(QPainter & p); //绘制日期void GetDayOf(Date&, QString&); //获取当前的农历int getintformini(FILE *fp , char * keyname); //取ini键值int ini_soft(); int drawclock(QPainter & p , int & blt_x ,int & blt_y ,int & blt_w , int & blt_h); //绘制模拟时钟int drawbattery(QPainter & p); //绘制电池状态int drawsignal(QPainter & p); //绘制信号状态long get_main_db_size(); //获取当前main.db长度~MyZKbMain(); private slots:// virtual void timerEvent(QTimerEvent* e); virtual void keyPressEvent(QKeyEvent* k); virtual void keyReleaseEvent(QKeyEvent* k); virtual void paintEvent( QPaintEvent * pe); virtual void timerEvent(QTimerEvent* e); void slotTimeout();};long MyZKbMain::get_main_db_size()//获取当前main.db长度{ FILE *fp; fp=fopen("/ezx_user/sysDatabase/main.db","rb"); if(!fp) return 0; fseek(fp,0,SEEK_END); long db_size=0; db_size=ftell(fp); printf("ftell=%d\n",db_size); fclose(fp); return db_size;}int MyZKbMain::drawsignal(QPainter & p){ int qual=UTIL_GetSignalQuality(); //获取当前信号质量/* static int old_signal =-1; if(qual==old_signal) return 0; old_signal=qual;*/ int x=signal_x; int y=signal_y; int offset=(signal_max-signal_min)/10; QPen pen; pen.setColor(signal_color); pen.setWidth(signal_w); p.setPen(pen); if(qual) { for(int i=0 ;i < qual ;i++) { p.drawLine( x , y , x + signal_min + offset * i *2 , y ); y-=signal_space; x-=offset; } } else { p.drawEllipse(signal_x,signal_y,signal_min,signal_min); } return 1;}int MyZKbMain::drawbattery(QPainter & p){ int level=UTIL_GetBatteryLevel(); //获取当前电池水平 static int x=battery_x; static int y=battery_y;// static int w=battery_w; static int h=battery_h; static QColor color=battery_color; static int old_level=-1; if(old_level==level) { p.setPen(battery_color); //设置电池颜色 p.drawRoundRect( battery_x, battery_y, battery_w, battery_h , battery_r, battery_r ); p.setBrush(color); if(level) p.drawRoundRect( x, y, battery_w, h , battery_r, battery_r ); return 0; } else old_level=level;/**/ p.setPen(battery_color); if(level) { color=battery_color; h=(int) (( battery_h /5.0f ) * level ); y= battery_y + ( battery_h / 5.0f ) * (5-level ); p.drawRoundRect( battery_x, battery_y, battery_w, battery_h , battery_r, battery_r ); p.setBrush(color); p.drawRoundRect( x, y, battery_w, h , battery_r, battery_r ); } else {// color=QColor(255-(battery_color >> 16) & 0xff ,255-(battery_color >> 8) & 0xff,255- (battery_color & 0xff)); p.drawRoundRect( battery_x, battery_y, battery_w, battery_h , battery_r, battery_r );// p.setBrush(color);// p.drawRoundRect( battery_x, battery_y, battery_w, battery_h , battery_r, battery_r ); } return 0;}void MyZKbMain:: drawdate(QPainter & p){ static int countor=0; static QString nltemp; if(countor!=timeinfo->tm_mday) { countor=1; char week[7][10]={"星期日","星期一","星期二","星期三","星期四","星期五","星期六"}; QString qstrweek; char timestr[256]; sprintf(timestr,"%4d-%2d-%2d\n",1900+timeinfo->tm_year, 1+timeinfo->tm_mon,timeinfo->tm_mday); Date tdate; tdate.year=timeinfo->tm_year+1900; tdate.month=timeinfo->tm_mon+1; tdate.day=timeinfo->tm_mday; GetDayOf(tdate,nltemp); //获取当前农历 nltemp+="\n"; nltemp+=timestr; qstrweek=ChineseAndEnglish(week[timeinfo->tm_wday]); nltemp+=qstrweek; // nltemp=ChineseAndEnglish(nltemp.latin1()); } QPen pen(date_color,1); p.setPen(pen); p.drawText( date_x, date_y,300, 240,date_flag,nltemp); countor=timeinfo->tm_mday;// p.drawText( date_x, date_y+date_size+10,100, 100,1,QString(timestr)); }int MyZKbMain::drawclock(QPainter &p , int & blt_x ,int & blt_y ,int & blt_w , int & blt_h){ { QPen pen(dig_color,1); p.setPen(pen); char tmp[100]; if(dig_format) //判断时间格式 { sprintf (tmp, "%02d:%02d",timeinfo->tm_hour,timeinfo->tm_min); p.drawText( dig_x, dig_y,300, 240,1,QString(tmp)); } else { if(timeinfo->tm_hour < 12) sprintf (tmp, "%02d:%02d AM",timeinfo->tm_hour,timeinfo->tm_min); else if(timeinfo->tm_hour > 12) sprintf (tmp, "%02d:%02d PM",timeinfo->tm_hour-12,timeinfo->tm_min); else if(timeinfo->tm_hour == 12) sprintf (tmp, "%02d:%02d PM",timeinfo->tm_hour,timeinfo->tm_min); p.drawText( dig_x, dig_y,300, 240,1,QString(tmp)); } } QPen pen(sec_color,1); // 设置颜色 int x,y; SpeciOperation sop; //旋转// printf ("%4d-%02d-%02d %02d:%02d:%02d",1900+timeinfo->tm_year, 1+timeinfo->tm_mon,timeinfo->tm_mday,timeinfo->tm_hour,timeinfo->tm_min,timeinfo->tm_sec); pen.setColor(hou_color); //设置画笔颜色 pen.setWidth(hou_width); //设置画笔宽 p.setPen(pen); x=clk_center_x; y=clk_center_y-hou_len;// printf("%4.6f\n",timeinfo->tm_hour *30.0 + timeinfo->tm_min/2.0); sop.rotate(timeinfo->tm_hour *30.0 + timeinfo->tm_min/2.3,clk_center_x,clk_center_y);//设置旋转角度 sop.Change(x,y,3);//旋转 p.drawLine(clk_center_x,clk_center_y,x,y);//绘制时针 pen.setColor(min_color); pen.setWidth(min_width); p.setPen(pen); x=clk_center_x; y=clk_center_y-min_len; if(sec_width) //判断是否有秒针 sop.rotate(timeinfo->tm_min*6.0 + timeinfo->tm_sec/13,clk_center_x,clk_center_y); //有秒针则旋转角度加上秒的影响 else sop.rotate(timeinfo->tm_min*6.0,clk_center_x,clk_center_y); sop.Change(x,y,3); //旋转 p.drawLine(clk_center_x,clk_center_y,x,y);//save min clk_x_arr[1]=x; //保存当前的min末端坐标 clk_y_arr[1]=y; if(sec_width) //如果要绘制秒针 { pen.setColor(sec_color); pen.setWidth(sec_width); p.setPen(pen); x=clk_center_x; y=clk_center_y-sec_len; sop.rotate(timeinfo->tm_sec*6.0,clk_center_x,clk_center_y); sop.Change(x,y,3); p.drawLine(clk_center_x,clk_center_y,x,y);//save sec clk_x_arr[0]=x; //保存当前sec末端坐标 clk_y_arr[0]=y; ////////////////以下计算出最小重绘面积////////////////////////// int max_x(0),min_x(320),max_y(0),min_y(320); // for(int i=0;i<5;i++) //找出最大和最小的坐标 { if(clk_x_arr[i]>max_x) max_x=clk_x_arr[i]; if(clk_y_arr[i]>max_y) max_y=clk_y_arr[i]; if(clk_x_arr[i]<min_x) min_x=clk_x_arr[i]; if(clk_y_arr[i]<min_y) min_y=clk_y_arr[i];// printf("clk_x_arr[%d]=%d\n",i,clk_x_arr[i]); } blt_x=min_x - min_width/2 -1; //重绘的起始坐标 blt_y=min_y - min_width/2 -1; blt_w=min_width+2+(max_x-min_x); //重绘的宽 blt_h=min_width+2+(max_y-min_y); clk_x_arr[2]=clk_x_arr[0]; //后两位保存上次的sec和min的坐标 clk_x_arr[3]=clk_x_arr[1]; clk_y_arr[2]=clk_y_arr[0]; clk_y_arr[3]=clk_y_arr[1];// printf("min_x=%d min_y=%d\n",min_x,min_y); } ///////////////////////////////////////////// //draw_dot p.setBrush(dot_color); p.setPen(dot_color); p.drawEllipse(clk_center_x-dot_r,clk_center_y-dot_r,dot_r+dot_r,dot_r+dot_r); //绘制模拟时钟中心 return 0;}void MyZKbMain::timerEvent(QTimerEvent* e) //timer{ static int countor=0; countor++; static char num[20]; static bool flag_misscall=false; time_t rawtime; time ( &rawtime ); timeinfo = localtime ( &rawtime ); if(!flag_w_unlock && (countor %4)==0) { countor=0; if( now_main_db_size <= pre_main_db_size) //获取当前maindb的长度 { now_main_db_size=get_main_db_size(); if( now_main_db_size < pre_main_db_size) { pre_main_db_size= now_main_db_size ; } } if(!flag_misscall) { if(missalert(0,num,0,0)) //获取是否有未接电话 flag_misscall=true; } if(flag_misscall) { if(now_main_db_size > pre_main_db_size) { sprintf(str_default,"未接来电:%s\n您可能有新短信",num); } else sprintf(str_default,"您有未接来电:\n%s",num); } else if(now_main_db_size > pre_main_db_size) { sprintf(str_default,"您可能有新短信"); } else { sprintf(str_default,KEY_LOCKING_STR); } } if(!sec_width) { char nowinfo[300];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -