none
C#绘图的问题 RRS feed

  • 问题

  • 是这样的:我在用C#做一个五子棋的程序,在一个窗体上画了一棋盘,在棋盘上点击鼠标画棋子,整个过程都是用GDI+完成,本来功能也都基本实现了,但是在添加了改变窗体背景色的功能之后,只要一点击按钮改变背景色,画好的棋盘还在,而本来已经画好的棋子却随着背景色改变了,请问问题出在哪里呢??

            private void MainFrm_Paint(object sender, PaintEventArgs e)//画棋盘
            {
                DrawTable();
            }

            private void blue_Click(object sender, EventArgs e) //切换背景色(蓝)
            {
                this.BackColor = Color.RoyalBlue;
            }

    2011年4月26日 8:14

答案

  • 如果你采用Paint事件来绘制图形,那么所绘制的图形都是在背景上绘制的,包括棋盘。当改变背景色时会重绘图形,这时棋盘也没了,不过由于你的Paint事件是最后调用的,所以你最后看到的棋盘是在背景色覆盖了旧棋盘后,重新绘制的。

    对于这种游戏界面,最好的方案是,你创建2个新的控件,棋盘和棋子,各override OnPaint方法。然后在Frame上拖放一个棋盘控件,下子时,在你点击的位置创建一个棋子控件实例。这样的设计才是最好最灵活的。

    2011年4月27日 15:59

全部回复

  • 您好

    您使用 this.BackColor = Color.RoyalBlue; 將背景顏色進行變更,可能導致原本棋子的顏色被蓋掉

    請在您變更背景顏色後,重新呼叫繪製棋子的程式碼進行重繪


    歡迎參觀我的Blog.NET菜鳥自救會
    2011年4月26日 8:35
  • 谢谢你,你的建议很好的,只是实现起来有点麻烦啊,呵呵~

    还想请教你,棋盘为什么不会出现这种情况呢?画棋子可不可以也用这种方法?


    To iterate is human, to recurse divine
    2011年4月27日 14:19
  • this.BackColor = Color.RoyalBlue;
    自身窗口的背景色为RoyalBlue。

    窗口其它控件的颜色可能不明朗。


    胡超
    2011年4月27日 15:49
  • 如果你采用Paint事件来绘制图形,那么所绘制的图形都是在背景上绘制的,包括棋盘。当改变背景色时会重绘图形,这时棋盘也没了,不过由于你的Paint事件是最后调用的,所以你最后看到的棋盘是在背景色覆盖了旧棋盘后,重新绘制的。

    对于这种游戏界面,最好的方案是,你创建2个新的控件,棋盘和棋子,各override OnPaint方法。然后在Frame上拖放一个棋盘控件,下子时,在你点击的位置创建一个棋子控件实例。这样的设计才是最好最灵活的。

    2011年4月27日 15:59
  • 又学到不少东西了啊,谢谢~~
    To iterate is human, to recurse divine.
    2011年4月29日 9:59