2011-09-07 4 views
3

Я пытаюсь выполнить черепицу изображения (16x16) над областью прямоугольника с размерами width = 1000, height = 16, используя TextureBrush, чтобы получить такую ​​полосу, как пользовательский интерфейс.Проблема с черепицей Изображение, начинающееся с разной высоты, с помощью TextureBrush в C#

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

При рисовании с x = 0, у = 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 полезным. Это объясняет подробно кисти и преобразования.

+3

+1! большое спасибо! спас мой день –

+0

Удивительно, я боролся с этим всю ночь в пятницу. В понедельник утром я прочитал это, и он решил мою проблему. Благодаря! –

3

Я пробовал это в приложении Windows Forms и работает, как и ожидалось, на чертеже (0, 14), когда y == 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

с помощью TransalteTransform(), чтобы установить начальную точку, если и не делать этого, плиточные бы некоторое смещение, чтобы Corect это, как показано ниже:

brush.TranslateTransform(0,50); 

 Смежные вопросы

  • Нет связанных вопросов^_^