日期:2014-05-17  浏览次数:21070 次

关于在panel上的picturebox绘图的问题,刷新严重,请教办法,附代码
bmap = new Bitmap(panelMain.Width, panelMain.Height);
foreach(...)
{
//内存中绘制图片
Graphics temp = Graphics.FromImage(bmap);
ImageAttributes ImgAtt = new ImageAttributes(); ;
ImgAtt.SetWrapMode(WrapMode.TileFlipXY);
Rectangle rec = new Rectangle(left, top, width, height);
temp.DrawImage(map, rec, 0, 0, width, height, GraphicsUnit.Pixel, ImgAtt);

//设置picturebox的大小
 if (picleft+picwidth <=left+width)
 {
  picwidth= left + width-picleft;
 }

 if (picheight+pictop <=top+height)
 {
  picheight= height+top-pictop;
 }
 if (pictop > top)
 {
  pictop = top;
 }
 if (picleft > left)
 {
 picleft = left;
 }
}
//设置pictureBox大小
pictureBoxDraw.Width = picwidth;
pictureBoxDraw.Height = picheight;
pictureBoxDraw.Top = pictop;
pictureBoxDraw.Left = picleft;

//在控件上绘图
Graphics g = pictureBoxDraw.CreateGraphics();
g.DrawImage(bmap, 0, 0);

定义pictureBox的onpaint事件
 private void pictureBoxDraw_Paint(object sender, PaintEventArgs e)
 {
    if (beOpen)//判断是否已经绘制过图片
    {
      Graphics g = pictureBoxDraw.CreateGraphics();
      g.DrawImage(bmap, 0, 0);
    }           
 }

以上代码实现了我的绘图,主要是从资源文件中读取bitmap信息,并且绘制到picture中
目前的问题主要有:
1、绘制的图片,如何判断是哪副图片,是否可以定义一个鼠标提示信息,并且我在其他picturebox的单击事件中,如何判断该图片的编号
2、picturebox的重绘问题,运行起来后,第一次加载图片,刚显示完毕,马上刷没了,然后我动一下滚动条才能刷新出来,能否不让图片消失?我也做了onpint事件了,是什么原因呢?
3、picturebox的大小设置也有问题,我是将当前的picturebox的大小与要绘制的图片的大小做比较,如果比要绘制的图片小,就刷新picturebox的大小。我以上的算法是否有问题呢?我这个代码picturebox的宽度总小那么一点,有些部分刷新不全。

目前就上面3个问题了,请大家帮忙想想办法,新手求教各种方法及思路,有代码最好,谢谢

------解决方案--------------------
前面的代码不知道在哪调用的,后面OnPaint中,要用参数e中的Graphics!
------解决方案--------------------
引用:
引用:你不是不用PictureBox,直接绘制图片了吗?那就对了,判断方法在另一个帖子说了吧,剩下就是你先写代码,有问题再来交流。
我绘制图片的代码已经写完了
您的意思是说,我把图片的编号和坐标存在一个LIST中?然后通过鼠标移动时候的坐标,判断是哪一个图片么?
判断出来以后,怎么添加鼠标提示呢?tooltip类,只能给控件添加提示信息呀……


你的图片是显示在那个控件的,就在那个控件关联Tooltip类,如果你是显示在picturebox控件!就用PictuBox控件去显示,如果你是画在窗体的,就关联窗体本身(this)

建议你自定义一个控件,这样就很好处理,很清晰了!
------解决方案--------------------
引用:
Quote: 引用:

你不是不用PictureBox,直接绘制图片了吗?那就对了,判断方法在另一个帖子说了吧,剩下就是你先写代码,有问题再来交流。

我绘制图片的代码已经写完了
您的意思是说,我把图片的编号和坐标存在一个LIST中?然后通过鼠标移动时候的坐标,判断是哪一个图片么?
判断出来以后,怎么添加鼠标提示呢?tooltip类,只能给控件添加提示信息呀?bitmap怎么添加呢?
还有就是我要对bitmap进行操作,怎么添加事件呢?我试了,bitmap没有click、mousedown等事件呀?
因为你不用控件了,就不要再去想位图怎么怎么,在绘图的窗口上处理鼠标消息,所有位图及相关信息(包括位置)都存在一个列表中,绘制的时候根据这个列表及位图信息绘制,窗口鼠标消息中根据鼠标坐标及各位图的坐标判断在哪个位图上再进行相应处理。