DailyReportAssistant

早就有想法要写一个日报助手的程序,为了减轻我对每项工作的估计时间,减少日报中的错误数据,减少我对日报的厌恶。
周四的时候终于把1.0版给写出来了,功能是有了,画面巨简单,实现也就100来行代码,周五用了用,感觉不错,至少写日报的时间没有那么久了。
今天又花了些时间,把程序完善了一下,我想要的功能至少都有了,写的过程中,有下面几个以前没碰到的问题,比较弱,让我不禁感叹,自己原来还是一个菜鸟
一.最小化到托盘
1.拖一个NotifyIcon控件到Form上,将NotifyIcon的Visible设为false,Form的KeyPreview属性设为true
2.在Form的SizeChange事件中判断是否是最小化操作,将NotifyIcon的Visible属性设为true,任务栏显示的属性设为False
  1.             if (WindowState == FormWindowState.Minimized)  //判断是否最小化
  2.             {
  3.                 ShowInTaskbar = false;  //不显示在系统任务栏
  4.                 notifyIcon1.Visible = true;  //托盘图标可见
  5.             }
3.在NotifyIcon的MouseClick事件中,将任务栏显示的属性设为True,NotifyIcon的Visible设为False,同时将画面恢复
  1.             if (WindowState == FormWindowState.Minimized)
  2.             {
  3.                 ShowInTaskbar = true;  //显示在系统任务栏
  4.                 WindowState = FormWindowState.Normal;  //还原窗体
  5.                 notifyIcon1.Visible = false;  //托盘图标隐藏
  6.             }
二.ListBox每行的背景色设置
这个本身ListBox没有提供属性直接修改每一行的背景色,所以,需要把ListBox重新绘制一遍
1.要让ListBox响应重绘,需要把ListBox.DrawMode设为非Normal,防止绘制到ListBox之外,把ScrollAlwaysVisible设为true
2.在ListBox的DrawItem事件中绘制所有行,我是判断了一下奇偶行,分别设不同的颜色,用到了Brush(刷子)
  1.             if (lbTasks.Items.Count == 0)
  2.             {
  3.                 return;
  4.             }
  5.             if (e.Index != nRunTaskNo)
  6.             {
  7.                 int r;
  8.                 Math.DivRem(e.Index, 2, out r);
  9.                 Console.WriteLine(e.Index);
  10.                 Brush br = r == 0 ? Brushes.Gainsboro : Brushes.GhostWhite; 
  11.                 Brush b = Brushes.Black;
  12.                 e.Graphics.FillRectangle(br, e.Bounds);
  13.                 if ((e.State & DrawItemState.Selected) == DrawItemState.Selected)
  14.                 {
  15.                     e.Graphics.FillRectangle(Brushes.LightSkyBlue, e.Bounds);
  16.                 }
  17.                 e.Graphics.DrawString(lbTasks.Items[e.Index].ToString(), lbTasks.Font, b, e.Bounds);
  18.             }
  19.             else
  20.             {
  21.                 e.Graphics.FillRectangle(Brushes.MediumSpringGreen, e.Bounds);
  22.                 e.Graphics.DrawString(lbTasks.Items[e.Index].ToString(), lbTasks.Font, Brushes.Black, e.Bounds);
  23.             }
这里主要用到了FillRectangle和DrawString,前者是绘制背景色,后者是把被覆盖的内容画上去,而如果是焦点行的话,应该单独判断。如果是Task运行,用其他颜色一直显示。这个方法会在刷新画面时激发,每一行都会调用。
2.在需要刷新画面的地方,添加ListBox.Refresh();

三.判断Ctrl组合键的按下
这个很久之前还写过,今天不知道为什么就是没想出来,还是网上搜了一下才明白。
1.在KeyDown事件中判断,判断的要点在于e.Control,e.Modifiers,e.KeyCode,如果是在KeyUp事件中,KeyCode不知为何就是数字,不是Key.S之类的。所以还是要写到KeyDown里。
  1.             if (e.Control && e.KeyCode == Keys.S)
  2.             {
  3.                 Start();
  4.             }
  5.             else if (e.Modifiers == Keys.Control && e.KeyCode == Keys.Q)
  6.             {
  7.                 Pause();
  8.             }
付个链接,这就是成果:http://www.91files.com/?DY1AYHZHXDWTSRZDNWA9

你可能感兴趣的:(DailyReportAssistant)