小弟我新学C#,要在pictureBox里画一个五子棋棋盘和一些棋子.imgBoard = new Bitmap("..\\..\\board.bmp");//盘的位图
imgBlack = new Bitmap("..\\..\\black.bmp");//黑子
imgWhite = new Bitmap("..\\..\\white.bmp");//白子,这些都在资源里img = pictureBox1.CreateGraphics();
img.DrawImage (imgBoard,0,0,imgBoard.Width,imgBoard.Height);

for (int i=0;i<=14;i++)
{
for(int j=0;j<=14;j++)
{
if(game.getChess (i,j)==1)img.DrawImage(imgBlack,i*30+45,j*30+45,imgBlack.Width ,imgBlack.Height);//画黑子
if(game.getChess (i,j)==-1)img.DrawImage(imgWhite,i*30+45,j*30+45,imgWhite.Width ,imgWhite.Height);//画白子
}
}当我把这些代码写在form1_paint()里的时候,图像被遮挡后,就不能还原了.我又在后面加上
this.Invalidate();又发现闪的非常非常厉害.C#里的paint事件,跟C++里OnPaint事件的差别很大么?如何能解决这个问题呢?新手我是,拜谢了m(_ _)m

解决方案 »

  1.   

    re:zr1982930(皮卡丘) 还只是正在写呢,图形界面还没搞定呢...都要哭了...等做好了一起发出来研究吧~
      

  2.   

    参考一下吧
    namespace Leimom.FiveChess
    {
    using System;
    using System.Drawing;
    using System.Collections;
    using System.ComponentModel;
    using System.WinForms;
    using System.Data;
    /// 
    /// Summary description for Form1.
    /// 
    public class FiveForm : System.WinForms.Form
    {
    /// 
    /// Required designer variable.
    /// 
    private System.ComponentModel.Container components;
    private System.WinForms.ImageList imageListbw;
    //define the hot Rectangle
    private Rectangle[] pointSquares;
    //chess information
    private int[] chessTable;
    private int nextTurn;
    private const int bTurn = 1;
    private const int wTurn = 2;
    private Stack chessIndex;
    public FiveForm()
    {
    //
    // Required for Windows Form Designer support
    //
    InitializeComponent();
    // 
    // TODO: Add any constructor code after InitializeComponent call
    //
    chessIndex = new Stack();
    nextTurn = bTurn;
    chessTable = new int[225];
    pointSquares = new Rectangle[225];
    Size size = new Size(18,18);
    int x = 0;
    int y = 0;
    for(int i = 0;i < 225;i++)
    {
    x = i%15;
    y = i/15;
    pointSquares[i].Size = size;
    pointSquares[i].Offset(9+x*20,6+y*20);
    chessTable[i] = 0;
    }
    } protected override void OnPaint(PaintEventArgs e)
    {
    //you may paint
    Graphics g = e.Graphics;
    }
    protected override void OnMouseDown(System.WinForms.MouseEventArgs e) 
    {
    switch( e.Button )
    {
    //take left button down
    case MouseButtons.Left:
    OnLButtonDown(new Point(e.X,e.Y));
    break;
    //take right button down
    case MouseButtons.Right:
    OnRButtonDown(new Point(e.X,e.Y));
    break;
    }
    base.OnMouseDown(e);
    }
    private void OnLButtonDown(Point p)
    {
    int nPos = GetRectID(p);
    //click hot Rectangle witch have no chess
    if(nPos != -1&&chessTable[nPos] == 0)
    {
    Graphics g = this.CreateGraphics();
    if(nextTurn==bTurn)
    {
    //draw white chess
    DrawBlack(g,nPos);
    chessTable[nPos] = bTurn;
    nextTurn = wTurn;
    chessIndex.Push(bTurn);
    chessIndex.Push(nPos);
    }
    else
    {
    //draw Black chess
    DrawWhite(g,nPos);
    chessTable[nPos] = wTurn;
    nextTurn = bTurn;
    chessIndex.Push(wTurn);
    chessIndex.Push(nPos);
    }
    g.Dispose();
    //witch win
    CheckGameResult(nPos,nextTurn);

    }
    private void CheckGameResult(int nPos,int nextTurn)
    {
    //witch win
    Stack isFive = new Stack();
    int thisTurn = (nextTurn == bTurn)?wTurn:bTurn;
    int x = nPos%15;
    int y = nPos/15;
    //scan x have five
    for(int i=0;i<15;i++)
    {
    if(chessTable[y*15+i] == thisTurn)
    {
    isFive.Push(y*15+i);
    if(isFive.Count == 5)
    {
    MessageBox.Show("Game Over","Notes",MessageBox.OK);
    ReSetGame();
    return;
    }
    }
    else
    {
    isFive.Clear();
    }
    }
    isFive.Clear();
    //scan y have five
    for(int i=0;i<15;i++)
    {
    if(chessTable[i*15+x] == thisTurn)
    {
    isFive.Push(i*15+x);
    if(isFive.Count == 5)
    {
    MessageBox.Show("Game Over","Notes",MessageBox.OK);
    ReSetGame();
    return;
    }
    }
    else
    {
    isFive.Clear();
    }
    }
    isFive.Clear();
    //scan x=y have five
    for(int i=-14;i<15;i++)
    {
    if(x+i<0||x+i>14||y-i<0||y-i>14)
    {
    continue;
    }
    else
    {
    if(chessTable[(y-i)*15+x+i] == thisTurn)
    {
    isFive.Push((y-i)*15+x+i);
    if(isFive.Count == 5)
    {
    MessageBox.Show("Game Over","Notes",MessageBox.OK);
    ReSetGame();
    return;
    }
    }
    else
    {
    isFive.Clear();
    }
    }
    }
    isFive.Clear(); 
    //scan x=-y have five
    for(int i=-14;i<15;i++)
    {
    if(x+i<0||x+i>14||y+i<0||y+i>14)
    {
    continue;
    }
    else
    {
    if(chessTable[(y+i)*15+x+i] == thisTurn)
    {
    isFive.Push((y+i)*15+x+i);
    if(isFive.Count == 5)
    {
    MessageBox.Show("Game Over","Notes",MessageBox.OK);
    ReSetGame();
    return;
    }
    }
    else
    {
    isFive.Clear();
    }
    }
    }
    isFive.Clear(); 
    }
    private void ReSetGame()
    {
    //reset game
    nextTurn = bTurn;
    for(int i=0;i<225;i++)
    {
    chessTable[i] = 0;
    }
    this.Invalidate();
    }
    private int GetRectID(Point p)
    {
    //get witch rectangle click
    for(int i = 0;i < 225;i++)
    {
    if(pointSquares[i].Contains( p ))
    {
    return i;
    }
    }
    return -1;
    }
    private void OnRButtonDown(Point p)
    {
    //regret chess
    int nPos,x,y;
    if(chessIndex.Count != 0)
    {
    nPos = (int)chessIndex.Pop();
    x = nPos%15;
    y = nPos/15;
    chessTable[nPos] = 0;
    nextTurn = (int)chessIndex.Pop();
    this.Invalidate(new Rectangle(new Point(8+x*20,5+y*20),new Size(20,20)));
    }
    }
    private void DrawBlack(Graphics g,int nPos)
    {
    //draw Black chess
    int x,y;
    x = nPos%15;
    y = nPos/15;
    imageListbw.DrawImage(g,8+20*x,5+20*y,20,20,0,0);
    }
    private void DrawWhite(Graphics g,int nPos)
    {
    //draw White chess
    int x,y;
    x = nPos%15;
    y = nPos/15;
    imageListbw.DrawImage(g,8+20*x,5+20*y,20,20,0,1);
    }
    /// 
    /// Clean up any resources being used.
    /// 
    public override void Dispose()
    {
    base.Dispose();
    components.Dispose();
    }
    /// 
    /// Required method for Designer support - do not modify
    /// the contents of this method with the code editor.
    /// 
    private void InitializeComponent()
    {
    System.Resources.ResourceManager resources = new System.Resources.ResourceManager (typeof(FiveForm));
    this.components = new System.ComponentModel.Container ();
    this.imageListbw = new System.WinForms.ImageList ();
    //@this.TrayHeight = 90;
    //@this.TrayLargeIcon = false;
    //@this.TrayAutoArrange = true;
    //@imageListbw.SetLocation (new System.Drawing.Point (7, 7));
    imageListbw.ImageSize = new System.Drawing.Size (20, 20);
    imageListbw.ImageStream = (System.WinForms.ImageListStreamer) resources.GetObject ("imageListbw.ImageStream");
    imageListbw.ColorDepth = System.WinForms.ColorDepth.Depth8Bit;
    imageListbw.TransparentColor = System.Drawing.Color.Yellow;
    this.Text = "FiveForm";
    this.MaximizeBox = false;
    this.AutoScaleBaseSize = new System.Drawing.Size (6, 14);
    this.BorderStyle = System.WinForms.FormBorderStyle.FixedSingle;
    this.BackgroundImage = (System.Drawing.Image) resources.GetObject ("$this.BackgroundImage");
    this.TransparencyKey = System.Drawing.Color.White;
    this.ClientSize = new System.Drawing.Size (314, 311);
    }/// 
    /// The main entry point for the application.
    /// 
    public static int Main(string[] args) 
    {
    Application.Run(new FiveForm());
    return 0;
    }
    }

      

  3.   

    这个代码是在网上看了很多遍的,因为实在没明白,还是请大虾给指导一下吧...关键的在什么地方啊?
    关于DGI+的部分,再谢....