初学GDI+(盼指导)

        

      想问下各位大牛GDI+重要不????希望指点下!有什么好的方法,不吝赐教饿!前几天在前程无忧狂投简历,有幸收到一份笔试通知,这是我的第一次笔试,心里还蛮激动的。来到公司后负责人给我一份试卷说是1个小时完成。我看了看题前面填空还可以,大题都是改错题,4道66分,我想这要是做好了,就够了!一看四道有三道都有关Graphics 的,心想这下完了,这东西平常压根就没用过啊!有什么错当然找不到啊,只怪自己平常不留心,这东西真的有这么重要吗?还有一道我一看就出来了,考得是结构里面不能显示声明无参的构造函数这个要点。其他的就靠自己“冥思苦想了”。最终硬着头皮做完了。让我回去等通知。我知道是没戏喽,我的第一次啊!哎,回去一定要学习一下GDI+。今天我终于稍微了解了下,感觉还蛮有意思的。

刚开始我建了个Windows程序,程序就在form构造函数中写着。


            Graphics gs 
=   this .CreateGraphics();
            Show();
            Pen blue 
=   new  Pen(Color.Blue, 1 );
            gs.DrawEllipse(blue,
0 , 0 , 50 , 100 );

可是我当我最小化后再打开时窗体上的椭圆竟然消失了,我好生纳闷,查了资料,原来是这样的:如果窗口的一部分被隐藏了,Windows通常就会立即删除与其中相关的所有信息,要不然存储屏幕数据的能存量就是个天文数字。也就是说Windows释放了保存这些数据的能存。应该要使用OnPaint()绘制图形。写了下面的代码:

 

ContractedBlock.gif ExpandedBlockStart.gif Code
 protected override void OnPaint(PaintEventArgs e)
        {
            
base.OnPaint(e);
            Graphics gs 
= e.Graphics;
            Pen blue 
= new Pen(Color.Blue, 1);
            gs.DrawEllipse(blue, 
0050100);

        }

了解了原理才发现这样写也有一定的缺陷。使用Paint事件是通知应用程序完成重新绘制的要求,并且重新绘制了窗口的所有能容,这是很不高效的。只要绘制我们需要的内容就好了,所以我们要控制下

 

ContractedBlock.gif ExpandedBlockStart.gif Code
 protected override void OnPaint(PaintEventArgs e)
        {
            
base.OnPaint(e);
            Graphics gs 
= e.Graphics;
            
if (e.ClipRectangle.Top < 100 && e.ClipRectangle.Left < 50)
            {
                Pen blue 
= new Pen(Color.Blue, 1);
                gs.DrawEllipse(blue, 
0050100);
            }

        }

这样就算差不多了。

 

还有个问题,就是当我做得图形较大是,运行出来显示的结果不全,也就是说窗口小了,要做个滚动条这样就好看些,不过根据以前学习注册表的经历,可以设置当窗口改变下,将其数据保存下,下次再运行时,窗口的大小就是你改变的那个大小,不过这里就不需要了,有更简单的方法!下面是我写得代码:

 

 

ContractedBlock.gif ExpandedBlockStart.gif Code
 private Point p1 = new Point(00);
        
private Size s1 = new Size(200200);
        
private Point p2 = new Point(50200);
        
private Size s2 = new Size(200150);
        
private Pen blue = new Pen(Color.Blue, 2);
        
private Pen red = new Pen(Color.Red, 1);
        
protected override void OnPaint(PaintEventArgs e)
        {
            
base.OnPaint(e);
            Size f 
= new Size(this.AutoScrollPosition);
            
if (e.ClipRectangle.Top + f.Width < 350 || e.ClipRectangle.Left + f.Height < 150)
            {
                Graphics gc 
= this.CreateGraphics();
                Show();
                Rectangle re 
= new Rectangle(p1 + f, s1);
                gc.DrawRectangle(blue, re);
                Rectangle ra 
= new Rectangle(p2 + f, s2);
                gc.DrawEllipse(red, ra);
            }
        }

 

 

在InitializeComponent()中设置:

this.AutoScrollMinSize = new System.Drawing.Size(250, 350);就好了,这样简单的设计就完成了。第一次接触这东西感觉还蛮好玩的!学GDI+的道路漫长啊! 明天继续啊!

 

 

 

转载于:https://www.cnblogs.com/dingguowendgw/archive/2009/11/10/1600589.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值