一,窗体控件闪烁
把窗体DoubleBuffer属性改为 true,绘制在缓冲区中进行,完成后将结果输出到屏幕上。双重缓冲区可防止由控件重绘引起的闪烁。
二,运行时窗体闪烁
在代码中添加
//解决窗体运行时闪烁的问题
protected override CreateParams CreateParams
{
get
{
CreateParams cp = base.CreateParams;
cp.ExStyle |= 0x02000000;
return cp;
}
}
三,图片自适应窗体
把窗体backgroundmagelayout 属性改为Stretch。
四,让控件跟随窗体一起改变
把Anch设置为none;
AutoScaleMode属性设置为Dpi,可以相对于屏幕确定控件或窗体的大小,例如,对于显示图表或其他图形的控件,可能希望使用每英寸点数(DPI)缩放,以便该控件始终占据一-定百分比的屏幕
AutoScaleMode属性设置为Dpi之后,最好还要搭配另外三个属性来控制窗体的大小。如下:
1.Autosize=false,设置窗体不根据内容超出而调整窗体自身大小,以免窗体超出屏幕。
2.AutoScroll=true,设置窗体当内容超出窗体时,自动产生滚动条。这样用户依靠滚动条既可以完全看到超出窗体的内容了。
3.MaximizeBox=true,可设置窗体最大化,当窗体超.出屏幕时,用户可设置窗体最大化来让窗体尺寸贴合用户屏幕。
五,两个控件的值进行比较,控件的值是string型,不能直接进行比较
把值转换成double型来比较
if (checkBox1.Checked)//判断勾选框是否被勾选
{
//把控件的值转换成double型进行比较
if (Convert.ToDouble(label3.Text) >= Convert.ToDouble(textBox2.Text);
{
Openfeng();//调用打开风扇的函数
}
if (Convert.ToDouble(label3.Text) <= Convert.ToDouble(textBox3.Text))
{
Closefeng();//调用关闭风扇的函数
}
}
六,跳转窗体
serialPort1.Close(); //关闭串口默认为COM1
controlpage formAdmin = new controlpage();
formAdmin.Show();
this.Hide();
七,弹出窗口
MessageBox.Show("此刻光照过暗!");
八,延时函数
System.Threading.Thread.Sleep(2000);
九,串口接收数据
1.在窗体中加入serialPort控件,把波特率设为38400,默认com1;
2.在serialPort的DataReceived事件勾选serialPort1_DataReceived;
3.在窗体运行时打开串口
private void controlpage_Load(object sender, EventArgs e)
{
// serialPort1.Open(); //打开串口默认为COM1
}
4.编写串口接收函数
//串口接收数据后处理函数
private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
try
{
//判断数据头是否正确(0xfd开头),正确就进入循环
while (serialPort1.ReadByte() == 0xff && serialPort1.ReadByte() == 0xfd)
{
byte[] A = new byte[1024 * 1024];
int a = serialPort1.ReadByte(); //把第三个数据赋值给a
for (int i = 0; i < 8; i++)
{
A[i] = (byte)serialPort1.ReadByte(); //循环读取数据并存到数组A
}
switch (a)
{
case 0x00://光照
{
double x = Convert.ToDouble((Char)A[1] + "." + (Char)A[2]);// 前两位为电压的ascii码值
double y = x * 1000 / 3.3;
label2.Text = y.ToString("0.00");//label是string型,把double型的转换成string型
if (Convert.ToDouble(label2.Text) >= Convert.ToDouble(sqlStr3))
{
label2.BackColor = Color.FromArgb(255, 0, 0);//当光照大于预定值把控件背景改成红色
CloseLight();//光照过强关闭灯光
}
if (Convert.ToDouble(label2.Text) <= Convert.ToDouble(sqlStr4))
{
label2.BackColor = Color.FromArgb(0, 0, 255);//当光照小于预定值把控件背景改成蓝色
Openlight();//光照过暗打开灯光
}
else
{
label2.BackColor = Color.Transparent;//光照正常时把控件背景恢复透明
}
} break;
case 0x01://温湿度
{
//byte5~ byte6为温度值,byte7~ byte8为湿度度值,byte5、byte7为整数部分,byte6、byte8为小数部分,
label4.Text = A[1] + "." + A[2]; //温度
label12.Text = A[3] + "." + A[4];//湿度
if (Convert.ToDouble(label3.Text) >= Convert.ToDouble(sqlStr1))
{
label4.BackColor = Color.FromArgb(255, 0, 0);//当温度大于预定值把控件背景改成红色
Openfeng(); //打开风扇
}
if (Convert.ToDouble(label3.Text) <= Convert.ToDouble(sqlStr2))
{
label4.BackColor = Color.FromArgb(0, 0, 255);//当温度小于预定值把控件背景改成蓝色
Closefeng();//关闭风扇
}
else
{
label4.BackColor = Color.Transparent;//温度正常时把控件背景恢复透明
}
} break;
case 0x03://火焰
{
double x = Convert.ToDouble((Char)A[1] + "." + (Char)A[2]);// 前两位为电压的ascii码值
double y = x * 1000 / 3.3;
label6.Text = y.ToString("0.00");//label是string型,把double型的转换成string型
if (y >= 1)
{
label6.BackColor = Color.FromArgb(255, 0, 0);//检测到火情的时候把控件变为红色
Openlight();//打开报警灯
}
else
{
label6.BackColor = Color.Transparent;//没有火情的时候控件背景恢复透明
}
} break;
case 0x06://人体
{
if (A[1] == 0)//人体感测器:前一位(byte5)为传感器值,0表示有人,非零表示无人,后三位无效.
{
label8.Text = "有人";
}
else
{
label8.Text = "无人";
label8.BackColor = Color.FromArgb(255, 0, 0);//图书馆无人自动关灯
}
} break;
default:
break;
}
}
}
catch (Exception)
{
;
}
}
十,控制风扇灯亮/关
private void Openlight()//控制灯亮
{
byte[] bts = new byte[] { 0xFA, 0xFB, 0x07, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00 };
serialPort1.Write(bts, 0, bts.Length);
}
private void CloseLight()//控制灯灭
{
byte[] bts = new byte[] { 0xFA, 0xFB, 0x07, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00 };
serialPort1.Write(bts, 0, bts.Length);
}
private void Openfeng()//打开风扇
{
byte[] bts = new byte[] { 0xFA, 0xFB, 0x06, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00 };
serialPort1.Write(bts, 0, bts.Length);
}
private void Closefeng()//关闭风扇
{
byte[] bts = new byte[] { 0xFA, 0xFB, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00 };
serialPort1.Write(bts, 0, bts.Length);
}
十一,往数据库里存东西
private void lianjie()//把数据存到数据库
{
SqlConnection sqlConn = null;
try
{
DateTime time = DateTime.Now;//获取现在的时间
//定义连接字符串
String connStr = "Data Source=.;Initial Catalog=tushuguan;Integrated Security=True";
//定义Connection对象,建立与数据库连接
sqlConn = new SqlConnection(connStr);
//连接数据库
sqlConn.Open();
//定义SQL语句
String sqlStr = "insert into chaxun(sensor,date,data)values('光照',@date,@data)";
//定义comman对象
SqlCommand cmd1 = new SqlCommand(sqlStr, sqlConn);
//将e赋给查询语句中user这个占位符("@date")
cmd1.Parameters.Add(new SqlParameter("@date", time.ToString()));
//将 label3.Text的值赋给查询语句中user这个占位符("@data").
cmd1.Parameters.Add(new SqlParameter("@data", this.label3.Text.Trim()));
int res1 = cmd1.ExecuteNonQuery();
if (res1 != 0)
{ ; }
else
{
MessageBox.Show("错误");
}
Task.Delay(1000);//延时向数据表插入数据
}
catch (Exception ex)
{
MessageBox.Show("访问数据库错误: " + ex.Message);
}
finally
{
if (sqlConn!=null)
{
sqlConn.Close();
}
}
}
十二,从数据库里面查询历史数据
private void chaxun()
{
//获取查询条件
SqlConnection sqlConn = null;
try
{
//运用Connection对象建立与数据库的连接
String connStr = "Data Source=.;Initial Catalog=tushuguan;Integrated Security=True";
//定义Connection对象,建立与数据库连接
sqlConn = new SqlConnection(connStr);
//连接数据库
sqlConn.Open();
//利用Command对象执行sql语句
String sqlStr = @"select serial,sensor,date,data from chaxun where date>=@start and date<=@end and sensor=@sensor";
////定义Command对象
SqlCommand cmd = new SqlCommand(sqlStr, sqlConn);
////建立参数与参数类型
cmd.Parameters.Add(new SqlParameter("@start", this.dateTimePicker1.Value.ToShortDateString()));
cmd.Parameters.Add(new SqlParameter("@end", this.dateTimePicker2.Value.ToShortDateString()));
cmd.Parameters.Add(new SqlParameter("@sensor", this.comboBox1.Text.Trim()));
SqlDataAdapter adp = new SqlDataAdapter();
adp.SelectCommand = cmd;
//将查询结果存入DataSet中
DataSet ds = new DataSet();
adp.Fill(ds, "tushuguan");
this.dataGridView1.DataSource = ds.Tables["tushuguan"];
}
catch (Exception ex)
{
MessageBox.Show("访问数据库错误: " + ex.Message);
}
finally
{
if (sqlConn != null)
{
sqlConn.Close();
}
}
}
十三,窗体之间传值
1.在一个app类中定义一个静态成员value
public class app
{
public static string value;
}
2.在窗体Form1中这样调用
app.value = "f2";//给静态成员赋值
//new Form2 ( ).Show( ); //多打开一个窗口
3.在窗体Form2中
this.Text =app.value; //取回app.value的值
//app.value ="Form2"; //给app.value赋初值,以便其他窗体调用