📄 dispcurve.c
字号:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <unistd.h>
#include <pwd.h>
#include <math.h>
#include <minigui/common.h>
#include <minigui/minigui.h>
#include <minigui/gdi.h>
#include <minigui/window.h>
#include <minigui/control.h>
#include <sys/types.h>
#include <sys/shm.h>
#include <sys/ipc.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include "common.h"
#include "init.h"
#include "fonts.h"
#include "dispcurve.h"
//设置时标
void RRDrawTime(HDC hdc, int CurPos, int x, int y)
{
gal_pixel tempcolor;
unsigned char buf[20];
int tempA,tempB;
tempA=(CurPos)/60;
tempB=(CurPos)%60;
sprintf(buf," %02d:%02d:%02d",10,31,31);
SelectFont(hdc,helfont14);
tempcolor= RGB2Pixel(hdc,255,255,0);
SetBkMode(hdc,BM_TRANSPARENT);
SetTextColor(hdc,tempcolor);
TextOut(hdc,x,y,buf);
}
void DrawBackRect(void)
{/*
*/
}
/*
根据整型值和小数点来定显示区数值
Y坐标
*/
int GetCurveHeight(int id2)
{
int id;
int high=0;
int low=0;
int height=0;//相对高度,
int ipv=0;
int dot;
static int point;
id=id2;
dot=channel_disp[id].dot;
high=channel_conf[id].h_limit;
low=channel_conf[id].l_limit;
ipv=channel_disp[id].ipv/(dot*10);
//根据下满面板的开关情况,决定按钮面板,再决定
// 显示的高度
height=HEIGHT-TOP;
if(ipv>=high) point=TOP2+20;
else if(ipv<=low) point=height-BOTTOM -20;
else point= height-BOTTOM -(((ipv-low)*(height-BOTTOM- TOP2))/(high-low));
return point;
}
/*
绘制上下两排的数显框
*/
void DrawRect(HDC hmemDC,int first ,int n,int w,int h)
{
int i;
unsigned char str[10];
int rect_x,rect_y, rect_w,rect_h;
//绘制背景------------------------------------
for(i=first;i<first+n;i++){
if(i<n/2){
rect_w=w/(n/2);
rect_x=rect_w*(i-first); //一个矩形的宽度为60
rect_y=0; //单页上设置坐标
}
else
{
rect_w=w/(n-n/2);
rect_x= rect_w*(i-n/2-first); //一个矩形的宽度为60
rect_y=h-BOTTOM2; //单页上设置坐标
}
Rectangle(hmemDC, rect_x, rect_y,rect_x+rect_w,rect_y+BOTTOM2);
SetBrushColor(hmemDC,channel_disp[i].color); //channel_disp[i].color
FillBox(hmemDC, rect_x+1, rect_y+1, rect_w-1, BOTTOM2-1);
SelectFont(hmemDC,lgfont_11); //设置字体
TextOut(hmemDC,rect_x+1+rect_w/3,rect_y+BOTTOM2/3,channel_disp[i].data);
SelectFont(hmemDC,songgb16font); //设置字体
TextOut(hmemDC,rect_x,rect_y,channel_conf[i].name);//channel_disp[i].desc
SelectFont(hmemDC,lgfontgb12);
//单位
TextOut(hmemDC,rect_x+1+rect_w-30,rect_y,channel_conf[i].unit);
sprintf(str,"%ds",channel_conf[i].interval);
TextOut(hmemDC,rect_x+1+rect_w-30,rect_y+BOTTOM2-12,str);//采样时间间隔
}
}
/*画图
x:绘图区x坐标
y:绘图区y坐标
w:
h:
ipv:实时值
zoom:放大倍数
//纵坐标不放大,横坐标可以变
当 zoom=1时候,实时绘制区的时间显示有
period=1天
*/
void Drawline (HDC hdc,int first ,int n,int addr_x,int addr_h)//,PandectDataStruct *channel_disp)
{
int y, w,h;
int j,i;
int k;
int channum;
int point;
unsigned char str[10];
int index;//第N个点
int num; //区域内实时点的个数
gal_pixel colorl_text;
HDC hmemDC;
int zoom;
int seco_perpage;//每页
//记录列线开始的时间
char speriod[8];
char mperiod[8];
char hperiod[8];
y=TOP;
w=WIDTH-addr_x;
//给时标初始化------------------------
speriod[8]=seco;
mperiod[8]=minu;
hperiod[8]=hour;
for(k=1;k<=8;k++)
{
speriod[k-1]=speriod[k]-20;
mperiod[k-1]=mperiod[k];
hperiod[k-1]=hperiod[k];
if(speriod[k-1]<0){speriod[k-1]=60-speriod[k-1];
mperiod[k-1]--; }
if(mperiod[k-1]<0){mperiod[k-1]=60-mperiod[k-1];
hperiod[k-1]--; }
if(hperiod[k-1]<0){hperiod[k-1]=24-hperiod[k-1];
}
}
//-------------------------------------------end
k=1;
zoom=gzoom;
zoom=10;//两个点之间10个象素
num=w/zoom; //把显示区560 ,分为6列
RealIndex_max=56;//显示区共包括了120个点
//假如一格表示20秒,那么一页表示120秒的数据
index=RealIndex; //控制最小的曲线左移刷新时间
hmemDC=CreateCompatibleDC(hdc);
SetBkMode(hmemDC,BM_TRANSPARENT);
SetBrushColor(hmemDC, PIXEL_lightwhite);
FillBox(hmemDC,1,0,w,h);
DrawRect( hmemDC, first , n, w, addr_h);
//与曲线显示有关----------------------------------
SetPenColor (hmemDC,COLOR_darkgray);//COLOR_darkgray PIXEL_lightwhite
// y=y+TOP2;
h=addr_h-TOP2-BOTTOM2;
seco_perpage=w/(zoom*4)+1;//
if(index%10==0)//给新的时标赋值
{
for(k=1;k<=8;k++)
{
speriod[k-1]=speriod[k];
mperiod[k-1]=mperiod[k];
hperiod[k-1]=hperiod[k];
}
speriod[k]=seco;
mperiod[k]=minu;
}
//根据index来画列线
for(k=0;k<=8;k++)//每列20个线段
{
MoveTo(hmemDC,k*70+(7-index%7)*10,TOP2);//w+(j-index)*zoom
LineTo(hmemDC,k*70+(7-index%7)*10,h+TOP2 );
//绘制完本条竖线后绘制对应的时刻
sprintf(str," %02d:%02d:%02d",hour,minu,seco);
SelectFont(hmemDC,helfont14);
SetBkMode(hmemDC,BM_TRANSPARENT);
SetTextColor(hmemDC,RGB2Pixel(hmemDC,0,0,0));
TextOut(hmemDC,k*70+(7-index%7)*10-70,340,str);
}
for(j=1;j<=h/(zoom*3);j++)
{
MoveTo(hmemDC,0,TOP2+zoom*3*j);
LineTo(hmemDC,w,TOP2+zoom*3*j);
}
//根据不同的采用频率显示不同的点
//channel_disp[i].interval,
bdispcurve=1;
for(i=first;i<first+n;i++){
SetPenColor(hmemDC, channel_disp[i].color);//PIXEL_lightwhite
if(fullscr)
{
for(j=index;j<=num;j++){ //从左到右
MoveTo(hmemDC, (j-index-1)*10, channel_disp[i].point[j-1]);
LineTo(hmemDC,(j-index)*10, channel_disp[i].point[j]);
}//channel_disp[i].point[j]在ReadDefaultValue()函数中被邋赋值
MoveTo(hmemDC, (num-index)*10, channel_disp[i].point[num]);
LineTo(hmemDC,(num-index+1)*10, channel_disp[i].point[0]);
}
for(j=1;j<=index;j++){
MoveTo(hmemDC, w+(j-index+1)*10, channel_disp[i].point[j]);
LineTo(hmemDC,w+(j-index+0)*10, channel_disp[i].point[j-1]);
}
}
// for(j=1;j<=index;j++)
// printf("%d ", channel_disp[1].point[j-1]);
BitBlt(hmemDC,0,0,w,addr_h,hdc,addr_x+1,TOP,0);//COPY (0,40)
DeleteCompatibleDC(hmemDC);
bdispcurve=0;
// topbackcolor=RGB2Pixel(hdc,0,0,100);
//SetBrushColor(hdc,topbackcolor);
//FillBox(hdc,1,1,WIDTH,BOTTOM);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -