解决方案 »
- 调试报错,好像是程序错误,求高手帮助
- 放弃了webbrowser开始用
- WinForm窗体问题
- 计算机原理的问题,在线等,谢谢。
- 数据库计数问题!!!!!!!!!!!!!!!!!!!!!!
- 获取Windows XP的屏幕分辨率范围,急!
- TcpListener+TcpClient的传送效率问题
- 在ReportService中,我用subreport做主从结构的报表,现在碰到个分页的问题
- 求一个简单的数组例子
- 我是女孩,我想问哪里有对入门者的C#较好教程,我有一点C/C++基础请发到 [email protected]
- Repeater中ItemTemplate中的CheckBox怎么根据数据库中数据进行默认选中呢!
- 网站上传到服务器后编译错误
试图通过控制层的前后让GroupBox置于其同级父容器(这里是你的窗体)的LineShape之后的方法是徒劳的。所以,你必须选择好所有的LineShape连同Label一起放入GroupBox中。实际上,LineShape显示在界面上的并不是什么控件(窗口),而仅仅是一个绘制在其容器花布上的一个绘图罢了,所以,会出现上面的现象。建议使用GDI+绘图的方式构造你的温度计。
例如,在GroupBox的Paint事件中:
Graphics g = e.Graphics;
g.DrawXXX;
通过代码计算刻度的位置坐标并绘图。更进一步,建议你封装一个控件实现这个温度计。
控件每次需要刷新显示都会调用Paint事件。
你不妨为控件封装 MaxValue、MinValue及Value属性,
在Paint事件的处理过程中,根据这些属性和控件的大小动态绘制刻度和液柱。
你还可以封装一个警告值和报警值属性
用绿色、黄色、红色表达温度的不同状态。
Graphics 封装了丰富的绘图函数,使用画笔描述绘制图形的边框,使用画刷进行填充。
希望你能做出漂亮的温度计。
因此,你只需要处理好Paint过程即可。
感谢你的回复 对我帮助很大 只是我还不是很会自己写空间和GDI之类的~差距有点大
感谢你的回复 对我帮助很大 只是我还不是很会自己写空间和GDI之类的~差距有点大呵呵,几乎所有人都经历过这些阶段.不过还是建议你尝试一下自己构造控件。这其实并不难。项目->添加用户控件,可以得到一个默认的控件UserControl1.cs
添加一些代码构建一个属性,比如:
//存储属性Value的值
private Double m_value = 0;
//属性Value
public Double Value
{
get
{
return m_value;
}
set
{
m_value = value;
this.Refresh();//值改变时,进行重绘。
}
}在用户控件内部的Paint事件里
private void UserControl1_Paint(object sender, PaintEventArgs e)
{
int h =(int )( this.Height*m_value/100);//液柱的高度。假设100是最大值,显然你还要封装个最大值属性代替这个100才好。
Rectangle r = new Rectangle(0, this.Height - h, this.Width-1, h-1);//这里计算你要画的液柱的范围,它与Value属性、最大值最小值以及当前控件的大小有关。
Graphics g = e.Graphics;//获得画布。
Brush b = new SolidBrush(Color.Red);//创建一个单色的画刷。
g.FillRectangle(b,r);//填充一个矩形。
Pen p = new Pen(Color.Green, 1);//创建一个1像素宽的画笔。
g.DrawRectangle(p, r);//绘制一个矩形外框。
}
试着调整它,可以看到液柱随着值的变化而变化。
再试着调整控件的大小,你会看到绘图也会进行响应比例的变化。
然后,你继续完善这个控件就好了。