在写一个五子棋程序,背景是一张图(非纯色),我想做一个光标,将鼠标所在位置的那个格子高亮出来。
现在遇到的问题是,当鼠标切换格子的时候,我需要将上一个格子的光标清除,同时在现在这个格子上绘制新光标。
我用的方法是:    Graphics g = form_main.pictureBox_Main.CreateGraphics();
    g.DrawImage(form_main.pictureBox_Main.BackgroundImage, 0, 0, 800, 600);
这样能达到我要的效果,但是每次移动一个格子,窗口上所有棋子得重绘一次,这样就有闪烁。
请问有其他办法解决么?

解决方案 »

  1.   

    Graphics默认底图为黑色的。最好是用new Bitmap(Rect .Width , Rect .Height , System.Drawing.Imaging.PixelFormat.Format32bppArgb);
    来创建透明图层  底图层为棋盘, 再上面一次画棋子,  然后拼合起来
    实际Graphics.Clear(Color .FromArgb (0));
    为清除所有像素数据;
    但是默认的为黑色。如果画出全部是黑色就是清除成功了。 
    http://topic.csdn.net/u/20120814/10/CCF59B0E-A2B8-4B0E-A2B5-9EA3A81CF023.html
    有我的发光字画法。或许可以给你一些启发。
      

  2.   

    每个格子,你可以知道它的区域,你需要清除时,用底色重新画一下
    或者调用控件的Invalidate,整个重绘
      

  3.   

    如果底图不是绘上去的可以用 g.Clear();方法去除
    或者用绘制底图覆盖原来的对象打到清除的目的。比如你底图黑色 你选框白色 你再画一个黑色的选框来覆盖。
      

  4.   

    每次重绘都用control.Invalidate(光标的rectangle)来,而不是直接Invalidate()或者Refresh(),只重绘光标所在的那个小矩形,这样效率会极大的提高