2011-09-07 13 views
3

我想通過使用TextureBrush來獲得一個像UI一樣的條帶,在尺寸爲width = 1000,height = 16的Rectangle區域上平鋪圖像(16x16)。在C中使用TextureBrush在不同高度開始平鋪圖像的問題#

Rectangle myIconDrawingRectangle = new Rectangle(x, y, 1000, 16); 
using (TextureBrush brush = new TextureBrush(myIcon, WrapMode.Tile)) 
{ 
    e.Graphics.FillRectangle(brush, myIconDrawingRectangle); 
} 

當我與x = 0的繪製,Y = 0拼接發生如預期從(0,0)開始。

當我繪製x = 0時,y = 50平鋪從(0,50)開始,但繪畫矩形不是從圖像的開始處開始。它從圖像的裁剪部分開始,然後重複。

如何解決這個問題?

P.S:我不想通過DrawImage重複手動循環。

回答

9

爲了確保矩形的那開始與圖像的起點開始,我們必須使用轉換如下面的代碼所示。

Rectangle myIconDrawingRectangle = new Rectangle(x, y, 1000, 16); 
using (TextureBrush brush = new TextureBrush(myIcon, WrapMode.Tile)) 
{ 
    brush.TranslateTransform(x,y); 
    e.Graphics.FillRectangle(brush, myIconDrawingRectangle); 
} 

我覺得這個link有幫助。這解釋了有關畫筆和變換的細節。使用TransalteTransform()來設置起點,如果你不這樣做

+3

+1!非常感謝!拯救了我的一天 –

+0

令人驚歎的是,我在整個週五晚上都在努力奮鬥。星期一早上我讀了這個,它解決了我的問題。謝謝! –

3

我在Windows窗體應用程序中試過這個,它按預期工作,當y == 14時在(0,14)處繪製。是否有可能y被設置爲16,32等等分配它和矩形創建的時間?

這裏是我用來測試的代碼:

protected override void OnPaint(PaintEventArgs e) 
{ 
    base.OnPaint(e); 

    Image myIcon = Image.FromFile(@"C:\Users\me\Pictures\test.jpg"); 

    int x = 0; 
    int y = 14; 

    Rectangle myIconDrawingRectangle = new Rectangle(x, y, 1000, 16); 
    using (TextureBrush brush = new TextureBrush(myIcon, WrapMode.Tile)) 
    { 
     e.Graphics.FillRectangle(brush, myIconDrawingRectangle); 
    } 

    e.Graphics.DrawLine(Pens.Black, 0, 16, 1000, 16); 
} 

和結果:

enter image description here

+0

首先,感謝您的回覆。我現在需要修改這個問題,因爲它是錯誤的。我現在發現了。看起來很奇怪,因爲那個時候看起來似乎是正確的。我現在已經找到了實際問題,也是解決方案。我會在下一個評論中解釋。 –

+0

事情是我使用的圖像像素模式是頂部黑暗,底部逐漸變暗,底部顏色類似於窗體背景。真正的問題是,在高度上繪製時,不能保證繪製的矩形區域將從圖像的開始處開始。因此,由於我的形象的性質,它給人一種錯覺,即它正在不同的高度上畫畫。但實際上它正在以正確的高度繪製,只是矩形的開始並未從圖像的開始處開始。這是要解決的問題。我會相應地更新問題。 –

+0

爲驗證和確認正確的行爲而進行投票。這使我從另一個角度來看問題。 –

1

,瓦片會有些偏差,以corect這個,象下面這樣:

所有的
brush.TranslateTransform(0,50);