温度传感器室温监控仪
说明
这是一个课程设计内容,需要配合一个温度传感器进行使用,难点是串口的使用。
在本程序中,还需要懂得IEEE 754标准下的浮点数在计算机中的存储方式,否则无法将读取到的二进制数正确的转换为十进制数字。
步骤
Mysql的安装与使用
Codeblocks的安装与使用
codeblocks下使用mysql见我的这篇文章http://blog.csdn.net/celte/article/details/9908877
打开codeblocks后,文件——新建——项目——Win32 GUI Project——FrameBased——下一步——完成,即可编程。
注意
本程序中需要使用ini格式的配置文件,文件如下,还需要使用Mysql数据库,数据库中只需要建立temperature一张表,表中两个字段time(datetime),value(double)
config.ini
[DataBase]
IP=127.0.0.1
DB=sensor
User=root
Pass=1324354657
[Interval]
Time=3000
[GraphOnShow]
OnShow=false
[StartPoint]
Date=2013-09-17
Time=19:37:46
mark.ini
[2013-09-17-19:12:21]
Wrong=37.8
Right=37.9
代码
Function.h
/************************************************************/
/***这个头文件包含的都是此项目的一些处理函数,与界面无关***/
/************************************************************/#ifndef FUNCTION_H_INCLUDED
#define FUNCTION_H_INCLUDED#include <winsock.h>
#include <mysql.h> //包含MySQL所需要的头文件
#include <WinSock2.h> //Socket,连接MySQL也需要用的HWND Hwnd_STATIC_StateInfo;/**
**作用:从配置文件中读取出所有的Section名称
**参数:arrSection为返回的Section名称数组,filename为要打开的配置文件的路径
**返回值:为arrSection中Section的个数
**/
int GetSections(char arrSection[][100],char *filename)
{int i=0,iPos=0,iMaxCount=0;char chSectionNames[100000]= {'\0'};char chSection[200]= {'\0'};GetPrivateProfileSectionNames(chSectionNames,100000,filename);for(i=0; i<100000; i++){if(chSectionNames[i]==0)if(chSectionNames[i]==chSectionNames[i+1])break;}iMaxCount=i+1;int iName=0;if(chSectionNames[0]==0){return 0;//说明元素为空}for(i=0; i<iMaxCount; i++){chSection[iPos++]=chSectionNames[i];if(chSectionNames[i]==0){strcpy(arrSection[iName++],chSection);memset(chSection,'\0',i);iPos=0;}}return iName;
}
/**
**作用:从任意一个Section下读取出配置的键值
**参数:section为该Section的名称,key为该Section下的键的名称,value为返回的该key下面的值
**/
void GetSectionValue(char *section,char *key,char *value)
{GetPrivateProfileString(section,key,NULL,value,100,".//config.ini");
}
/**
**作用:从任意一个Section下修改键值
**参数:section为该Section的名称,key为该Section下的键的名称,value为需要设置的该key下面的值
**/
void SetSectionValue(char *section,char *key,char *value)
{WritePrivateProfileString(section,key,value,".//config.ini");
}char MarkSection[500][100];
int MarkSectionNum;
/**
**作用:添加一组传感器温度标定
**参数:wrong为输入的传感器的错误温度,right为输入的标定的正确温度
**/
void AddMarkSecion(char *wrong,char *right)
{SYSTEMTIME sysTime;GetLocalTime( &sysTime );char nowTime[50];sprintf(nowTime,"%4d-%02d-%02d-%02d:%02d:%02d",sysTime.wYear,sysTime.wMonth,sysTime.wDay,sysTime.wHour,sysTime.wMinute, sysTime.wSecond);WritePrivateProfileString(nowTime,"Wrong",wrong,".//mark.ini");WritePrivateProfileString(nowTime,"Right",right,".//mark.ini");
}
/**
**作用:删除指定的标记项
**参数:index为要删除的Section的序号
**返回值:返回1表示删除成功,返回0表示给出的index参数有问题
**/
int DeleteMarkSection(int index)
{if(index<0)return 0;char SectionNames[500][100];int num=GetSections(SectionNames,".//mark.ini");if(index>=num)return 0;WritePrivateProfileString(SectionNames[index],NULL,NULL,".//mark.ini");return 1;
}
/**
**作用:把标定的配置文件中的数据转化成字符串方便后面在ListBox中输出
**参数:StringValue是返回的字符串数据
**返回值:是StringValue中值的数量
**/
int GetMarkStringValue(char StringValue[][100])
{int MarkSectionNum=GetSections(MarkSection,".//mark.ini");int i;int index=0;for(i=0; i<500; i++)memset(StringValue[i],'\0',100);for(i=0; i<MarkSectionNum; i++){char temp_wrong[20];char temp_right[20];GetPrivateProfileString(MarkSection[i],"Wrong",NULL,temp_wrong,20,".//mark.ini");GetPrivateProfileString(MarkSection[i],"Right",NULL,temp_right,20,".//mark.ini");sprintf(StringValue[index++],"传感器值:%s℃ 标定值:%s℃",temp_wrong,temp_right);}return MarkSectionNum;
}
/**
**作用:计算出温度标定配置文件中的数据的最终偏移量
**参数:value为返回值,为正确值与测定量之间的误差值
**说明:此函数在线程函数中调用
**解释:这个偏移量是按照所给的所有值的偏移量计算出平均的偏移量,作用于所有的值上面的
**/
void GetMarkNum(double *value)
{char SectionNames[10000][100];int num=GetSections(SectionNames,".//mark.ini");double tol_wrong=0;double tol_right=0;int i=0;for(i=0; i<num; i++){char temp_wrong[20];char temp_right[20];GetPrivateProfileString(SectionNames[i],"Wrong",NULL,temp_wrong,20,".//mark.ini");GetPrivateProfileString(SectionNames[i],"Right",NULL,temp_right,20,".//mark.ini");tol_wrong+=atoi(temp_wrong);tol_right+=atoi(temp_right);}if(num==0)*value=0;else*value=(tol_right-tol_wrong)*1.0/num;
}HANDLE hCom=INVALID_HANDLE_VALUE;//这个是打开串口后的串口句柄
/**
**作用:将读取到的温度二进制值转化成浮点数
**参数:byte为读取到的二进制字节,length为字节的长度,value为返回的浮点数
**返回值:返回1为正确,返回0为错误
**/
int ByteToDouble(char *byte,int length,double *value)
{if(length!=5)return 0;//此时说明串口读取的值有问题char ByteString[32];memset(ByteString,0,32);int i=0;int index=0;for(i=0; i<4; i++){int target=byte[i];ByteString[index++]=(target & 128)>>7;ByteString[index++]=(target & 64)>>6;ByteString[index++]=(target & 32)>>5;ByteString[index++]=(target & 16)>>4;ByteString[index++]=(target & 8)>>3;ByteString[index++]=(target & 4)>>2;ByteString[index++]=(target & 2)>>1;ByteString[index++]=(target & 1);}for(i=0; i<32; i++){printf("%d",ByteString[i]);if((i+1)%8==0)printf("\n");else{if((i+1)%4==0)printf(" ");}}if(ByteString[0]==1)ByteString[0]=0;//此时第一个字节就是原码了,可以直接转化else//此时是负数{for(i=7; i>0; i--)if(ByteString[i]==1)break;if(i<7)ByteString[i]=0;for(; i<8; i++)ByteString[i]=1;ByteString[7]=0;for(i=1; i<8; i++){if(ByteString[i]==1)ByteString[i]=0;elseByteString[i]=1;}}int power=0;//指数for(i=1; i<8; i++) //求出指数{int j=0;int temp=ByteString[i];for(j=7-i; j>0; j--)temp*=2;power+=temp;}ByteString[8]=1;*value=0;for(i=8; i<8+power; i++) //计算整数部分{int j=0;int temp=ByteString[i];for(j=power+7-i; j>0; j--)temp*=2;*value+=temp;}for(i=8+power; i<32; i++) //计算小数部分{int j=0;double temp=ByteString[i]*1.0;for(j=i-7-power; j>0; j--)temp*=0.5;*value+=temp;}return 1;
}
/**
**作用:从注册表中读取出当前电脑的所有端口号
**参数:ports返回读取的所有的端口号;num返回读取到的端口个数
**返回值:返回0代表打开注册表失败,返回1代表读取注册表成功
**注意:经测试,若没有串口号,则打开注册表失败(此时不存在SERIALCOMM项,刚开机时)
**若插上后又拔下,就会存在这个SERIALCOMM
**/
int getPortName(char ports[][20],int *num)
{HKEY hkey;LONG lRes = RegOpenKeyEx(HKEY_LOCAL_MACHINE,"HARDWARE\\DEVICEMAP\\SERIALCOMM",NULL,KEY_QUERY_VALUE|KEY_ENUMERATE_SUB_KEYS|KEY_READ,&hkey);if(lRes!=ERROR_SUCCESS){*num=0;return 0;}int portsIndex=0;TCHAR tchKey[MAX_PATH];//读到的键的名称TCHAR tchValue[20];//键的值DWORD dwIndex = 0;// 读取名称的索引号,也即在注册表中的序号DWORD dwType = REG_SZ;//键的值的类型while(lRes == ERROR_SUCCESS){DWORD dwCount = MAX_PATH;//读取到的键的名称的长度DWORD dwVCount = 20;//键的值得长度memset(tchValue,'\0',20);lRes = RegEnumValue(hkey,dwIndex++,tchKey,&dwCount,NULL,&dwType,(LPBYTE)tchValue,&dwVCount);if(lRes == ERROR_SUCCESS){if((dwVCount > 0) && (dwCount > 0)){memset(ports[portsIndex],'\0',20);int j=0;for(j=strlen(tchValue)-1; j>-1; j--)tchValue[j+4]=tchValue[j];tchValue[0]='\\';tchValue[1]='\\';tchValue[2]='.';tchValue[3]='\\';strcpy(ports[portsIndex++],tchValue);}}}*num=portsIndex;if(portsIndex)return 1;return 0;
}
/**
**作用:在读写操作之前进行调用重置
**注释:仅仅使用在Inquery函数中
**/
void ResetBuff(HANDLE hCom)
{//在读写串口之前,还要用PurgeComm()函数清空缓冲区:PurgeComm(hCom,PURGE_TXCLEAR|PURGE_RXCLEAR);//终止目前正在进行的读或写操作//在调用ReadFile和WriteFile之前,线程应该调用ClearCommError函数清除错误标志。COMSTAT ComStat;DWORD dwError=0;ClearCommError ( hCom , &dwError , &ComStat );
}
/**
**作用:用CreateFile函数连接上端口后,端口配置操作
**/
void ConfigPort()
{//配置串口DCB dcb;GetCommState (hCom, &dcb);dcb.BaudRate = CBR_57600; //波特率为9600dcb.ByteSize = 8; //数据位为8dcb.StopBits = ONESTOPBIT;//停止位为1dcb.Parity = NOPARITY; //无校验SetCommState (hCom, &dcb);//指定程序接受特定串口事件SetCommMask(hCom,EV_RXFLAG);//设置I/O缓冲区SetupComm(hCom, 1024, 1024);//设置超时COMMTIMEOUTS TimeOuts;TimeOuts.ReadIntervalTimeout=1000; //读间隔超时TimeOuts.ReadTotalTimeoutMultiplier=500; //读时间系数TimeOuts.ReadTotalTimeoutConstant=5000; //读时间常量TimeOuts.WriteTotalTimeoutMultiplier=500; //写时间系数TimeOuts.WriteTotalTimeoutConstant=2000; //写时间常量SetCommTimeouts(hCom,&TimeOuts);
}
/**
**作用:向端口发送指令,并读取其返回值
**参数:choice标识进行何种查询操作,1为握手协议查询是否连接成功,2为查询温度值
**参数:result为查询后根据byte字节计算出的浮点值
**注意:若是握手协议,则返回的是0x31的值,也即49;若是查询温度,则返回温度浮点值
**/
void Inquery(int choice,double *result)
{memset(result,'\0',sizeof(result)/sizeof(char));if(choice==1)//握手协议{ResetBuff(hCom);char lpOutBuffer[4];lpOutBuffer[0]=35;lpOutBuffer[1]=0;lpOutBuffer[2]=13;lpOutBuffer[3]='\0';DWORD dwBytesWrite=3;WriteFile (hCom,lpOutBuffer,dwBytesWrite,&dwBytesWrite,NULL);ResetBuff(hCom);char str[20];memset(str,'\0',20);DWORD wCount;ReadFile(hCom,str,20,&wCount,NULL);if(wCount==1){*result=(str[0]-'\0');}else*result=0;}else//查询温度{ResetBuff(hCom);char lpOutBuffer[4];lpOutBuffer[0]=35;lpOutBuffer[1]=5;lpOutBuffer[2]=13;lpOutBuffer[3]='\0';DWORD dwBytesWrite=3;WriteFile (hCom,lpOutBuffer,dwBytesWrite,&dwBytesWrite,NULL);ResetBuff(hCom);char str[20];memset(str,'\0',20);DWORD wCount;ReadFile(hCom,str,20,&wCount,NULL);ByteToDouble(str,wCount,result);}
}
/**
**作用:根据注册表中的端口项,自动选择端口,然后打开端口
**返回值:返回0表示打开端口失败,打开1表示打开端口成功
**/
int ConnectSensor()
{char ports[100][20];int num=0;if(!getPortName(ports,&num))return 0;int i=0;hCom=INVALID_HANDLE_VALUE;for(i=0; i<num; i++){hCom=CreateFile(ports[i],GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);if(hCom==INVALID_HANDLE_VALUE)continue;ConfigPort();double result;Inquery(1,&result);if(result==49.0)return 1;hCom=INVALID_HANDLE_VALUE;}return 0;
}
/**
**作用:关闭串口连接
**/
void CloseSensor()
{if(hCom!=INVALID_HANDLE_VALUE)CloseHandle(hCom);
}MYSQL mysql, *sock; //声明MySQL的句柄
MYSQL_RES * MySQLresult;
/**
**作用:连接数据库
**返回值:若返回1表示连接数据库成功,返回0表示连接数据库失败
**/
int ConnectDB()
{char host[100];GetSectionValue("DataBase","IP",host);char user[100];GetSectionValue("DataBase","User",user);char passwd[100];GetSectionValue("DataBase","Pass",passwd);char db[100];GetSectionValue("DataBase","DB",db);unsigned int port = 3306; //这是MySQL的服务器的端口,如果你没有修改过的话就是3306。const char * unix_socket = NULL; //unix_socket这是unix下的,我在Windows下,所以就把它设置为NULLunsigned long client_flag = 0; //这个参数一般为0mysql_init(&mysql); //连接之前必须使用这个函数来初始化if ( (sock = mysql_real_connect(&mysql, host, user, passwd, db, port, unix_socket, client_flag) ) == NULL ) //连接MySQLreturn 0;elsereturn 1;
}
/**
**作用:关闭数据库连接
**/
void CloseDB()
{if(sock!=NULL)mysql_close(sock);
}
/**
**作用:把获取到的double温度值,转变成可用的sql语句,方便后面插入数据库
**参数:temperature是温度值,newPhrases是返回的sql语句字符串
**注意:进行温度值校正的步骤可以在此函数进行
**/
void getInsertPhrase(double temperature,char *newPhrase)
{memset(newPhrase,'\0',sizeof(newPhrase)/sizeof(char));SYSTEMTIME sysTime;GetLocalTime( &sysTime );sprintf(newPhrase,"insert into temperature (time,value) values ('%4d-%02d-%02d %02d:%02d:%02d',%.3lf)",sysTime.wYear,sysTime.wMonth,sysTime.wDay,sysTime.wHour,sysTime.wMinute, sysTime.wSecond,temperature);
}HANDLE monitorThread=INVALID_HANDLE_VALUE;
/**
**作用:线程核心函数,读取温度值,并写入数据库
**/
int index=0;
void ThreadFunc()
{while(1){double temperature;Inquery(2,&temperature);double Markvalue;GetMarkNum(&Markvalue);char value[20];memset(value,'\0',20);sprintf(value,"%.3lf℃",temperature+Markvalue);SetWindowText(Hwnd_STATIC_StateInfo,value);char sqlPhrase[200];getInsertPhrase(temperature+Markvalue,sqlPhrase);mysql_query(&mysql,sqlPhrase);//此函数若成功执行则返回0char intervalStr[100];GetSectionValue("Interval","Time",intervalStr);Sleep(atoi(intervalStr));}
}
/**
**作用:开始线程,获取温度值
**返回值:1表示开始线程,0表示线程已经存在,正在运行
**/
int StartThread()
{if(monitorThread==INVALID_HANDLE_VALUE){char date[20];char time[20];memset(date,'\0',20);memset(time,'\0',20);SYSTEMTIME sysTime;GetLocalTime( &sysTime );sprintf(date,"%4d-%02d-%02d",sysTime.wYear,sysTime.wMonth,sysTime.wDay);sprintf(time,"%02d:%02d:%02d",sysTime.wHour,sysTime.wMinute, sysTime.wSecond);WritePrivateProfileString("StartPoint","Date",date,".//config.ini");WritePrivateProfileString("StartPoint","Time",time,".//config.ini");monitorThread=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadFunc,NULL,0,NULL);return 1;}return 0;
}
/**
**作用:终止线程,停止查询
**返回值:1表示结束线程,0表示线程已经结束
**/
int StopThread()
{if(monitorThread!=INVALID_HANDLE_VALUE){TerminateThread(monitorThread,NULL);monitorThread=INVALID_HANDLE_VALUE;SetWindowText(Hwnd_STATIC_StateInfo,"未开始!");return 1;}return 0;
}/**
**作用:将从数据库中读取出的温度(double,但是读取出来后成了string)
**参数:str为需要转换的字符串,也即读取到的数据
**返回值:读取到的温度值
**/
double StringToDouble(char *str)
{int index=0;int hasPoint=0;int i=0;for(i=0; i<strlen(str); i++){index++;if(str[i]=='.'){hasPoint=1;break;}}double result=0;if(hasPoint==0){for(i=0; i<strlen(str); i++){if(str[i]=='-')continue;if(i<index-1){double temp=(str[i]-'0')*1.0;int j;for(j=0; j+i<index-1; j++)temp=temp*10;result+=temp;}}}else{for(i=0; i<strlen(str); i++){if(str[i]=='-')continue;if(str[i]=='.')continue;if(i<index-1){double temp=(str[i]-'0')*1.0;int j;for(j=0; j+i<index-2; j++)temp=temp*10;result+=temp;}else//小数{double temp=str[i]-'0';int j=0;for(j=0; j<(i+1-index); j++)temp=temp*1.0/10;result+=temp;}}}return result;
}HDC helpDC;
HBITMAP helpDCBack;
/**
**作用:画坐标图
**参数:hwnd为需要话坐标图的窗体句柄
**/
void DrawGraph(HWND hwnd)
{HDC hDC=GetWindowDC(hwnd);helpDC=CreateCompatibleDC(0);//辅助画图设备helpDCBack = CreateCompatibleBitmap(hDC,500,270);//创建画布SelectObject(helpDC,helpDCBack);RECT rcClient;GetClientRect(hwnd,&rcClient);HBRUSH brushTemp = (HBRUSH)GetStockObject(WHITE_BRUSH);//获得库存物体,白色画刷。FillRect(helpDC,&rcClient,brushTemp);//填充客户区域。HPEN hPen = CreatePen( PS_SOLID, 2, RGB(255,0,0) );SelectObject( helpDC, hPen );MoveToEx( helpDC, 30, 240, NULL );LineTo( helpDC, 470, 240 );MoveToEx( helpDC, 470, 240, NULL );LineTo(helpDC,465,235);MoveToEx( helpDC, 470, 240, NULL );LineTo(helpDC,465,245);MoveToEx( helpDC, 30, 240, NULL );LineTo(helpDC,30,30);MoveToEx( helpDC, 30, 30, NULL );LineTo(helpDC,25,35);MoveToEx( helpDC, 30, 30, NULL );LineTo(helpDC,35,35);TextOut(helpDC,20,226,"0",1);TextOut(helpDC,35,25,"温度/℃",7);TextOut(helpDC,472,225,"时间",4);TextOut(helpDC,10,185,"10",2);TextOut(helpDC,10,135,"20",2);TextOut(helpDC,10,85,"30",2);TextOut(helpDC,10,35,"40",2);DeleteObject(brushTemp);DeleteObject(hPen);ReleaseDC(hwnd,hDC);
}
/**
**作用:画坐标图上的折线关系
**返回值:从数据库中select出来的项的数目
**/
void DrawLine(HWND hwnd,char *sqlPhrase)
{mysql_query(&mysql, sqlPhrase);MySQLresult = mysql_store_result(&mysql);int count=0;MYSQL_ROW row;double largest=0;double smallest=0;double total=0;while((row = mysql_fetch_row(MySQLresult)) != NULL){double value=StringToDouble(row[1]);count++;if(largest<value)largest=value;if(count==1)smallest=value;if(smallest>value)smallest=value;total+=value;}mysql_free_result(MySQLresult);HDC hDC=GetWindowDC(hwnd);HPEN hPen1 = CreatePen( PS_SOLID, 2, RGB(0,255,0) );HPEN hPen2 = CreatePen( PS_DOT, 1, RGB(255,0,255) );//int yStep=200/largest;//y坐标是从30到240,共210像素int yStep=5;int xStep=430/count;//x坐标是从30到470,共440像素if(xStep==0)xStep=1;if(yStep==0)yStep=1;int index=0;SetTextColor(helpDC,RGB(0,0,255));SelectObject( helpDC, hPen2 );int xMax=xStep*(count-1)+30;MoveToEx( helpDC, 30,190, NULL );LineTo(helpDC,xMax,190);MoveToEx( helpDC, 30,140, NULL );LineTo(helpDC,xMax,140);MoveToEx( helpDC, 30,90, NULL );LineTo(helpDC,xMax,90);MoveToEx( helpDC, 30,40, NULL );LineTo(helpDC,xMax,40);LineTo(helpDC,xMax,240);char stringValue[100];memset(stringValue,'\0',100);sprintf(stringValue,"平均温度:%.3lf℃ 最高温度:%.3lf℃ 最低温度:%.3lf℃",total/(1.0*count),largest,smallest);TextOut(helpDC,30,5,stringValue,strlen(stringValue));mysql_query(&mysql, sqlPhrase);MySQLresult = mysql_store_result(&mysql);SelectObject( helpDC, hPen1 );char startTime[30];char stopTime[30];memset(startTime,'\0',30);memset(stopTime,'\0',30);while((row = mysql_fetch_row(MySQLresult)) != NULL){index++;if(index==1)strcpy(startTime,row[0]);if(index==count)strcpy(stopTime,row[0]);double value=StringToDouble(row[1]);int nowX=xStep*(index-1)+30;int nowY=240-(int)(yStep*value+0.5);if(index==1){MoveToEx(helpDC,nowX,nowY,NULL);LineTo(helpDC,nowX,nowY+1);LineTo(helpDC,nowX+1,nowY+1);LineTo(helpDC,nowX+1,nowY);MoveToEx(helpDC,nowX,nowY,NULL);}elseLineTo(helpDC,nowX,nowY);}TextOut(helpDC,5,245,startTime,19);TextOut(helpDC,xMax-80,245,stopTime,19);mysql_free_result(MySQLresult);DeleteObject(hPen1);DeleteObject(hPen2);BitBlt(hDC,0,0,500,270,helpDC,0,0,SRCCOPY);ReleaseDC(hwnd,hDC);
}/**
**作用:判断一个字符串是否都是数字
**参数:numStr是待检测的字符串
**返回值:若都为数字,则返回1;若不是则返回0
**/
int isNumber(char *numStr)
{int i=0;for(i=0; i<strlen(numStr); i++)if(numStr[i]<'0' || numStr[i]>'9')return 0;return 1;
}
/**
**作用:用来判断一个字符串是否是浮点数(可以是整数)
**参数:numStr是待检测的字符串
**返回值:返回1表示是浮点数,返回0表示不是
**/
int isDouble(char *numStr)
{int i=0;int count=0;for(i=0; i<strlen(numStr); i++){if(numStr[i]=='.')count++;}if(count>1)return 0;if(numStr[strlen(numStr)-1]=='.')return 0;for(i=0; i<strlen(numStr); i++)if(numStr[i]!='.')if(numStr[i]<'0' || numStr[i]>'9')return 0;return 1;
}
/**
**作用:判断字符串中是否含有空格或者Tab符
**参数:str为输入的需要检查的字符串
**返回值:返回1这含有空格符等,返回0则没有
**/
int hasSpace(char *str)
{int i=0;for(i=0; i<strlen(str); i++)if(str[i]==' ' || str[i]=='\t')return 1;return 0;
}/**
**作用:判断是否是符合“2013-08-25”格式的日期
**参数:str为需要检验的字符串
**返回值:1为符合格式,0为不符合
**/
int isRightDate(char *str)
{if(strlen(str)!=10)return 0;int i;for(i=0; i<10; i++){if(i==4 || i==7){if(str[i]!='-')return 0;}else{if(str[i]<'0' || str[i]>'9')return 0;}}return 1;
}
/**
**作用:判断是否是符合“22:20:09”格式的时间
**参数:str为需要检验的字符串
**返回值:1为符合格式,0为不符合
**/
int isRightTime(char *str)
{if(strlen(str)!=8)return 0;int i;for(i=0; i<8; i++){if(i==2 || i==5){if(str[i]!=':')return 0;}else{if(str[i]<'0' || str[i]>'9')return 0;}}return 1;
}#endif // FUNCTION_H_INCLUDED
Scene.h
/********************************************************/
/***这个头文件包含的都是与界面相关的声明以及函数定义***/
/********************************************************/#ifndef SCENE_H_INCLUDED
#define SCENE_H_INCLUDED#include "Function.h"HWND hwnd;//系统主窗口句柄
//下面的HWND声明的都是窗体控件的句柄#define ID_Common 10220#define ID_Menu_Start 10221
#define ID_Menu_Set 10223
#define ID_Menu_Inquery 10225
#define ID_Menu_Mark 10226
HMENU hMenu=CreateMenu();
/**
**作用:创建菜单
**/
void InitialMenu()
{AppendMenu(hMenu,MF_STRING,(UINT)ID_Menu_Start,"开始");AppendMenu(hMenu,MF_STRING,(UINT)ID_Menu_Inquery,"查询");AppendMenu(hMenu,MF_STRING,ID_Menu_Mark,"传感器标定");AppendMenu(hMenu,MF_STRING,ID_Menu_Set,"参数设置");SetMenu(hwnd,hMenu);
}HWND Hwnd_STATIC_Title;
HWND Hwnd_STATIC_State;
//HWND Hwnd_STATIC_StateInfo;//把这个的创建放在Function.h里面,因为线程中要用
/**
**作用:创建主窗口界面
**/
void CreateMainWindow(HWND hwnd, LPARAM lParam)
{Hwnd_STATIC_Title=CreateWindow(TEXT("STATIC"),TEXT("温度记录分析系统"),WS_CHILD | WS_VISIBLE,90,25,400,40,hwnd,(HMENU)ID_Common,((LPCREATESTRUCT) lParam)->hInstance,NULL);Hwnd_STATIC_State=CreateWindow(TEXT("STATIC"),TEXT("当前状态:"),WS_CHILD | WS_VISIBLE,130,140,150,30,hwnd,(HMENU)ID_Common,((LPCREATESTRUCT) lParam)->hInstance,NULL);Hwnd_STATIC_StateInfo=CreateWindow(TEXT("STATIC"),TEXT("未开始!"),WS_CHILD | WS_VISIBLE,290,140,200,30,hwnd,(HMENU)ID_Common,((LPCREATESTRUCT) lParam)->hInstance,NULL);
}
/**
**作用:控制主窗口界面的显示与隐藏
**/
void DisplayMainWindow(int nCmdShow)
{ShowWindow(Hwnd_STATIC_Title,nCmdShow);ShowWindow(Hwnd_STATIC_State,nCmdShow);ShowWindow(Hwnd_STATIC_StateInfo,nCmdShow);
}/**
**作用:设置界面的字体
**/
void SetWindowFont()
{HFONT hFont;hFont = CreateFont(40,15,0,0,FW_REGULAR,FALSE,FALSE,FALSE,GB2312_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,PROOF_QUALITY,FIXED_PITCH | FF_MODERN,"华文行楷");SendMessage(Hwnd_STATIC_Title,WM_SETFONT,(WPARAM)hFont,MAKELPARAM(TRUE,0));hFont = CreateFont(25,13,0,0,FW_REGULAR,FALSE,FALSE,FALSE,GB2312_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,PROOF_QUALITY,FIXED_PITCH | FF_MODERN,"华文彩云");SendMessage(Hwnd_STATIC_State,WM_SETFONT,(WPARAM)hFont,MAKELPARAM(TRUE,0));hFont = CreateFont(25,13,0,0,FW_REGULAR,FALSE,FALSE,FALSE,GB2312_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,PROOF_QUALITY,FIXED_PITCH | FF_MODERN,"华文新魏");SendMessage(Hwnd_STATIC_StateInfo,WM_SETFONT,(WPARAM)hFont,MAKELPARAM(TRUE,0));}#define ID_BUTTON_Mark_Add 10227
#define ID_LISTBOX_Mark 10228
#define ID_BUTTON_Mark_Delete 10229
#define ID_BUTTON_Mark_Cancel 10230
HWND Hwnd_STATIC_Mark_Title;
HWND Hwnd_STATIC_Mark_Add;
HWND Hwnd_STATIC_Mark_Add_Wrong;
HWND Hwnd_STATIC_Mark_Add_Right;
HWND Hwnd_STATIC_Mark_Has;
HWND Hwnd_Edit_Mark_Add_Wrong;
HWND Hwnd_Edit_Mark_Add_Right;
HWND Hwnd_BUTTON_Mark_Add;
HWND Hwnd_BUTTON_Mark_Delete;
HWND Hwnd_BUTTON_Mark_Cancel;
HWND Hwnd_LISTBOX_Mark;
/**
**作用:创建传感器温度值标定界面
**/
void CreateMarkWindow(HWND hwnd, LPARAM lParam)
{Hwnd_STATIC_Mark_Title=CreateWindow(TEXT("STATIC"),TEXT("传感器温度标定"),WS_CHILD,240,15,120,20,hwnd,(HMENU)ID_Common,((LPCREATESTRUCT) lParam)->hInstance,NULL);Hwnd_STATIC_Mark_Add=CreateWindow(TEXT("STATIC"),TEXT("添加温度标定值:"),WS_CHILD,120,45,120,20,hwnd,(HMENU)ID_Common,((LPCREATESTRUCT) lParam)->hInstance,NULL);Hwnd_STATIC_Mark_Add_Wrong=CreateWindow(TEXT("STATIC"),TEXT("传感器温度:"),WS_CHILD,150,75,90,20,hwnd,(HMENU)ID_Common,((LPCREATESTRUCT) lParam)->hInstance,NULL);Hwnd_STATIC_Mark_Add_Right=CreateWindow(TEXT("STATIC"),TEXT("实 际 温 度:"),WS_CHILD,150,105,90,20,hwnd,(HMENU)ID_Common,((LPCREATESTRUCT) lParam)->hInstance,NULL);Hwnd_Edit_Mark_Add_Wrong=CreateWindow(TEXT("EDIT"),TEXT(""),WS_CHILD | WS_BORDER|WS_TABSTOP,250,75,120,20,hwnd,(HMENU)ID_Common,((LPCREATESTRUCT) lParam)->hInstance,NULL);Hwnd_Edit_Mark_Add_Right=CreateWindow(TEXT("EDIT"),TEXT(""),WS_CHILD | WS_BORDER|WS_TABSTOP,250,105,120,20,hwnd,(HMENU)ID_Common,((LPCREATESTRUCT) lParam)->hInstance,NULL);Hwnd_BUTTON_Mark_Add=CreateWindow(TEXT("BUTTON"),TEXT("确定"),WS_CHILD|WS_TABSTOP,380,75,70,50,hwnd,(HMENU)ID_BUTTON_Mark_Add,((LPCREATESTRUCT) lParam)->hInstance,NULL);Hwnd_STATIC_Mark_Has=CreateWindow(TEXT("STATIC"),TEXT("已存在的标定值:"),WS_CHILD,120,135,120,20,hwnd,(HMENU)ID_Common,((LPCREATESTRUCT) lParam)->hInstance,NULL);Hwnd_LISTBOX_Mark=CreateWindow(TEXT("LISTBOX"),NULL,WS_CHILD | WS_BORDER | WS_VSCROLL | LBS_NOTIFY ,150,165,300,120,hwnd,(HMENU)ID_LISTBOX_Mark,((LPCREATESTRUCT) lParam)->hInstance,NULL);Hwnd_BUTTON_Mark_Delete=CreateWindow(TEXT("BUTTON"),TEXT("删除"),WS_CHILD|WS_TABSTOP,320,290,60,30,hwnd,(HMENU)ID_BUTTON_Mark_Delete,((LPCREATESTRUCT) lParam)->hInstance,NULL);Hwnd_BUTTON_Mark_Cancel=CreateWindow(TEXT("BUTTON"),TEXT("返回"),WS_CHILD|WS_TABSTOP,390,290,60,30,hwnd,(HMENU)ID_BUTTON_Mark_Cancel,((LPCREATESTRUCT) lParam)->hInstance,NULL);EnableWindow(Hwnd_BUTTON_Mark_Delete,FALSE);}
/**
**作用:控制传感器温度标定界面的显示与隐藏
**/
void DisplayMarkWindow(int nCmdShow)
{ShowWindow(Hwnd_STATIC_Mark_Title,nCmdShow);ShowWindow(Hwnd_STATIC_Mark_Add,nCmdShow);ShowWindow(Hwnd_STATIC_Mark_Add_Wrong,nCmdShow);ShowWindow(Hwnd_STATIC_Mark_Add_Right,nCmdShow);ShowWindow(Hwnd_Edit_Mark_Add_Right,nCmdShow);ShowWindow(Hwnd_Edit_Mark_Add_Wrong,nCmdShow);ShowWindow(Hwnd_BUTTON_Mark_Add,nCmdShow);ShowWindow(Hwnd_STATIC_Mark_Has,nCmdShow);ShowWindow(Hwnd_LISTBOX_Mark,nCmdShow);ShowWindow(Hwnd_BUTTON_Mark_Delete,nCmdShow);ShowWindow(Hwnd_BUTTON_Mark_Cancel,nCmdShow);SetWindowText(Hwnd_Edit_Mark_Add_Right,"");SetWindowText(Hwnd_Edit_Mark_Add_Wrong,"");SendMessage(Hwnd_LISTBOX_Mark,LB_RESETCONTENT ,0,NULL);if(nCmdShow==SW_SHOW){EnableWindow(Hwnd_BUTTON_Mark_Delete,FALSE);char MarkValue[500][100];int MarkValueNum;MarkValueNum=GetMarkStringValue(MarkValue);int i;for(i=0;i<MarkValueNum;i++)SendMessage(Hwnd_LISTBOX_Mark,LB_ADDSTRING ,0,(LPARAM)MarkValue[i]);}
}#define ID_BUTTON_Set_OK 10231
#define ID_BUTTON_Set_Cancel 10232
HWND Hwnd_BUTTON_Set_OK;
HWND Hwnd_BUTTON_Set_Cancel;
HWND Hwnd_STATIC_Set_Title;
HWND Hwnd_STATIC_Set_IP;
HWND Hwnd_STATIC_Set_User;
HWND Hwnd_STATIC_Set_Pass;
HWND Hwnd_STATIC_Set_DB;
HWND Hwnd_STATIC_Set_Interval;
HWND Hwnd_EDIT_Set_IP;
HWND Hwnd_EDIT_Set_User;
HWND Hwnd_EDIT_Set_Pass;
HWND Hwnd_EDIT_Set_DB;
HWND Hwnd_EDIT_Set_Interval;
/**
**作用:创建设置菜单界面的相关内容
**/
void CreateSetWindow(HWND hwnd, LPARAM lParam)
{Hwnd_STATIC_Set_Title=CreateWindow(TEXT("STATIC"),TEXT("系统参数设置"),WS_CHILD,240,15,90,20,hwnd,(HMENU)ID_Common,((LPCREATESTRUCT) lParam)->hInstance,NULL);Hwnd_STATIC_Set_IP=CreateWindow(TEXT("STATIC"),TEXT("数据库 IP地址:"),WS_CHILD,180,45,110,20,hwnd,(HMENU)ID_Common,((LPCREATESTRUCT) lParam)->hInstance,NULL);Hwnd_STATIC_Set_DB=CreateWindow(TEXT("STATIC"),TEXT("数据库名 称:"),WS_CHILD,180,75,110,20,hwnd,(HMENU)ID_Common,((LPCREATESTRUCT) lParam)->hInstance,NULL);Hwnd_STATIC_Set_User=CreateWindow(TEXT("STATIC"),TEXT("数据库用户名:"),WS_CHILD,180,105,110,20,hwnd,(HMENU)ID_Common,((LPCREATESTRUCT) lParam)->hInstance,NULL);Hwnd_STATIC_Set_Pass=CreateWindow(TEXT("STATIC"),TEXT("数据库密 码:"),WS_CHILD,180,135,110,20,hwnd,(HMENU)ID_Common,((LPCREATESTRUCT) lParam)->hInstance,NULL);Hwnd_STATIC_Set_Interval=CreateWindow(TEXT("STATIC"),TEXT("温度查询间隔:"),WS_CHILD,180,165,110,20,hwnd,(HMENU)ID_Common,((LPCREATESTRUCT) lParam)->hInstance,NULL);Hwnd_EDIT_Set_IP=CreateWindow(TEXT("EDIT"),TEXT(""),WS_CHILD | WS_BORDER|WS_TABSTOP,290,45,90,20,hwnd,(HMENU)ID_Common,((LPCREATESTRUCT) lParam)->hInstance,NULL);Hwnd_EDIT_Set_DB=CreateWindow(TEXT("EDIT"),TEXT(""),WS_CHILD | WS_BORDER|WS_TABSTOP,290,75,90,20,hwnd,(HMENU)ID_Common,((LPCREATESTRUCT) lParam)->hInstance,NULL);Hwnd_EDIT_Set_User=CreateWindow(TEXT("EDIT"),TEXT(""),WS_CHILD | WS_BORDER|WS_TABSTOP,290,105,90,20,hwnd,(HMENU)ID_Common,((LPCREATESTRUCT) lParam)->hInstance,NULL);Hwnd_EDIT_Set_Pass=CreateWindow(TEXT("EDIT"),TEXT(""),WS_CHILD | WS_BORDER|WS_TABSTOP,290,135,90,20,hwnd,(HMENU)ID_Common,((LPCREATESTRUCT) lParam)->hInstance,NULL);Hwnd_EDIT_Set_Interval=CreateWindow(TEXT("EDIT"),TEXT(""),WS_CHILD | WS_BORDER|WS_TABSTOP,290,165,90,20,hwnd,(HMENU)ID_Common,((LPCREATESTRUCT) lParam)->hInstance,NULL);Hwnd_BUTTON_Set_OK=CreateWindow(TEXT("BUTTON"),TEXT("确定"),WS_CHILD|WS_TABSTOP,250,200,60,30,hwnd,(HMENU)ID_BUTTON_Set_OK,((LPCREATESTRUCT) lParam)->hInstance,NULL);Hwnd_BUTTON_Set_Cancel=CreateWindow(TEXT("BUTTON"),TEXT("返回"),WS_CHILD|WS_TABSTOP,320,200,60,30,hwnd,(HMENU)ID_BUTTON_Set_Cancel,((LPCREATESTRUCT) lParam)->hInstance,NULL);}
/**
**作用:控制设置界面的显示与隐藏
**/
void DisplaySetWindow(int nCmdShow)
{ShowWindow(Hwnd_STATIC_Set_Title,nCmdShow);ShowWindow(Hwnd_STATIC_Set_IP,nCmdShow);ShowWindow(Hwnd_STATIC_Set_DB,nCmdShow);ShowWindow(Hwnd_STATIC_Set_User,nCmdShow);ShowWindow(Hwnd_STATIC_Set_Pass,nCmdShow);ShowWindow(Hwnd_STATIC_Set_Interval,nCmdShow);ShowWindow(Hwnd_EDIT_Set_IP,nCmdShow);ShowWindow(Hwnd_EDIT_Set_DB,nCmdShow);ShowWindow(Hwnd_EDIT_Set_User,nCmdShow);ShowWindow(Hwnd_EDIT_Set_Pass,nCmdShow);ShowWindow(Hwnd_EDIT_Set_Interval,nCmdShow);ShowWindow(Hwnd_BUTTON_Set_OK,nCmdShow);ShowWindow(Hwnd_BUTTON_Set_Cancel,nCmdShow);if(nCmdShow==SW_SHOW)//若是显示,则把当前设置显示出来{char value[100];GetSectionValue("DataBase","IP",value);SetWindowText(Hwnd_EDIT_Set_IP,value);GetSectionValue("DataBase","DB",value);SetWindowText(Hwnd_EDIT_Set_DB,value);GetSectionValue("DataBase","User",value);SetWindowText(Hwnd_EDIT_Set_User,value);GetSectionValue("DataBase","Pass",value);SetWindowText(Hwnd_EDIT_Set_Pass,value);GetSectionValue("Interval","Time",value);SetWindowText(Hwnd_EDIT_Set_Interval,value);}
}HWND Hwnd_Graph_Title;
HWND Hwnd_Graph_Graph;
/**
**作用:创建温度走向图的窗体界面
**/
void CreateGraphWindow(HWND hwnd, LPARAM lParam)
{Hwnd_Graph_Title=CreateWindow(TEXT("STATIC"),TEXT("温度走向图"),WS_CHILD,240,15,160,20,hwnd,(HMENU)ID_Common,((LPCREATESTRUCT) lParam)->hInstance,NULL);Hwnd_Graph_Graph=CreateWindow(TEXT("STATIC"),TEXT(""),WS_CHILD | WS_BORDER,50,50,500,270,hwnd,(HMENU)ID_Common,((LPCREATESTRUCT) lParam)->hInstance,NULL);
}
/**
**作用:控制温度走向图界面的显示与隐藏
**/
void DisplayGraphWindow(int nCmdShow)
{ShowWindow(Hwnd_Graph_Title,nCmdShow);ShowWindow(Hwnd_Graph_Graph,nCmdShow);if(nCmdShow==SW_SHOW){DrawGraph(Hwnd_Graph_Graph);WritePrivateProfileString("GraphOnShow","OnShow","true",".//config.ini");}else{DeleteObject(helpDCBack);DeleteDC(helpDC);WritePrivateProfileString("GraphOnShow","OnShow","false",".//config.ini");}
}#define ID_BUTTON_Inquery_OK 10233
#define ID_BUTTON_Inquery_Cancel 10234
HWND Hwnd_STATIC_Inquery_Title;
HWND Hwnd_STATIC_Inquery_StartTitle;
HWND Hwnd_STATIC_Inquery_StartDate;
HWND Hwnd_STATIC_Inquery_StartTime;
HWND Hwnd_STATIC_Inquery_StopTitle;
HWND Hwnd_STATIC_Inquery_StopDate;
HWND Hwnd_STATIC_Inquery_StopTime;
HWND Hwnd_EDIT_Inquery_StartDate;
HWND Hwnd_EDIT_Inquery_StartTime;
HWND Hwnd_EDIT_Inquery_StopDate;
HWND Hwnd_EDIT_Inquery_StopTime;
HWND Hwnd_BUTTON_Inquery_OK;
HWND Hwnd_BUTTON_Inquery_Cancel;
/**
**作用:创建温度查询输入时间段的界面
**/
void CreateInqueryWindow(HWND hwnd, LPARAM lParam)
{Hwnd_STATIC_Inquery_Title=CreateWindow(TEXT("STATIC"),TEXT("温度走向图查询参数"),WS_CHILD,220,15,160,20,hwnd,(HMENU)ID_Common,((LPCREATESTRUCT) lParam)->hInstance,NULL);Hwnd_STATIC_Inquery_StartTitle=CreateWindow(TEXT("STATIC"),TEXT("开始时间点:"),WS_CHILD,180,45,90,20,hwnd,(HMENU)ID_Common,((LPCREATESTRUCT) lParam)->hInstance,NULL);Hwnd_STATIC_Inquery_StartDate=CreateWindow(TEXT("STATIC"),TEXT("日期:"),WS_CHILD,210,75,50,20,hwnd,(HMENU)ID_Common,((LPCREATESTRUCT) lParam)->hInstance,NULL);Hwnd_EDIT_Inquery_StartDate=CreateWindow(TEXT("EDIT"),TEXT(""),WS_CHILD | WS_BORDER|WS_TABSTOP,260,75,120,20,hwnd,(HMENU)ID_Common,((LPCREATESTRUCT) lParam)->hInstance,NULL);Hwnd_STATIC_Inquery_StartTime=CreateWindow(TEXT("STATIC"),TEXT("时间:"),WS_CHILD,210,105,50,20,hwnd,(HMENU)ID_Common,((LPCREATESTRUCT) lParam)->hInstance,NULL);Hwnd_EDIT_Inquery_StartTime=CreateWindow(TEXT("EDIT"),TEXT(""),WS_CHILD | WS_BORDER|WS_TABSTOP,260,105,120,20,hwnd,(HMENU)ID_Common,((LPCREATESTRUCT) lParam)->hInstance,NULL);Hwnd_STATIC_Inquery_StopTitle=CreateWindow(TEXT("STATIC"),TEXT("结束时间点:"),WS_CHILD,180,135,90,20,hwnd,(HMENU)ID_Common,((LPCREATESTRUCT) lParam)->hInstance,NULL);Hwnd_STATIC_Inquery_StopDate=CreateWindow(TEXT("STATIC"),TEXT("日期:"),WS_CHILD,210,165,50,20,hwnd,(HMENU)ID_Common,((LPCREATESTRUCT) lParam)->hInstance,NULL);Hwnd_EDIT_Inquery_StopDate=CreateWindow(TEXT("EDIT"),TEXT(""),WS_CHILD | WS_BORDER|WS_TABSTOP,260,165,120,20,hwnd,(HMENU)ID_Common,((LPCREATESTRUCT) lParam)->hInstance,NULL);Hwnd_STATIC_Inquery_StopTime=CreateWindow(TEXT("STATIC"),TEXT("时间:"),WS_CHILD,210,195,50,20,hwnd,(HMENU)ID_Common,((LPCREATESTRUCT) lParam)->hInstance,NULL);Hwnd_EDIT_Inquery_StopTime=CreateWindow(TEXT("EDIT"),TEXT(""),WS_CHILD | WS_BORDER|WS_TABSTOP,260,195,120,20,hwnd,(HMENU)ID_Common,((LPCREATESTRUCT) lParam)->hInstance,NULL);Hwnd_BUTTON_Inquery_OK=CreateWindow(TEXT("BUTTON"),TEXT("确定"),WS_CHILD|WS_TABSTOP,250,225,60,30,hwnd,(HMENU)ID_BUTTON_Inquery_OK,((LPCREATESTRUCT) lParam)->hInstance,NULL);Hwnd_BUTTON_Inquery_Cancel=CreateWindow(TEXT("BUTTON"),TEXT("返回"),WS_CHILD|WS_TABSTOP,320,225,60,30,hwnd,(HMENU)ID_BUTTON_Inquery_Cancel,((LPCREATESTRUCT) lParam)->hInstance,NULL);}
/**
**作用:控制温度查询输入时间段界面的显示与隐藏
**/
void DisplayInqueryWindow(int nCmdShow)
{ShowWindow(Hwnd_STATIC_Inquery_Title,nCmdShow);ShowWindow(Hwnd_STATIC_Inquery_StartTitle,nCmdShow);ShowWindow(Hwnd_STATIC_Inquery_StartDate,nCmdShow);ShowWindow(Hwnd_EDIT_Inquery_StartDate,nCmdShow);ShowWindow(Hwnd_STATIC_Inquery_StartTime,nCmdShow);ShowWindow(Hwnd_EDIT_Inquery_StartTime,nCmdShow);ShowWindow(Hwnd_STATIC_Inquery_StopTitle,nCmdShow);ShowWindow(Hwnd_STATIC_Inquery_StopDate,nCmdShow);ShowWindow(Hwnd_EDIT_Inquery_StopDate,nCmdShow);ShowWindow(Hwnd_STATIC_Inquery_StopTime,nCmdShow);ShowWindow(Hwnd_EDIT_Inquery_StopTime,nCmdShow);ShowWindow(Hwnd_BUTTON_Inquery_Cancel,nCmdShow);ShowWindow(Hwnd_BUTTON_Inquery_OK,nCmdShow);SetWindowText(Hwnd_EDIT_Inquery_StartDate,"0000-00-00");SetWindowText(Hwnd_EDIT_Inquery_StartTime,"00:00:00");SetWindowText(Hwnd_EDIT_Inquery_StopDate,"9999-99-99");SetWindowText(Hwnd_EDIT_Inquery_StopTime,"00:00:00");}#endif // SCENE_H_INCLUDED
main.cpp
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "Scene.h"
//#include "Function.h"LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);int WINAPI WinMain (HINSTANCE hThisInstance,HINSTANCE hPrevInstance,LPSTR lpszArgument,int nCmdShow)
{MSG messages; /* Here messages to the application are saved */WNDCLASSEX wincl; /* Data structure for the windowclass */char szClassName[ ] = "CodeBlocksWindowsApp";/* The Window structure */wincl.hInstance = hThisInstance;wincl.lpszClassName = szClassName;wincl.lpfnWndProc = WindowProcedure; /* This function is called by windows */wincl.style = CS_DBLCLKS; /* Catch double-clicks */wincl.cbSize = sizeof (WNDCLASSEX);/* Use default icon and mouse-pointer */wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);wincl.hCursor = LoadCursor (NULL, IDC_ARROW);wincl.lpszMenuName = NULL; /* No menu */wincl.cbClsExtra = 0; /* No extra bytes after the window class */wincl.cbWndExtra = 0; /* structure or the window instance *//* Use Windows's default colour as the background of the window */wincl.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH);/* Register the window class, and if it fails quit the program */if (!RegisterClassEx (&wincl))return 0;/* The class is registered, let's create the program*/hwnd = CreateWindowEx (0, /* Extended possibilites for variation */szClassName, /* Classname */"温度记录分析系统", /* Title Text */WS_MINIMIZEBOX|WS_SYSMENU|WS_CAPTION|WS_OVERLAPPED, /* default window */400, /* Windows decides the position */200, /* where the window ends up on the screen */600, /* The programs width */400, /* and height in pixels */HWND_DESKTOP, /* The window is a child-window to desktop */NULL, /* No menu */hThisInstance, /* Program Instance handler */NULL /* No Window Creation data */);InitialMenu();/* Make the window visible on the screen */ShowWindow (hwnd, nCmdShow);/* Run the message loop. It will run until GetMessage() returns 0 */while (GetMessage (&messages, NULL, 0, 0)){if(!IsDialogMessage(hwnd,&messages)){/* Translate virtual-key messages into character messages */TranslateMessage(&messages);/* Send message to WindowProcedure */DispatchMessage(&messages);}else{TranslateMessage(&messages);DispatchMessage(&messages);}}/* The program return-value is 0 - The value that PostQuitMessage() gave */return messages.wParam;
}/* This function is called by the Windows function DispatchMessage() */
LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{switch (message){case WM_CREATE://Create Window{CreateMainWindow(hwnd,lParam);CreateMarkWindow(hwnd,lParam);CreateSetWindow(hwnd,lParam);CreateGraphWindow(hwnd,lParam);CreateInqueryWindow(hwnd,lParam);SetWindowFont();break;}case WM_COMMAND://send command to the window during runtime{switch(LOWORD(wParam)){case ID_Menu_Start://click START menu{if(sock==NULL)//判断数据库是否连接上{if(!ConnectDB()){MessageBox(hwnd,"连接数据库失败!\n请检查参数是否有误!","错误!",MB_OK|MB_ICONERROR);break;}}if(hCom==INVALID_HANDLE_VALUE){if(!ConnectSensor()){MessageBox(hwnd,"连接传感器失败!\n请检查连接后重试!","错误!",MB_OK|MB_ICONERROR);break;}}int choice=StartThread();if(choice==1){MessageBox(NULL,"开始读取环境温度~","提示",MB_OK|MB_ICONINFORMATION);char value[10];memset(value,'\0',10);GetSectionValue("GraphOnShow","OnShow",value);if(strcmp(value,"true")==0){DisplayGraphWindow(SW_HIDE);DisplayMainWindow(SW_SHOW);}}if(choice==0)MessageBox(NULL,"线程正在运行并读取环境温度~","提示",MB_OK|MB_ICONINFORMATION);break;}case ID_Menu_Inquery://click QUERY menu{DisplayMainWindow(SW_HIDE);DisplayMarkWindow(SW_HIDE);DisplaySetWindow(SW_HIDE);DisplayGraphWindow(SW_HIDE);DisplayInqueryWindow(SW_SHOW);break;}case ID_Menu_Mark://click MARK menu{DisplayMainWindow(SW_HIDE);DisplayGraphWindow(SW_HIDE);DisplaySetWindow(SW_HIDE);DisplayInqueryWindow(SW_HIDE);DisplayMarkWindow(SW_SHOW);break;}case ID_Menu_Set://click SET menu{DisplayMainWindow(SW_HIDE);DisplayGraphWindow(SW_HIDE);DisplayMarkWindow(SW_HIDE);DisplayInqueryWindow(SW_HIDE);DisplaySetWindow(SW_SHOW);break;}case ID_LISTBOX_Mark://cilck item of ListBox in MARK menu{EnableWindow(Hwnd_BUTTON_Mark_Delete,TRUE);break;}case ID_BUTTON_Inquery_OK://cilck OK button in QUERY menu{char StartDate[20];char StartTime[20];char StopDate[20];char StopTime[20];memset(StartDate,'\0',20);memset(StartTime,'\0',20);memset(StopDate,'\0',20);memset(StopTime,'\0',20);GetWindowText(Hwnd_EDIT_Inquery_StartDate,StartDate,20);GetWindowText(Hwnd_EDIT_Inquery_StartTime,StartTime,20);GetWindowText(Hwnd_EDIT_Inquery_StopDate,StopDate,20);GetWindowText(Hwnd_EDIT_Inquery_StopTime,StopTime,20);if(!isRightDate(StartDate) || !isRightDate(StopDate)){MessageBox(hwnd,"请输入“2013-01-01”格式的日期","错误",MB_ICONERROR);break;}if(!isRightTime(StartTime) || !isRightTime(StopTime)){MessageBox(hwnd,"请输入“00:00:00”格式的时间","错误",MB_ICONERROR);break;}strcat(StartDate," ");strcat(StartDate,StartTime);strcat(StopDate," ");strcat(StopDate,StopTime);char sqlPhrase[500];memset(sqlPhrase,'\0',500);strcat(sqlPhrase,"select * from temperature where time>'");strcat(sqlPhrase,StartDate);strcat(sqlPhrase,"' and time<'");strcat(sqlPhrase,StopDate);strcat(sqlPhrase,"' order by time asc");if(sock==NULL)//判断数据库是否连接上{if(!ConnectDB()){MessageBox(hwnd,"连接数据库失败!\n请检查参数是否有误!","错误!",MB_OK|MB_ICONERROR);break;}}if(mysql_query(&mysql, sqlPhrase)!=0){MessageBox(hwnd,"查询失败!","错误",MB_ICONERROR);break;}if((MySQLresult = mysql_store_result(&mysql))==NULL){MessageBox(hwnd,"保存结果集失败!","错误",MB_ICONERROR);break;}int count=0;MYSQL_ROW row;while((row = mysql_fetch_row(MySQLresult)) != NULL)count++;mysql_free_result(MySQLresult);if(count==0){MessageBox(hwnd,"该时间段内没有温度值","提示",MB_ICONINFORMATION);break;}DisplayInqueryWindow(SW_HIDE);DisplayGraphWindow(SW_SHOW);//MessageBox(hwnd,"aaa","提示",MB_ICONINFORMATION);DrawLine(Hwnd_Graph_Graph,sqlPhrase);break;}case ID_BUTTON_Inquery_Cancel://cilck CANCEL button in QUERY menu{DisplayInqueryWindow(SW_HIDE);DisplayMainWindow(SW_SHOW);break;}case ID_BUTTON_Mark_Delete://cilck DELETE button in MARK menu{int index=SendMessage(Hwnd_LISTBOX_Mark, LB_GETCURSEL, 0, 0);DeleteMarkSection(index);SendMessage(Hwnd_LISTBOX_Mark,LB_DELETESTRING,index,NULL);EnableWindow(Hwnd_BUTTON_Mark_Delete,FALSE);break;}case ID_BUTTON_Mark_Cancel://click CANCEL button in MARK menu{DisplayMarkWindow(SW_HIDE);DisplayMainWindow(SW_SHOW);break;}case ID_BUTTON_Mark_Add://click ADD button in MARK menu{char wrong[50];char right[50];memset(wrong,'\0',50);memset(right,'\0',50);GetWindowText(Hwnd_Edit_Mark_Add_Wrong,wrong,50);GetWindowText(Hwnd_Edit_Mark_Add_Right,right,50);if(strlen(wrong)==0 || strlen(right)==0){MessageBox(hwnd,"请不要留空任何一项","错误",MB_ICONERROR);break;}if(!isDouble(wrong) || !isDouble(right)){MessageBox(hwnd,"只能输入整数或者浮点数!","错误",MB_ICONERROR);break;}AddMarkSecion(wrong,right);char result[100];sprintf(result,"传感器值:%s℃ 标定值:%s℃",wrong,right);SendMessage(Hwnd_LISTBOX_Mark,LB_ADDSTRING ,0,(LPARAM)result);SetWindowText(Hwnd_Edit_Mark_Add_Right,"");SetWindowText(Hwnd_Edit_Mark_Add_Wrong,"");break;}case ID_BUTTON_Set_OK://click OK button in SET menu{int sure=0;sure=MessageBox(hwnd,"确认修改参数?\n有些参数需要在重启程序后生效。","提示?",MB_YESNO|MB_ICONINFORMATION);if(sure!=IDYES)break;char IP[50];char DB[50];char User[50];char Pass[50];char Interval[50];memset(IP,'\0',50);memset(DB,'\0',50);memset(User,'\0',50);memset(Pass,'\0',50);memset(Interval,'\0',50);GetWindowText(Hwnd_EDIT_Set_IP,IP,50);GetWindowText(Hwnd_EDIT_Set_DB,DB,50);GetWindowText(Hwnd_EDIT_Set_User,User,50);GetWindowText(Hwnd_EDIT_Set_Pass,Pass,50);GetWindowText(Hwnd_EDIT_Set_Interval,Interval,50);if(strlen(IP)==0 || strlen(DB)==0 || strlen(User)==0 || strlen(Pass)==0 || strlen(Interval)==0){MessageBox(hwnd,"请不要留空任何一项","错误",MB_ICONERROR);break;}if(hasSpace(IP) || hasSpace(DB) || hasSpace(User) || hasSpace(Pass) || hasSpace(Interval)){MessageBox(hwnd,"请不要输入空格符","错误",MB_ICONERROR);break;}if(!isNumber(Interval)){MessageBox(hwnd,"温度查询间隔只能输入数字!","错误",MB_ICONERROR);break;}SetSectionValue("DataBase","IP",IP);SetSectionValue("DataBase","DB",DB);SetSectionValue("DataBase","User",User);SetSectionValue("DataBase","Pass",Pass);SetSectionValue("Interval","Time",Interval);DisplaySetWindow(SW_HIDE);DisplayMainWindow(SW_SHOW);break;}case ID_BUTTON_Set_Cancel://click CANCEL button in SET menu{DisplaySetWindow(SW_HIDE);DisplayMainWindow(SW_SHOW);break;}default:break;}break;}case WM_CTLCOLORSTATIC://set color of static{if((HWND)lParam==Hwnd_STATIC_Title){SetBkColor((HDC)wParam,RGB(255,255,255));SetTextColor((HDC)wParam,RGB(0,200,0));return (LRESULT)GetStockObject(NULL_BRUSH);}else if((HWND)lParam==Hwnd_STATIC_State){SetBkColor((HDC)wParam,RGB(255,255,255));SetTextColor((HDC)wParam,RGB(100,0,255));return (LRESULT)GetStockObject(NULL_BRUSH);}else if((HWND)lParam==Hwnd_STATIC_StateInfo){SetBkColor((HDC)wParam,RGB(255,255,255));SetTextColor((HDC)wParam,RGB(200,0,0));return (LRESULT)GetStockObject(NULL_BRUSH);}else{SetBkColor((HDC)wParam,RGB(255,255,255));SetTextColor((HDC)wParam,RGB(0,0,0));return (LRESULT)GetStockObject(NULL_BRUSH);}break;}case WM_CLOSE://on close window{int ok=0;ok=MessageBox(hwnd,"是否确认退出?","退出?",MB_YESNO|MB_ICONINFORMATION);if(ok==IDYES){StopThread();CloseDB();CloseSensor();DestroyWindow(hwnd);}return 0 ;}case WM_PAINT://paint the graph of temperature{PAINTSTRUCT ps;HDC hdc;hdc =BeginPaint (hwnd, &ps) ;char value[10];memset(value,'\0',10);GetSectionValue("GraphOnShow","OnShow",value);if(strcmp(value,"true")==0){HDC hDC=GetWindowDC(Hwnd_Graph_Graph);BitBlt(hDC,0,0,500,270,helpDC,0,0,SRCCOPY);}EndPaint(hwnd, &ps);break;}case WM_KEYDOWN://Esc to stop read the temperature{switch(wParam){case VK_ESCAPE:{int choice=StopThread();if(choice==1){MessageBox(NULL,"停止读取环境温度~\r\n下面将显示本时间段内的温度走向图","提示",MB_OK|MB_ICONINFORMATION);char date[20];char time[20];char sqlPhrase[100];memset(date,'\0',20);memset(time,'\0',20);memset(sqlPhrase,'\0',100);GetPrivateProfileString("StartPoint","Date",NULL,date,20,".//config.ini");GetPrivateProfileString("StartPoint","Time",NULL,time,20,".//config.ini");WritePrivateProfileString("StartPoint",NULL,NULL,".//config.ini");SYSTEMTIME sysTime;GetLocalTime( &sysTime );sprintf(sqlPhrase,"select * from temperature where time>'%s %s' and time<'%4d-%02d-%02d %02d:%02d:%02d' order by time asc",date,time,sysTime.wYear,sysTime.wMonth,sysTime.wDay,sysTime.wHour,sysTime.wMinute, sysTime.wSecond);DisplayMainWindow(SW_HIDE);DisplayInqueryWindow(SW_HIDE);DisplaySetWindow(SW_HIDE);DisplayMarkWindow(SW_HIDE);DisplayGraphWindow(SW_SHOW);DrawLine(Hwnd_Graph_Graph,sqlPhrase);}if(choice==0)MessageBox(NULL,"线程已经停止运行,无需重复!","提示",MB_OK|MB_ICONINFORMATION);break;}}break;}case WM_DESTROY:PostQuitMessage (0);break;default:return DefWindowProc (hwnd, message, wParam, lParam);}return 0;
}
温度传感器室温监控仪相关推荐
- 实验18:模拟温度传感器实验
OK,复制的自己的文字 --有时间就做做小实验 --实验结果 --刚开始温度传感器室温,A0的值大于430(设定值),灯是灭的 --手捏住传感器温度感应部分,温度上升,因为体温肯定大于室温(我是活体) ...
- 将温度传感器获取室温显示在手机APP上
将温度传感器获取室温显示在手机APP上 首先,该功能是基于手机通过wifi单片机功能上的,我们在原来的android项目中添加数据接收的代码与数据显示的控件,再通过线程不断地读取接收到的数据,已达到环 ...
- 怎样判断电饭锅温度传感器的好坏?_空调温度传感器的作用与检测。
温度传感器是指对温度进行感应,并将感应的温度变化情况转换为电信号的功能部件.我们在练习温度传感器检测代换之前,要先对温度传感器的安装位置.结构特点和工作原理有一定的了解. 1.温度传感器的安装位置及结 ...
- 解读温度传感器应用于物联网+冷链行业
起文从温度传导理论知识解释开始,以全便于大家基础知识一致并在同一语境下理解. 温度(temperature)是表示物体冷热程度的物理量,微观上来讲是物体分子热运动的剧烈程度.在冷链行业主要体现在生鲜食 ...
- 主流温度测量方案对比分析(含国产温度传感器芯片GX18B20)
温度测量方案对比分析 一.概述 温度测量存在于我们生活与工作的方方面面,我们可以测量单点的温度体现整体环境温度,也可以测量多点温度,综合反应环境情况.本文针对单点测量的情况进行分析,如何从一点扩展到多 ...
- 【51单片机】AT24C02存储器(I²C总线)/DS18B20温度传感器(单总线)
目录 一.AT24C02存储器 1.AT24C02存储器介绍 2.存储器简化模型 3.AT24C02存储器原理图 二.I²C总线 1.I²C总线的介绍 2.I²C电路 3.I²C时序图 3.1I²C开 ...
- Arduino Uno 实验6——LM35温度传感器
LM35温度传感器简介 LM35 是由National Semiconductor 所生产的温度传感器,其输出电压为摄氏温标.LM35是一种得到广泛使用的温度传感器. 由于它采用内部补偿,所以 ...
- Arduino温度传感器全系列使用详解
原文地址:https://arduino.nxez.com/2017/03/26/arduino-sensor-series-of-temperature-measurement.html Ardui ...
- Lake Shore低温温度传感器—DT-670 硅二极管
DT-670 系列硅二极管在更宽的温度范围内提供比以前销售的任何硅二极管更好的精度.符合曲线 DT-670 标准电压与温度响应曲线,DT-670 系列中的传感器可互换,并且对于许多应用来说不需要单独校 ...
最新文章
- ASP.NET数据绑定技术
- gis根据范围批量分开图斑_基于BIM-GIS技术的公路预防性养护研究
- 实现输入一个字符串,分别将大写字母、小写字母、数字、其他字符存到列表里面并且输出列表
- Parity Game CodeForces - 298C
- WCF跨域 这可能是由于试图以跨域方式访问服务而又没有正确的跨域策略,或策略不适用于 SOAP...
- synchronized底层是如何实现的?
- php 上传图片 预览 多张,uploadify插件实现多个图片上传并预览
- 数据导出到excel文件给客户端下载的几种方法
- 处理文章附件路径问题
- sublime text 使用小技巧
- H5 video的使用
- 20180810 多益网络模拟笔试
- android浏览器背景音乐,浏览器的背景音乐实现方式总结
- foobar2000 用了那么久 才学会设置 好音质设置
- matlab的otdr仿真,otdr软件下载
- mac菜单栏设置教程
- python下载歌曲教程视频_实现python批量下载网易云音乐的免费音乐
- mingw32-make.exe缺少的方法
- 【每日一读】Sampling Multiple Nodes in Large Networks: Beyond Random Walks
- Geant4学习记录(二)A