Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Использование PaintBox / 16 сообщений из 16, страница 1 из 1
04.12.2005, 18:18
    #33415967
Shtob bilo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование PaintBox
Привет всем
Срочно нужен ответ на вопрос по C++ Builder 6.
Разбипаться нет времени так как сроки сдачи дип. поджимают

У меня есть форма.
В нее записнул PaintBox

Рисую в него из другого класс
через Form1->PaintBox1->Canvas

1)Как мне сделать так чтобы картинка PaintBox сохранялась и перерисовывалась при высове метода Paint из класса формы

2) как сделать так чтобы размеры картинки в PaintBox можно было менять,
то есть мне нужно запихнуть туда Canvas большего размера без маштабирования и иметь возможность просмотреть его при помощи ScrollBar

ЗАРАНЕЕ СПАСИБО ЗА ПОМОЩЬ
...
Рейтинг: 0 / 0
04.12.2005, 18:46
    #33415983
spectre
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование PaintBox
Ответ на 1й вопрос в виде примера
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#include <Clipbrd.hpp>
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
Graphics::TBitmap *Bitmap;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
Bitmap = new  Graphics::TBitmap;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  TClipboard *pCB = Clipboard();
  if (pCB->HasFormat(CF_BITMAP))
  {
    try
    {
      Bitmap->LoadFromClipboardFormat(CF_BITMAP, pCB->GetAsHandle(CF_BITMAP),  0 );
      Canvas->Draw( 5 , 5 ,Bitmap);
    }
    catch (...)
    {
      MessageBeep( 0 );
    }
  }
  else
    MessageBeep( 0 );
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormPaint(TObject *Sender)
{
if(Bitmap!=NULL) Canvas->Draw( 5 , 5 ,Bitmap);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
Bitmap->Free();
}
//---------------------------------------------------------------------------
...
Рейтинг: 0 / 0
04.12.2005, 18:54
    #33415988
spectre
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование PaintBox
Пример простой - загружаем с клипборда изображение в битмап. В событии формы OnPaint необходимо заняться перерисовкой. К стати в этом случае PaintBox вообще не обязательно использовать. Если такая необходимость все же возникает (что предположим понятно) то вместо
Код: plaintext
Canvas->Draw( 5 , 5 ,Bitmap);
используй в обоих случаях
Код: plaintext
PaintBox1->Canvas->Draw( 5 , 5 ,Bitmap);
...
Рейтинг: 0 / 0
05.12.2005, 00:35
    #33416144
Shtob bilo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование PaintBox
Спасибо за ответ, но остался вопрос...

Так как я рисую из другого класса, т.е. есть некий метод
Из которого, я предположим рисую линии

void Project::Draw(){
Form1-> PaintBox -> Canvas -> LineTo();
}

мне необходимо сохранить эту нарисованную картинку и перерисовывать ее из
метода Paint формы

Не пойму как эту картинку в Clipboard запихнуть, а потом вытащить

Буду рад если поможете
...
Рейтинг: 0 / 0
05.12.2005, 01:02
    #33416153
spectre
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование PaintBox
Клипборд - это был только пример.
Можно вызывать из OnPaint эту функцию (Progect::Draw) напрямую. Нужно только предусмотреть два момента:
1) OnPaint работает и в момент инициализации формы, т.е. нужно по всей видимости это обработать дополнительно
2) Перерисовывать изображение нужно целиком
К стати, почему PaintBox, а не Image?
...
Рейтинг: 0 / 0
05.12.2005, 01:09
    #33416155
Shtob bilo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование PaintBox
потому что я рисую свою графику...

Если TImage можно для этого использовать, то подскажи плиз как?
...
Рейтинг: 0 / 0
05.12.2005, 01:54
    #33416169
spectre
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование PaintBox
В смысле? Да точно так же... Form1->Image1->Canvas->LineTo и поехали... =)
...
Рейтинг: 0 / 0
05.12.2005, 05:07
    #33416182
Shtob bilo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование PaintBox
А в чем тогда прикол? Чем TImage по твоему лучше?

У него методов больше или что?
...
Рейтинг: 0 / 0
05.12.2005, 07:04
    #33416205
Карабас Барабас
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование PaintBox
Не надо TImage (ИМХО), достаточно TBitmap + TPaintBox, лежащий на TScrollBox.
Рисуешь свои картинки на канвасе бимапа, паинтишь этот битмап на паинтбоксе в событии OnPaint

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
05.12.2005, 22:24
    #33418324
Kirill M
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование PaintBox
2Карабас

а ты мог бы кодом написать для чайников?))))
...
Рейтинг: 0 / 0
06.12.2005, 07:00
    #33418493
Карабас Барабас
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование PaintBox
Kirill Mа ты мог бы кодом написать для чайников?))))каким еще кодом ? вот таким ?
Код: plaintext
1.
2.
3.
4.
5.
void __fastcall TMainForm::PaintBox1Paint(TObject *Sender)
{
  PaintBox1->Width=B_Load->Width;
  PaintBox1->Height=B_Load->Height;
  PaintBox1->Canvas->Draw( 0 , 0 ,B_Load);
}
...
Рейтинг: 0 / 0
06.12.2005, 09:26
    #33418614
Shtob bilo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование PaintBox
Смотри что у меня

Делаю форму, запихиваю в нее ScrollBox, в него PaintBox.

Далее добавляю в определение класса формы Bitmap

class TForm1 : public TForm
{
......

public: // User declarations
......
Graphics::TBitmap *Bitmap;
.....
};

Далее

В конструкторе формы инициализирую bitmap

__fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner){
Bitmap = new Graphics::TBitmap;
}

Далее как ты и говорил рисую на канву битмапа из другого класса

void Project::Draw(){
Form1->Bitmap->Canvas->LineTo(x, y);
//сначала рисую канву отсюда
Form1->PaintBox1->Canvas->Draw(0,0, Form1->Bitmap);
}

Не появляется...Почему?

void __fastcall TForm1::Paint(TObject *Sender){
PaintBox1->Canvas->Draw(0,0, Bitmap);

}

При вызове Paint тоже не появляется

Если Paint закоментировать все равно не рисуется

Где и что у меня не правильно?

Если есть возможность пиши в аську 233971135
Мне надо срочняком с этим разорбраться((((

Заранее спасибо за ответ
...
Рейтинг: 0 / 0
06.12.2005, 09:30
    #33418619
Карабас Барабас
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование PaintBox
Читай внимательно пример, который я тебе сбросил, и еще: когда хочешь, чтобы отобразилось нарисованное, вызывай тот метод, где копируется на PaintBox
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
06.12.2005, 09:33
    #33418626
Shtob bilo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование PaintBox
Ты про то что для PaintBox свой метод Paint....?
TMainForm::PaintBox1Paint
Ок..поробую в обед
...
Рейтинг: 0 / 0
07.12.2005, 10:37
    #33421370
Shtob bilo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование PaintBox
2Карабас

1)Что ты имел ввиду?
....вызывай тот метод, где копируется на PaintBox

2) С отображением все равно не получается...Когда использую битмап и русую на его канву, потом копирую размеры канвы Bitmap в размеры Painbox

Form1->PaintBox1 -> Width = Form1-> Bitmap -> Width
...

Далее
Form1 -> PaintBox1-> Draw(0,0, Form1-> Bitmap)

Нет изображения в PaintBox'е
...
Рейтинг: 0 / 0
07.12.2005, 10:41
    #33421384
Карабас Барабас
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование PaintBox
вот такой код работает 100%
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
  for(int y=Y0;y!=Y1;y+=DY)
  {
    BYTE *CBLoad=(BYTE *)B_Load->ScanLine[y];
    BYTE *CBSave=(BYTE *)B_Save->ScanLine[y];
    for(int x=X0;x!=X1;x+=DX)
    {
      int b=CBLoad[x* 3 ];
      int g=CBLoad[x* 3 + 1 ];
      int r=CBLoad[x* 3 + 2 ];

      int Diff=( 2 *r-b-g);
      if (Diff>=MinDiff)
      {
        r+=Correct;
        if (r< 0 ) r= 0 ;
        if (r> 255 ) r= 255 ;
      }
      CBSave[x* 3 + 2 ]=r;
    }
  }

  Changed= 1 ;

  PaintBox1Paint( 0 );
  PaintBox2Paint( 0 );
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::PaintBox1Paint(TObject *Sender)
{
  PaintBox1->Width=B_Load->Width;
  PaintBox1->Height=B_Load->Height;

  TCanvas *C=PaintBox1->Canvas;

  C->Draw( 0 , 0 ,B_Load);

  switch(SelState)
  {
    case  1 :
    case  2 :
    {
      TRect Rect(X0,Y0,X1,Y1);
      C->DrawFocusRect(Rect);
    } break;
  }

  ScrollBox2->VertScrollBar->Position=ScrollBox1->VertScrollBar->Position;
  ScrollBox2->HorzScrollBar->Position=ScrollBox1->HorzScrollBar->Position;
}

void __fastcall TMainForm::PaintBox2Paint(TObject *Sender)
{
  PaintBox2->Width=B_Save->Width;
  PaintBox2->Height=B_Save->Height;

  TCanvas *C=PaintBox2->Canvas;

  C->Draw( 0 , 0 ,B_Save);
}

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Использование PaintBox / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]