Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > .NET для новичков > работа с Bitmap


Автор: chudak 24.1.2008, 13:07
Здравствуйте жители Винграда smile

никак немогу найти ответ на вопрос:
можно ли вообще отчистить битма?
мне нужно к 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
Цитата

Вызывай Invalidate 

так а толку перерисовавыть если битмап засаряется????

а как вообще правильно это сделать???
ведь должен быть правильный путь???

Автор: farad 24.1.2008, 15:20
Цитата(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
Код

            if (panel4.BackgroundImage != null)
            {
                panel4.BackgroundImage.Dispose();
            }
            st_V = vScrollBar1.Value;
            panel4.BackgroundImage = new Bitmap(bmp_VW, bmp_VH);
            using (Graphics grf = Graphics.FromImage(panel4.BackgroundImage))
            {
                DrawRuler_V(grf);
            }
            panel4.Invalidate();
при этом bmp_V и g_V можно вообще выкинуть

Автор: chudak 24.1.2008, 20:44
хм...
теперь он пишет "Parameter is not valid" на 
Application.Run(new Form1());

тоже непойму почему!!!

Автор: mr.DUDA 25.1.2008, 11:13

M
mr.DUDA
chudak, используем кнопку "Код" для оформления кода!

Автор: chudak 25.1.2008, 16:50
хорошо!!!!
а почему всёже такая ошибка???
из за чего возникла???
немогу понять!!!
вроде всё правильно!!!

Автор: mr.DUDA 25.1.2008, 16:57
Возможно рушится конструктор Form1.

Автор: chudak 25.1.2008, 17:03
но это появилось после того как вставил код foradа

Код

 if (panel4.BackgroundImage != null)
            {
                panel4.BackgroundImage.Dispose();
            }
            st_V = vScrollBar1.Value;
            panel4.BackgroundImage = new Bitmap(bmp_VW, bmp_VH);
            using (Graphics grf = Graphics.FromImage(panel4.BackgroundImage))
            {
                DrawRuler_V(grf);
            }
            panel4.Invalidate();



но вроде там всё правильно!!!

может я чего невижу, я недавно занимаюсь этим языком!!!

Автор: mr.DUDA 25.1.2008, 20:04
На какой строке упало, очень просто можно выяснить если запустить прогу в режиме отладки (F5), дебаггер покажет на чём именно валится. А там уже разбирайтесь, что именно не так. Может у panel4 нулевой BackgroundImage.

Автор: chudak 25.1.2008, 20:10
программа запускается, но когда шашечку скролла сдвинеш с места и переместиш форму вываливается ошибка выше описанная!!!

немогу понять почему, но так получалось из за Dispose(); вот тут:
Код

            {
                panel4.BackgroundImage.Dispose();
            }
 

вродебы и надо, но без него нормально работает!!!

спасибо что помоги все )))

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)