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

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

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

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

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

ЗАРАНЕЕ СПАСИБО ЗА ПОМОЩЬ
...
Рейтинг: 0 / 0
Использование PaintBox
    #33415983
spectre
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ответ на 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
Использование PaintBox
    #33415988
spectre
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пример простой - загружаем с клипборда изображение в битмап. В событии формы OnPaint необходимо заняться перерисовкой. К стати в этом случае PaintBox вообще не обязательно использовать. Если такая необходимость все же возникает (что предположим понятно) то вместо
Код: plaintext
Canvas->Draw( 5 , 5 ,Bitmap);
используй в обоих случаях
Код: plaintext
PaintBox1->Canvas->Draw( 5 , 5 ,Bitmap);
...
Рейтинг: 0 / 0
Использование PaintBox
    #33416144
Shtob bilo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за ответ, но остался вопрос...

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

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

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

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

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

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

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

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

а ты мог бы кодом написать для чайников?))))
...
Рейтинг: 0 / 0
Использование PaintBox
    #33418493
Карабас Барабас
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Использование PaintBox
    #33418614
Shtob bilo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Смотри что у меня

Делаю форму, запихиваю в нее 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
Использование PaintBox
    #33418619
Карабас Барабас
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Читай внимательно пример, который я тебе сбросил, и еще: когда хочешь, чтобы отобразилось нарисованное, вызывай тот метод, где копируется на PaintBox
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Использование PaintBox
    #33418626
Shtob bilo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ты про то что для PaintBox свой метод Paint....?
TMainForm::PaintBox1Paint
Ок..поробую в обед
...
Рейтинг: 0 / 0
Использование PaintBox
    #33421370
Shtob bilo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2Карабас

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

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

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

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

Нет изображения в PaintBox'е
...
Рейтинг: 0 / 0
Использование PaintBox
    #33421384
Карабас Барабас
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот такой код работает 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
16 сообщений из 16, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Использование PaintBox
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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