📄 trend.c
字号:
#include <stdio.h>#include <stdlib.h>#include <string.h>#include <sys/stat.h>#include <sys/types.h>#include <minigui/common.h>#include <minigui/minigui.h>#include <minigui/gdi.h>#include <minigui/window.h>#include <minigui/control.h>#include <minigui/mgext.h>#include <minigui/mywindows.h>#include "trend.h"
#include "trenddraw.h"
static struct shortline TimeLine[5];
static RECT Curve[8];//从0到7,这八个成员分别为:ECGRect,AHRect,SGRect,BTRect,BPRect,TTRect,PMT1,PMT2;
static struct datapoint data[400];//四百个数据点。每个data包括八个数据点和一个时间
static void ScroBarProc(HWND hWnd, int id, int nc, DWORD add_data);//滑动条的回调函数
static void inintctrl(HWND hWnd);//初始化所有控件
static void inittrend(HWND hWnd);//初始化trend窗口不动的内容例如标签、方框等等.该函数在paint中执行
static void CtrlAdd(const char * spClassName,
const char * spCaption,
DWORD dwStyle,
DWORD dwExStyle,
int id,
int x,
int y,
int w,
int h,
HWND hParentWnd,
DWORD dwAddData,
NOTIFPROC PROC
);
//自定义彩色文本控件函数
static int ColorEditConProc (HWND hwnd, int message, WPARAM wParam, LPARAM lParam);
static BOOL RegisterColorEditControl (void);
static void UnregisterColorEditControl (void);
/**********************************************************************
**函数名:static void ScroBarProc(HWND hWnd, int id, int nc, DWORD add_data)
**功能:滑动条的回调函数,实现连续向一个方向移动5次则步进值加5,反向的话步进值回为1
**返回值:无
**作者:陈永奎
**时间:2008.03.31
***********************************************************************/
static int OldSliderPos=0;//记录前一个位置,用于判断是增加还是减小
static unsigned char SliderChgTimes=0;//滑块位置变化次数
static unsigned char LineSizeTime=0;//步进值改变次数
static unsigned char SliderDrection=0;//滑块行动方向,0为正向,1为负向
static unsigned char OldSliderDrec=0;//保留滑块的方向,如果两者不一样则表示发生了变化
static int LineSize;
static void ScroBarProc(HWND hWnd, int id, int nc, DWORD add_data)
{
char s[10];
int NewSliderPos=0;
int i;
int hh,mm,ss; //小时,分钟,秒
HDC hdc;
if(TBN_CHANGE==nc)
{
NewSliderPos=SendMessage(hWnd,TBM_GETPOS,0,0);
//判断滑块方向
if(NewSliderPos>=OldSliderPos)
SliderDrection=0;
else
SliderDrection=1;
if(OldSliderDrec!=SliderDrection) //如果出现了反向,执行下面操作
{
OldSliderDrec=SliderDrection; //改方向标志
if(SliderDrection) //如果是负向,调整滑块位置
{
NewSliderPos=NewSliderPos+LineSize-1;
}
else //正向
{
NewSliderPos=NewSliderPos-LineSize+1;
}
SendMessage(hWnd,TBM_SETPOS,NewSliderPos,0); //调整位置
SliderChgTimes=0;
LineSizeTime=0;
SendMessage(hWnd,TBM_SETLINESIZE,1,0);
LineSize=1;
SetWindowText(GetDlgItem(GetParent(hWnd),ID_ScroBarREdit),"1");
}
else
{
SliderChgTimes+=1;
if(5==SliderChgTimes) //移动5次则步进值加5
{
SliderChgTimes=0;
LineSize=SendMessage(hWnd,TBM_GETLINESIZE,0,0);
if(25==LineSize) //如果步进值大于25,则回为1
{
LineSizeTime=0;
LineSize=1;
SendMessage(hWnd,TBM_SETLINESIZE,1,0);
SetWindowText(GetDlgItem(GetParent(hWnd),ID_ScroBarREdit),"1");
}
else
{
LineSizeTime+=1;
LineSize=LineSizeTime*5;
SendMessage(hWnd,TBM_SETLINESIZE,LineSize,0);
sprintf(s,"%d",LineSize);
SetWindowText(GetDlgItem(GetParent(hWnd),ID_ScroBarREdit),s);
}
}
}
//反向和正向都要做的事情
if(NewSliderPos<=0) //如果到了最左端
{
SetWindowText(GetDlgItem(GetParent(hWnd),ID_ScroBarLEdit),"0");
LineSizeTime=0;
SendMessage(hWnd,TBM_SETLINESIZE,1,0);
SetWindowText(GetDlgItem(GetParent(hWnd),ID_ScroBarREdit),"1");
LineSize=1;
NewSliderPos=0;
}
else if(NewSliderPos>=400) //如果到了最右端
{
SetWindowText(GetDlgItem(GetParent(hWnd),ID_ScroBarLEdit),"400");
LineSizeTime=0;
SendMessage(hWnd,TBM_SETLINESIZE,1,0);
SetWindowText(GetDlgItem(GetParent(hWnd),ID_ScroBarREdit),"1");
LineSize=1;
NewSliderPos=400;
}
else //在中间某位置,打印位置
{
sprintf(s, "%d",NewSliderPos);
SetWindowText(GetDlgItem(GetParent(hWnd),ID_ScroBarLEdit),s);
}
//改变时间线位置
hdc=GetClientDC(GetParent(hWnd));
for(i=0;i<5;i++)
{
//擦除前面的时间线
SetPenColor(hdc,COLOR_black);
MoveTo(hdc, TimeLine[i].start.x, TimeLine[i].start.y);
LineTo(hdc, TimeLine[i].end.x ,TimeLine[i].end.y);
TimeLine[i].start.x=Curve[i].left+NewSliderPos+1;
TimeLine[i].end.x=Curve[i].left+NewSliderPos+1;
}
DrawShortLine(hdc,TimeLine,5);
ReleaseDC(hdc);
//改变时间线结束
if(GetValueFromEtcFile("./res/config.cfg","系统","时间",s,10)<0)//从文件中获取开机时间
printf("GetValueFromEtcFile error\n");
hh=(s[0]-48)*10+(s[1]-48)+NewSliderPos*216/3600;
mm=(s[3]-48)*10+(s[4]-48)+(NewSliderPos*216%3600)/60;
ss=(s[6]-48)*10+(s[7]-48)+(NewSliderPos*216%60);
if(ss>=60) //以下几行为调整时间
{
mm+=1;
ss-=60;
}
if(mm>=60)
{
mm-=60;
hh+=1;
}
if(hh>=24)
{
hh-=24;
}
sprintf(s,"%02d:%02d:%02d", hh,mm,ss);
SetWindowText(GetDlgItem(GetParent(hWnd),110),s);
// SetWindowText(GetDlgItem(GetParent(hWnd),111),s);
}
OldSliderPos=NewSliderPos;
OldSliderDrec=SliderDrection;
}
/**********************************************************************
**函数名:static void inintctrl(HWND hWnd)
**功能:初始化“趋势”窗口中的所有控件
**参数:"趋势"窗口的句柄
**返回值:无
**作者:陈永奎
**时间:2008.03.31
***********************************************************************/
static void inintctrl(HWND hWnd)
{
struct ColorText CEdit[11];//0~10,分别为心率、体温、脉搏氧、呼吸率、收缩压、舒张压、
//平均压、脉搏、趋势时间、时间1、时间2这几个彩色文本框的坐标
char *CEditText[11]={"00","0.0","00","00","00","00","00","00","24","00:00:00","00:00:00"};//这几个控件中的初始化数字
int i=0;
for(i=0;i<4;i++) //心率、体温、脉搏氧、呼吸率、收缩压、舒张压、平均压、脉搏
{
CEdit[i].rc.left=PMT1Xorg+6+i*(ColorEditWidth+ColorEditSpace);
CEdit[i].rc.bottom=PMT1Yorg+8+ColorEditHeight;
CEdit[i].rc.top=PMT1Yorg+8;
CEdit[i].rc.right=CEdit[i].rc.left+ColorEditWidth;
CEdit[i].text=CEditText[i];
CEdit[i].textcolor=SysPixelIndex[10+i];
CEdit[i+4].rc.left=PMT2Xorg+6+i*(ColorEditWidth+ColorEditSpace);
CEdit[i+4].rc.bottom=PMT2Yorg+8+ColorEditHeight;
CEdit[i+4].rc.top=PMT2Yorg+8;
CEdit[i+4].rc.right=CEdit[i+4].rc.left+ColorEditWidth;
CEdit[i+4].text=CEditText[i+4];
CEdit[i+4].textcolor=SysPixelIndex[13-i];
}
CEdit[8].rc.left=TTXorg+((TTWidth-ColorEditWidth)>>1); //趋势时间坐标
CEdit[8].rc.bottom=TTYorg+TTHeight-8;
CEdit[8].rc.top=CEdit[8].rc.bottom-ColorEditHeight;
CEdit[8].rc.right=CEdit[8].rc.left+ColorEditWidth;
CEdit[8].text=CEditText[8];
CEdit[9].rc.top=PMT1Yorg+HLabelHeight*2+4; //时间1
CEdit[9].rc.bottom=PMT1Yorg+PMTHeight-4;
CEdit[9].rc.left=PMT1Xorg+HLabelWidth;
CEdit[9].rc.right=PMT1Xorg+HLabelWidth*3+1;
CEdit[9].text=CEditText[9];
CEdit[10].rc.top=PMT2Yorg+HLabelHeight*2+4; //时间2
CEdit[10].rc.bottom=PMT2Yorg+PMTHeight-4;
CEdit[10].rc.left=PMT2Xorg+HLabelWidth;
CEdit[10].rc.right=PMT2Xorg+HLabelWidth*3+1;
CEdit[10].text=CEditText[10];
for(i=0;i<11;i++)
{
CtrlAdd("coloredit", CEdit[i].text, WS_VISIBLE, WS_NONE, 100+(i+1), //这几个控件的ID为101~111
CEdit[i].rc.left, CEdit[i].rc.top, RECTW(CEdit[i].rc), RECTH(CEdit[i].rc),
hWnd, 0, NULL);
}
//设置字体颜色
for(i=0;i<4;i++)
{
SendMessage(GetDlgItem(hWnd, 100+(i+1)), MSG_USER, CEdit[i].textcolor, 0);
SendMessage(GetDlgItem(hWnd, 100+(i+5)), MSG_USER, CEdit[i+4].textcolor, 0);
}
//加上滑动条,ID为112
CtrlAdd(CTRL_TRACKBAR, "",
WS_VISIBLE | TBS_NOTIFY | TBS_NOTICK,
WS_NONE,
ID_ScroBar,
ScroBarXorg, ScroBarYorg, ScroBarWidth, ScroBarHeight,
hWnd, 0, ScroBarProc);
SendMessage(GetDlgItem(hWnd,ID_ScroBar),TBM_SETRANGE,0,400);
//加上滑动条两端的文本框,显示滑块位置和步进值
CtrlAdd("coloredit", "0", WS_VISIBLE, WS_NONE, ID_ScroBarLEdit, //这两个文本框控件ID为113和114,左框
ScroBarXorg-3*ScroBarHeight, ScroBarYorg, 2*ScroBarHeight+1, ScroBarHeight,
hWnd, 0, NULL);
CtrlAdd("coloredit", "1", WS_VISIBLE, WS_NONE, ID_ScroBarREdit, //这两个文本框控件ID为113和114,右框
ScroBarXorg+ScroBarWidth+ScroBarHeight, ScroBarYorg, 2*ScroBarHeight, ScroBarHeight,
hWnd, 0, NULL);
SetFocusChild(GetDlgItem(hWnd,ID_ScroBar));
}
/**********************************************************************
**函数名:static void inittrend(HWND hWnd)
**功能:初始化“趋势”窗口中的所有自己画的方框,此函数在MSG_PAINT中执行
**参数:"趋势"窗口的句柄
**返回值:无
**作者:陈永奎
**时间:2008.03.31
***********************************************************************/
static void inittrend(HWND hWnd)
{
HDC hdc;
struct shortline Coordinate[5];//五条曲线横坐标上的坐标短线
struct label CoordinateLabel[15];//五条曲线纵坐标的数值
struct label vlabel[5];//从0到4,这五个成员分别为心电、体温、脉搏氧、呼吸率、血压五个标签
struct label hlabel[9];//从0到7,这八个成员分别为“趋势”窗口中下面参数表中的八个标签。心率
struct label Pointnum[5];//显示点数的坐标,0 100 200 300 400
struct label pointtime[5]; //表明各个点的时间,在下方显示。第一个点为开机时间,其他的依次加上六个小时
char *labeltext[11]={"心\n\r电","体\n\r温","脉搏氧","呼吸率","血\n\r压","心 率","收缩压","舒张压","平均压","脉 搏","趋势时间"};
char *CoLabelText[15]={"120","60","0","44.0","36.5","28.0"," ","100","50","30","15","0","180","90","0"};
int i=0;
unsigned int j=0, k=0;
char s[10];
/****************初始化水平标签*****************/
for(i=0;i<4;i++)
{
hlabel[i].text=labeltext[i];
hlabel[i].Xorg=PMT1Xorg+i*(HLabelWidth+HLabelSpace);
hlabel[i].Yorg=PMT1Yorg+HLabelHeight;
hlabel[i].Width=HLabelWidth;
hlabel[i].Height=HLabelHeight;
hlabel[i].bkclor=COLOR_black;
hlabel[i].fontcolor=COLOR_cyan;
hlabel[i].framcolor=COLOR_black;
}
hlabel[0].text=labeltext[5];
for(i=0;i<5;i++)
{
hlabel[i+4].text=labeltext[i+6];
hlabel[i+4].Xorg=PMT2Xorg+i*(HLabelWidth+HLabelSpace);
hlabel[i+4].Yorg=PMT2Yorg+HLabelHeight;
hlabel[i+4].Width=HLabelWidth;
hlabel[i+4].Height=HLabelHeight;
hlabel[i+4].bkclor=COLOR_black;
hlabel[i+4].fontcolor=COLOR_cyan;
hlabel[i+4].framcolor=COLOR_black;
}
hlabel[8].Xorg=TTXorg+1;
hlabel[8].Yorg=TTYorg+1;
hlabel[8].Width=TTWidth-2;
hdc=GetClientDC(hWnd);
for(i=0;i<9;i++)
{
DrawLabel(hdc,hlabel[i],'H');
}
ReleaseDC(hdc);
/****************初始化水平标签结束*****************/
/****************初始化竖直标签*****************/
for(i=0;i<5;i++)
{
vlabel[i].text=labeltext[i];
vlabel[i].Xorg=LabelECGXorg;
vlabel[i].Yorg=LabelECGYorg+i*(VLabelHeight+VLabelSpace);
vlabel[i].Width=VLabelWidth;
vlabel[i].Height=VLabelHeight;
vlabel[i].bkclor=COLOR_black;
vlabel[i].fontcolor=COLOR_cyan;
vlabel[i].framcolor=COLOR_cyan;
}
vlabel[4].Yorg+=8;
hdc=GetClientDC(hWnd);
for(i=0;i<5;i++)
{
DrawLabel(hdc,vlabel[i],'V');
}
ReleaseDC(hdc);
/****************初始化竖直标签结束*****************/
/****************初始化各个方框*****************/
Curve[0].left=ECGRectXorg;
Curve[0].top=ECGRectYorg;
Curve[0].bottom=ECGRectYorg+CurveHeight;
Curve[0].right=ECGRectXorg+CurveWidth;
Curve[1].left=AHRectXorg;
Curve[1].top=AHRectYorg;
Curve[1].right=AHRectXorg+CurveWidth;
Curve[1].bottom=AHRectYorg+CurveHeight;
Curve[2].left=SGRectXorg;
Curve[2].top=SGRectYorg;
Curve[2].right=SGRectXorg+CurveWidth;
Curve[2].bottom=SGRectYorg+CurveHeight;
Curve[3].left=BTRectXorg;
Curve[3].top=BTRectYorg;
Curve[3].right=BTRectXorg+CurveWidth;
Curve[3].bottom=BTRectYorg+CurveHeight;
Curve[4].left=BPRectXorg;
Curve[4].top=BPRectYorg;
Curve[4].right=BPRectXorg+CurveWidth;
Curve[4].bottom=BPRectYorg+CurveHeight;
Curve[5].left=TTXorg;
Curve[5].top=TTYorg;
Curve[5].right=TTXorg+TTWidth;
Curve[5].bottom=TTYorg+TTHeight;
Curve[6].left=PMT1Xorg;
Curve[6].top=PMT1Yorg;
Curve[6].right=PMT1Xorg+PMTWidth;
Curve[6].bottom=PMT1Yorg+PMTHeight;
Curve[7].left=PMT2Xorg;
Curve[7].top=PMT2Yorg;
Curve[7].right=PMT2Xorg+PMTWidth;
Curve[7].bottom=PMT2Yorg+PMTHeight;
hdc=GetClientDC(hWnd);
for(i=0;i<8;i++)
{
DrawRect(hdc,Curve[i],COLOR_cyan);
if((6==i) || (7==i))
{
SetPenColor(hdc,COLOR_cyan);
MoveTo(hdc,Curve[i].left,Curve[i].top+HLabelHeight*2);
LineTo(hdc,Curve[i].right,Curve[i].top+HLabelHeight*2);
for(j=0;j<3;j++)
{
MoveTo(hdc,Curve[i].left+(j+1)*HLabelWidth,Curve[i].top);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -