2011-10-26 30 views
1

我試圖編寫一個程序,創建20px x 20px框的30x30網格。當您單擊網格中的一個框時,它會更改框的顏色並存儲它的RGB值和x,y座標(隱藏在框中)。所以基本上我正在製作一個簡單的繪畫程序。其目的是幫助我爲30x30像素網格編程LED RGB動畫。所以一旦我畫出一些東西,我就會輸出圖像中每個像素的X,Y,R,G,B。更容易的方法來創建網格比創建900控件c#.net

所以我的問題是,有沒有一種簡單的方法來做到這一點。無需創建900個按鈕並將它們放在一起?我有一些sorta工作:

Panel BU = new Panel(); 

BU.AutoSize = false; 
BU.Location = new System.Drawing.Point(xpos, ypos); 
BU.BackColor = System.Drawing.Color.Transparent; 
BU.Font = new System.Drawing.Font("Microsoft Sans Serif", 5, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); 
BU.Name = row_num + " x " + col_num; 
BU.Size = new System.Drawing.Size(20, 20); 
BU.MouseDown +=new MouseEventHandler(BU_MouseDown); 
BU.MouseEnter +=new EventHandler(BU_MouseEnter); 

this.Controls.Add(BU); 

xpos = xpos + 20; 

px_num++; 
col_num++; 

if (col_num == 30) 
{ 
    col_num = 0; 
    ypos = ypos + 20; 
    row_num++; 
    xpos = 0; 
}; 

但它需要WAAAAAY來加載。

+0

你在用什麼GUI?的WinForms? WPF? –

回答

4

是的。

創建一個面板,並處理其中的網格繪畫和鼠標事件。

超級簡單的例子,白白和閃爍幸福的優化:

private Color[,] _Colors = new Color[30, 30]; 

private void panel1_Paint(object sender, PaintEventArgs e) { 
    int left = 0; 
    int top = 0; 

    for (int y = 0; y < 30; y++) { 
    left = 0; 
    for (int x = 0; x < 30; x++) { 
     Rectangle r = new Rectangle(left, top, 20, 20); 

     using (SolidBrush sb = new SolidBrush(_Colors[x, y])) 
     e.Graphics.FillRectangle(sb, r); 
     ControlPaint.DrawBorder3D(e.Graphics, r, Border3DStyle.Raised, Border3DSide.Left | Border3DSide.Top | Border3DSide.Right | Border3DSide.Bottom); 

     left += 20; 
    } 
    top += 20; 
    } 
} 

private void panel1_MouseDown(object sender, MouseEventArgs e) { 
    if (e.Button == MouseButtons.Left) { 
    int left = 0; 
    int top = 0; 

    for (int y = 0; y < 30; y++) { 
     left = 0; 
     for (int x = 0; x < 30; x++) { 
     Rectangle r = new Rectangle(left, top, 20, 20); 

     if (r.Contains(e.Location)) { 
      _Colors[x, y] = Color.Red; 
      panel1.Invalidate(); 
     } 
     left += 20; 
     } 
     top += 20; 
    } 
    } 
} 
+0

感謝這似乎是一個好主意,但我怎麼會導出圖像數據逐像素(每個像素是20x20),因爲在不同的RGB值255,255,255導出到「X,Y,R,G,B \ n「 – craigbett

+0

@craigbett我猜你的圖像是30x30,這意味着我的_Color數組變量有你的顏色:x,y,_Color [x,y] .R,_Color [x,y] .G,_Color [x, y] .B – LarsTech

+1

非常感謝您的幫助,我可以再次使用您的代碼片斷製作踢屁股課程:)再次感謝您! – craigbett

1

我通常使用位圖對象,這和使用圖形覆蓋的一個.DrawImage將其放大。然後在縮放的圖像頂部繪製網格線。

我正在爲你挖掘一些源代碼。

編輯 對不起,目前沒有源代碼方便。但基本上你想要做的是創建一個30x30像素的新system.drawing.bitmap。在你想要繪製的繪圖控件中,使用傳入的圖形對象(通常爲e.graphics)並調用.DrawImage。使用其中一種重載方式,可以指定輸出尺寸,以便您可以按照所需的任何縮放比例進行縮放。您還需要將圖形對象上的.PixelOffsetMode設置爲.none,否則事物將以1/2縮放比例偏移。將.InterpolationMode設置爲.NearestNeighbor,以便輸出不模糊。這應該會給你一個完美對齊的「像素化」縮放圖像。然後循環並繪製水平和垂直網格線。

要處理鼠標點擊,只需在控件的鼠標按下事件中添加一個處理程序,然後將縮放因子除以輸入位置即可得到真正的x和y座標。然後更新源圖像的像素並在您要繪製的控件上調用.invalidate。這將導致它重新繪製更新的圖像。

1

好吧,而不是創建900個控件,如果它是在WindowsForms或帶有HD加速的WPF中產生,那麼它將會很慢。 怎麼辦,如果你真的需要所有的控件都需要在屏幕上可見,那麼在某些點上可能有900個當代的,只是繪製矩形。你可以做一個 仿真的按鈕。

繪製矩形,其中LeftTop較暗然後底部,會給3D填充到用戶,使線的它逆顏色,並且它將給用戶的填充按下按鈕。可以肯定,你需要處理所有鼠標交互,如MouseMoveMouseDownMouseUp面板上(導致面板將是唯一控制目前在這一點),並找出什麼矩形事件發生,並繪製矩形因此。