Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > TrackBar


Автор: bncom 17.3.2007, 13:07
Подскажите как пользоваться TrackBar в Builder C++ ?
Я уже 4 книги прочитал по нему, но так и не нашел нормального описания как работать с ТрэкБаром (т.е. с ползунком).

Мне нужно с помощью него изменить значение 3 переменных.

Автор: desivers 17.3.2007, 14:10
Цитата

Мне нужно с помощью него изменить значение 3 переменных.


это как, чет не понимаю.

Основное свойство Position.
Также Min и Max так вот Position изменяется в этих двух пределах все они целые числа

и все остальные для визуального оформления

Автор: bncom 17.3.2007, 14:33
Ну а можно пример привести использования TrackBar ?  smile 

Ну вот для изменения пускай, одной переменной. 

Автор: desivers 17.3.2007, 14:59
void __fastcall TForm1::TrackBar1Change(TObject *Sender)
{
Label1->Caption = TrackBar1->Min;
Label3->Caption = TrackBar1->Max;
Label2->Caption = TrackBar1->Position;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
TrackBar1->Position = Random(100);
}
//---------------------------------------------------------------------------

также можно динамически задавать и Min Max

Автор: bncom 18.3.2007, 12:19
Извените за тупизну, но все равно я не понимаю...

Причем тут у вас Button вообще?

давайте я свой пример покажу, а вы покажите как менять с помощию ТрэкБара свойства переменных:

Код

void __fastcall TForm1::ProcessingClick(TObject *Sender)
{
        int J=0,JH=0,I=0,IH=0,mr=0,mg=0,mb=0; 
        int x_mr=0, x_mg=0, x_mb=0; 
        try
        {
                x_mr=StrToInt(Edit1->Text);
                x_mg=StrToInt(Edit2->Text);
                x_mb=StrToInt(Edit3->Text);
        }
        catch (EConvertError &e)
        {
                ShowMessage("Внимание! Обнаружена ошибка!\n\nCкорее всего причиной ошибки является:\n- не выбрано изображение\n- введены отрицательные числа\n- дробные числа введены через точку");
                return;
        }

        IH=Image1->Picture->Bitmap->Height; 
        JH=Image1->Picture->Bitmap->Width;  
        Image2->Picture->Bitmap->Height=IH;   
        Image2->Picture->Bitmap->Width=JH;    
        for(I = 0; I < IH; I++)
        for(J = 0; J < JH; J++)
        {
                mr=GetRValue(Image1->Canvas->Pixels[J][I]);  
                mg=GetGValue(Image1->Canvas->Pixels[J][I]); 
                mb=GetBValue(Image1->Canvas->Pixels[J][I]);

                mr=x_mr;    mg=x_mg;  mb=x_mb; // ВОТ ЭТИ ПЕРЕМЕННЫЕ НЕОБХОДИМО ИЗМЕНИТЬ С ПОМОЩЬЮ TRACKBAR

                if (mr>255) mr=255;  else mr=mr;
                if (mr<0)   mr=0;    else mr=mr;
                if (mg>255) mg=255;  else mg=mg;
                if (mg<0)   mg=0;    else mg=mg;
                if (mb>255) mb=255;  else mb=mb;
                if (mb<0)   mb=0;    else mb=mb;

                Image2->Picture->Bitmap->Canvas->Pixels[J][I] = RGB(mr, mg, mb);
                ProgressBar->Position = I*100/IH;
        }
}


Автор: desivers 18.3.2007, 13:43
тогда нужно поставить 3 трек бара и вовремя выполнения кода считать их Position а в Min поставить 0 и в Max 255

mr = TRACKBAR1->Position;
mg = TRACKBAR2->Position;
mb = TRACKBAR3->Position;

что хоть код делает

Автор: bncom 18.3.2007, 16:06
Код контрастность bmp-изображения увеличивает.

Автор: bncom 18.3.2007, 17:54
Не, ты видимо опять меня не понял.

Мне значения mr, mg, mb надо изменять от нуля до 4. 
Я уже в инспекторе объекта задал MIN = 0, MAX = 4.

Теперь мне нужно чтоб ОДИН ползунок изменял значения этих переменных  mr, mg, mb.

Такое вот не помогло:

Код

mr = TrackBar1->Position;
mg = TrackBar1->Position;
mb = TrackBar1->Position;

Автор: desivers 19.3.2007, 00:33
вобщем незнаю как он работает но у меня он делат картинку то белой до черной вот код попробуй загрузить картинки 500х500 и во время выполнения подергать ползунок

Код

void __fastcall TForm1::Button1Click(TObject *Sender)
{
        int J=0,JH=0,I=0,IH=0,mr=0,mg=0,mb=0; 

        IH=Image1->Picture->Bitmap->Height; 
        JH=Image1->Picture->Bitmap->Width;  
        Image2->Picture->Bitmap->Height=IH;   
        Image2->Picture->Bitmap->Width=JH;    
        for(I = 0; I < IH; I++)
        for(J = 0; J < JH; J++)
        {
                mr=GetRValue(Image1->Canvas->Pixels[J][I]);  
                mg=GetGValue(Image1->Canvas->Pixels[J][I]); 
                mb=GetBValue(Image1->Canvas->Pixels[J][I]);

    [color=blue]mr = mg = mb = TrackBar1->Position;[/color]

                if (mr>255) mr=255;  else mr=mr;
                if (mr<0)   mr=0;    else mr=mr;
                if (mg>255) mg=255;  else mg=mg;
                if (mg<0)   mg=0;    else mg=mg;
                if (mb>255) mb=255;  else mb=mb;
                if (mb<0)   mb=0;    else mb=mb;

                Image2->Picture->Bitmap->Canvas->Pixels[J][I] = RGB(mr, mg, mb);
                ProgressBar1->Position = I*100/IH;
              [color=blue]Application->ProcessMessages();[/color]
        }
}

Автор: RatHat 19.3.2007, 14:19
Код
TrackBar1->Min = 0; 
TrackBar1->Max = 4; 
TrackBar1->Frequency = 1;
mr=mg=mb=TrackBar1->Position;

Автор: bncom 19.3.2007, 17:25
Сделал как вы подсказали - черная картинка получается.

Цитата
вобщем незнаю как он работает но у меня он делат картинку то белой то черной
Это потому что я кое-что забыл дописать. Исправляю свою оплошность. 
Привожу код работоспособный:

Код

void __fastcall TForm1::ProcessingClick(TObject *Sender)
{
        int J,JH,I,IH,mr,mg,mb; 

        IH=Image1->Picture->Bitmap->Height;
        JH=Image1->Picture->Bitmap->Width;
        Image2->Picture->Bitmap->Height=IH;
        Image2->Picture->Bitmap->Width=JH; 

        for(I = 0; I <IH; I++)
        for(J = 0; J < JH; J++)
        {
                mr=GetRValue(Image1->Canvas->Pixels[J][I]);
                mg=GetGValue(Image1->Canvas->Pixels[J][I]);
                mb=GetBValue(Image1->Canvas->Pixels[J][I]);

                //TrackBar1->Min = 0;
                //TrackBar1->Max = 4;
                //TrackBar1->Frequency = 0;
                //mr=mg=mb=TrackBar1->Position*1.5;

                mr=1.5*mr-50;    mg=1.5*mg-50;  mb=1.5*mb-50;

                if (mr>255) mr=255;  else mr=mr;
                if (mr<0)   mr=0;    else mr=mr;
                if (mg>255) mg=255;  else mg=mg;
                if (mg<0)   mg=0;    else mg=mg;
                if (mb>255) mb=255;  else mb=mb;
                if (mb<0)   mb=0;    else mb=mb;

                Image2->Picture->Bitmap->Canvas->Pixels[J][I] = RGB(mr, mg, mb);
                ProgressBar->Position = I*100/IH;
        }
}

Если убрать // в комментариях, а закоментировать mr=1.5*mr-50;    mg=1.5*mg-50;  mb=1.5*mb-50; то ползунок работать не будет, выдает черное изображение.

В чем может быть ошибка?

Автор: RatHat 19.3.2007, 17:53
Да, забыл сказать, что я этот код вешал на событие OnChange TrackBar'а.

Автор: bncom 20.3.2007, 10:52
Хорошо, вставил я свой код в событие OnChange, теперь при перемещении ползунка происходит действие, но оно какое-то странное:

1) ничего не делается
2) циклически повторяется

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