温度传感器室温监控仪
来源:互联网 发布:回国人员留学证明 知乎 编辑:程序博客网 时间:2024/04/27 20:09
说明
这是一个课程设计内容,需要配合一个温度传感器进行使用,难点是串口的使用。
在本程序中,还需要懂得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.1DB=sensorUser=rootPass=1324354657[Interval]Time=3000[GraphOnShow]OnShow=false[StartPoint]Date=2013-09-17Time=19:37:46
mark.ini
[2013-09-17-19:12:21]Wrong=37.8Right=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; else ByteString[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; //波特率为9600 dcb.ByteSize = 8; //数据位为8 dcb.StopBits = ONESTOPBIT;//停止位为1 dcb.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下,所以就把它设置为NULL unsigned long client_flag = 0; //这个参数一般为0 mysql_init(&mysql); //连接之前必须使用这个函数来初始化 if ( (sock = mysql_real_connect(&mysql, host, user, passwd, db, port, unix_socket, client_flag) ) == NULL ) //连接MySQL return 0; else return 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);//此函数若成功执行则返回0 char 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); } else LineTo(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 10226HMENU 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 10230HWND 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 10232HWND 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 10234HWND 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;}
0 0
- 温度传感器室温监控仪
- 温度传感器
- uC/OS室温计
- 51单片机测室温
- AB液体室温发泡硅胶(双组份室温发泡硅胶)
- 关于温度传感器
- 温度传感器LM35
- tp2416kit温度传感器
- ds18b20温度传感器
- DS18B20温度传感器
- ds18b20温度传感器
- 温度传感器 DS18B20
- 系统动力学Vensim模拟之室温调节
- NodeMCU上通过DS18b20采集室温
- Lab 5:uC/OS室温计
- 嵌入式LAB 5:uC/OS室温计
- DS1624温度传感器应用
- AD590温度传感器的使用
- OCP 1Z0 051 133
- vs 中大括号之间垂直虚线显示
- Android HttpClient post MultipartEntity upload.
- TCP 的那些事儿(下)
- 就是这么“高大上”!20个最受欢迎的Linux命令
- 温度传感器室温监控仪
- NOJ [1122] Shameimaru's Candid Camera
- Oracle purge 用法介绍
- 《Unix-Linux编程实践教程》读书笔记(八)
- 设计模式学习:设计模式中类的关系(原文转载)
- 设计蜂鸣器电路
- 内存 磁盘
- 自己做的一个动漫风音乐播放器
- JSP连接各数据库实例