| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > .NET для новичков > работа с Bitmap |
| Автор: chudak 24.1.2008, 13:07 |
| Здравствуйте жители Винграда никак немогу найти ответ на вопрос: можно ли вообще отчистить битма? мне нужно к ScrollBar прицепить панель с линейкой!!! public void OnPaint(object sender, PaintEventArgs e) { RulerHeight_V = bmp_VH; RulerHeight_H = bmp_HH; DrawRuler_V(g_V); DrawRuler_H(g_H); } где DrawRuler_V это метод, в котором рисуется линейка, но мне нужно что она при перемещении скроллбара как бы перемещалась, тоесть перерисовывалась с новыми стартовыми и конечными делениями!!! private void vScrollBar1_Scroll(object sender, ScrollEventArgs e) { st_V = vScrollBar1.Value; panel4.Invalidate(); } st_V - это стартовое значение, тоесть с какого деления начинать линейку!!! а получается что линейкане перемещается я закрашивается новыми значениями, при каждом движении скроллбара новый слой линеек!!! помогите с ситуацией!!! |
| Автор: farad 24.1.2008, 13:32 |
| Вызывай Invalidate или рисуй линейку средствами класса ControlPaint - инверсными линиями, тогда можно стереть изображение повторной отисовкой его на старом месте |
| Автор: chudak 24.1.2008, 14:53 | ||
так а толку перерисовавыть если битмап засаряется???? а как вообще правильно это сделать??? ведь должен быть правильный путь??? |
| Автор: chudak 24.1.2008, 15:57 |
| вот весь код который я умудрился состряпать по этой теме!!! посмотрите, может вообще не стоит над ним сидеть и нужно переделать подругому всё!!! public partial class Form1 : Form { Bitmap bmp_V; Graphics g_V; int bmp_VW=50; int bmp_VH=1000; float st_V = 1; int RulerHeight_V; int Calibration=20; public Form1() { InitializeComponent(); bmp_V = new Bitmap(bmp_VW, bmp_VH); g_V = Graphics.FromImage(bmp_V); this.Paint += new System.Windows.Forms.PaintEventHandler(OnPaint); Invalidate(); } public void OnPaint(object sender, PaintEventArgs e) { RulerHeight_V = 100; DrawRuler_V(g_V); this.panel4.BackgroundImage = bmp_V; } private void DrawRuler_V(Graphics g) { g_V.FillRectangle(Brushes.LightGray , ClientRectangle); float PixelsPerInch = (float)Calibration; int count = 1; for (float i = st_V; i < (float)PixelsPerInch * RulerHeight_V; i++) { if ((i % (PixelsPerInch)) == 0) { g_V.DrawLine(Pens.Black, 0, i, 15, i); g_V.DrawString(count.ToString(), new Font("Arial", 12), Brushes.Black, 15, i, new StringFormat());count++; } else if (((i*2) % ((PixelsPerInch))) == 0) { g_V.DrawLine(Pens.Black, 0, i, 10, i); } } } private void vScrollBar1_Scroll(object sender, ScrollEventArgs e) { st_V = vScrollBar1.Value; panel4.Invalidate(); } } |
| Автор: farad 24.1.2008, 16:25 | ||
если ты рисуешь на панели, то логично обрабатывать OnPaint панели, а не формы. Хотя сдается мне сдесь он не нужен. По моему достаточно поместить следующий код в обработчик vScrollBar1_Scroll
|
| Автор: chudak 24.1.2008, 20:44 |
| хм... теперь он пишет "Parameter is not valid" на Application.Run(new Form1()); тоже непойму почему!!! |
| Автор: mr.DUDA 25.1.2008, 11:13 | ||
|
| Автор: chudak 25.1.2008, 16:50 |
| хорошо!!!! а почему всёже такая ошибка??? из за чего возникла??? немогу понять!!! вроде всё правильно!!! |
| Автор: mr.DUDA 25.1.2008, 16:57 |
| Возможно рушится конструктор Form1. |
| Автор: chudak 25.1.2008, 17:03 | ||
но это появилось после того как вставил код foradа
но вроде там всё правильно!!! может я чего невижу, я недавно занимаюсь этим языком!!! |
| Автор: mr.DUDA 25.1.2008, 20:04 |
| На какой строке упало, очень просто можно выяснить если запустить прогу в режиме отладки (F5), дебаггер покажет на чём именно валится. А там уже разбирайтесь, что именно не так. Может у panel4 нулевой BackgroundImage. |
| Автор: chudak 25.1.2008, 20:10 | ||
| программа запускается, но когда шашечку скролла сдвинеш с места и переместиш форму вываливается ошибка выше описанная!!! немогу понять почему, но так получалось из за Dispose(); вот тут:
вродебы и надо, но без него нормально работает!!! спасибо что помоги все ))) |