⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 trend.c

📁 用MINIGUI编写的窗口代码
💻 C
📖 第 1 页 / 共 2 页
字号:
#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 + -