|
<p >GDI+绘制可滚动窗口,对如此简单的应用做文章是不是小题大做?<p >的确,通常情况下,我们新建Web或Windows项目,在窗体中拖入需要使用的控件。这时,如果文档(应用程序处理的任何数据,本文指需要绘图的数据)太大,屏幕当前工作区不能完全显示,应用程序就会添加滚动块(可能需要明确设置窗体的AutoScroll属性为true)。这种应用下,我们实际上只使用了Windows标准控件,.Net运行环境和基类处理程序就能很好地完成这些操作。<p >为了说明这种情形,我们创建一个c# windows项目TestStandardContorls,在方法InitializeComponent 中添加代码行(直接往窗体中拖入ListBox控件也产生这些代码):<p ><ccid_nobr><table width="550" border="1" cellspacing="0" cellpadding="2" bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"><tr><td bgcolor="e6e6e6" class="code"><pre><ccid_code>private void InitializeComponent(){ …this.listBox1 = new System.Windows.Forms.ListBox();//引入ListBox控件对象。 this.listBox1.Size = new System.Drawing.Size(480, 424);//设置控件的矩形区间 this.ClientSize = new System.Drawing.Size(300, 300);//设置窗体工作区矩形区间…}</ccid_code></pre></td></tr></table></ccid_nobr><p >同时,设置窗体的AutoScroll属性为true:<p ><ccid_nobr><table width="550" border="1" cellspacing="0" cellpadding="2" bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"><tr><td bgcolor="e6e6e6" class="code"><pre><ccid_code>public Form1(){ … InitializeComponent();this.AutoScroll=true;//需要的时候产生滚动条…}</ccid_code></pre></td></tr></table></ccid_nobr><p >代码很简单,调用一个尺寸大于初始窗体的ListBox控件(当然,也可以通过拉伸操作改变窗体大小)。编译并运行应用程序,窗体正确显示ListBox控件并添加滚动条(这是由于ListBox 控件区间大于窗体工作区间),拖动滚动条能正确显示ListBox控件各部分。<p ><center><font color="#000099"><strong>包含GDI+绘图的窗体滚动</strong></font></center><p >上面例子只使用了windows系统标准控件,而下面我们将面对另一种情形。这时,我们要不使用或不仅仅使用windows标准控件(这样做有很多理由,或许因为标准控件并不能获得用户界面需要的灵活性),要在屏幕上自行绘图。很明显,这是使用GDI+绘图的领域(GDI+绘图包括许多相关的知识,这里不展开讲解,你可以参见专门的文章),这一领域下的文档管理与windows对标准控件的管理有很大的不同。<p ><b>1、滚动管理差异</b><p >GDI+下的文档管理与windows对标准控件的管理有很大的不同。尤其地,应用程序不能自行管理窗口的滚动,除非你在代码中进行了相应的编程。也就是说,我们需要帮助窗体Form实例确定何时以及如何滚动。<p >同样地,为了说明这种情形,我们新建C# windows项目TestGDIPlus。为实现定制绘图,我们重载Paint事件如下:<p ><ccid_nobr><table width="550" border="1" cellspacing="0" cellpadding="2" bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"><tr><td bgcolor="e6e6e6" class="code"><pre><ccid_code>protected override void OnPaint(PaintEventArgs e){ Graphics g=e.Graphics; //获取绘图对象 Brush b=new SolidBrush(Color.Green);//初始化画笔 g.FillEllipse(b,0,0,400,350);//绘制填充椭圆}//我们也设定窗体初值为矩形区间300*300:private void InitializeComponent(){… this.Size = new System.Drawing.Size(300,300); …}</ccid_code></pre></td></tr></table></ccid_nobr><p >代码很简单,以屏幕上点(0,0)为左上角起点,以长400、宽350的外接矩形绘制了一个填充椭圆。从代码上分析,当前窗口(300*300)小于文档尺寸(400*350),应用程序初始化时应该产生滚动条,运行后改变窗体尺寸也可能产生滚动条。但编译运行应用程序却发现事实并非如此,这两种情况下滚动条都不会出现。即便我们显式设置窗体AutoScroll属性为true(this.AutoScroll=true),并且无论怎样拉伸以改变窗体尺寸,滚动条也不会出现。 <p align="center"><font color="FF0000" >1</font>2<span class="content01">下一页>></span></p></p> |
|