Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Програмное увеличение компонента Image по ширине. 
:(
    Опции темы
Нитонисе
Дата 9.11.2009, 20:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



Использую компонент Image для програмной отрисовки графической информации. Иногда может быть такая ситуация, что по ширине графики больше, чем может вместиться на компоненте. Хотелось бы засунуть Image на ScrolBox, чтобы при увеличении рисунка сам Image расширялся, на скролбоксе появлялся горизонтальный скролбар и была возможность прокручивать по ширине картинку. Но вот что-то не пойму как програмно расширить Image. Почему-то через свойство Image->Width расширить не удается. В чем дело?
PM MAIL   Вверх
Лапоть
Дата 9.11.2009, 22:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 185
Регистрация: 3.4.2009

Репутация: 1
Всего: 2



Имидж укладываешь на скроллбокс и ставишь выравнивание имиджа по клиенту. А размеры меняешь через свойства скроллбара:
Код

  ScrollBar1->Height = 500;  // хоть в инспекторе объектов
  ScrollBar1->Width = 1000; // -- " --
  // а вот это - там где надо!
  ScrollBar1->VertScrollBar->Range = 25000;
  ScrollBar1->HorzScrollBar->Range = 50000; 

PM MAIL   Вверх
Нитонисе
Дата 9.11.2009, 22:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



ScrollBar1->HorzScrollBar->Range = 50000; 

По этому коду увеличивается область прокрутки, но имейдж не меняется в ширине, хотя выравнен по клиенту.
PM MAIL   Вверх
Лапоть
Дата 10.11.2009, 13:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 185
Регистрация: 3.4.2009

Репутация: 1
Всего: 2



Ты сначала сделай...
user posted image
PM MAIL   Вверх
Нитонисе
Дата 10.11.2009, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



Лапоть, сделал, не работает.

Добавлено @ 14:44
Код

//очищаю канву
Image1->Canvas->FillRect(Rect(0,0,Image1->Width,Image1->Height));
//если список, откуда беру данные для рисования, пуст, то выхлжу
if (LBPlates->Count == 0) Abort();
//если данные для рисования есть, задаю ширину будущего рисунка в мм
int width = StrToInt(Label1->Caption);
//задаю длину(высоту) будущего рисунка в мм
int length = StrToInt(LELength->Text);
//определяю масштаб, чтобы по высоте рисунок помещался и оставались зазоры по 30 пкс
int Scale = length/(Image1->ClientHeight - 60);
//установки пера
Image1->Canvas->Pen->Color = clBlack;
Image1->Canvas->Pen->Width = 1;
//если предполагаемая ширина рисунка вылазит за пределы имейджа - увеличиваю скролбокс на нужное значение
if ((width/Scale+60) > Image1->ClientWidth) ScrollBox1->HorzScrollBar->Range = (width/Scale+60);
//рисую свой рисунок
Image1->Canvas->MoveTo(30,30);
Image1->Canvas->LineTo(30,30+length/Scale);
Image1->Canvas->LineTo(30+width/Scale,30+length/Scale);
Image1->Canvas->LineTo(30+width/Scale,30);
Image1->Canvas->LineTo(30,30);


Это сообщение отредактировал(а) Нитонисе - 10.11.2009, 14:45
PM MAIL   Вверх
Лапоть
Дата 10.11.2009, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 185
Регистрация: 3.4.2009

Репутация: 1
Всего: 2



Скорее всего ты что-то намудрил с масштабированием! На форме скроллбокс с имиджем и кнопка:
Код

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner) {
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender) {
  ScrollBox1->HorzScrollBar->Range = 1000;
  ScrollBox1->VertScrollBar->Range = 1000;
  Image1->Canvas->MoveTo(10, 10);
  Image1->Canvas->LineTo(990, 990);
  Image1->Canvas->MoveTo(990, 10);
  Image1->Canvas->LineTo(10, 990);
}
//---------------------------------------------------------------------------

Вот результат:
user posted image
PM MAIL   Вверх
Нитонисе
Дата 10.11.2009, 15:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



Ну и что? Вот что получается по твоему коду. Картинка примерно как и у меня.

user posted image

Нижняя часть серая. Скрол бокс прокрутился, а рисунка там нет. Имейдж не тянется за новыми рангами прокруток.

Это сообщение отредактировал(а) Нитонисе - 10.11.2009, 15:29
PM MAIL   Вверх
Лапоть
Дата 10.11.2009, 15:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 185
Регистрация: 3.4.2009

Репутация: 1
Всего: 2



Блин! Ты выравнивание у имиджа выставил?
Цитата(Нитонисе @  10.11.2009,  16:28 Найти цитируемый пост)
Картинка примерно как и у меня.
Вот именно - что примерно! smile 
---
В аттаче проект на BCB6.


Это сообщение отредактировал(а) Лапоть - 10.11.2009, 15:48

Присоединённый файл ( Кол-во скачиваний: 5 )
Присоединённый файл  sb.zip 13,99 Kb
PM MAIL   Вверх
Нитонисе
Дата 10.11.2009, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



Лапоть, я создал новый проект - там картинка внутри скролбокса прокручивается. А у меня в моем проекте - почему-то нет. Выравнивание картинку по клиенту установлено. Не пойму в чем дело.

Добавлено через 2 минуты и 46 секунд
Оказывается дело в этом коде:
Код

//очищаю канву
Image1->Canvas->FillRect(Rect(0,0,Image1->Width,Image1->Height));

После него картинка не скролится. 

А как по-другому канву почистить?
PM MAIL   Вверх
Лапоть
Дата 10.11.2009, 16:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 185
Регистрация: 3.4.2009

Репутация: 1
Всего: 2



Попробуй чистить непосредственно ПЕРЕД рисованием. После того, как размеры установишь.
PM MAIL   Вверх
Нитонисе
Дата 10.11.2009, 16:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



Лапоть, пробовал. Поставил очистку перед перемещением пера в точку 30,30 (по моему фрагменту кода). Не помогает.
PM MAIL   Вверх
Лапоть
Дата 10.11.2009, 20:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 185
Регистрация: 3.4.2009

Репутация: 1
Всего: 2



Фигасе...Смоделировал я то, что получается у тебя. С твоим же результатом! smile 
Код

void __fastcall TForm1::Button1Click(TObject *Sender) {
  Image1->Align = alClient;
  // даже если раскомментировать только эту строку - уже будет лажа!
//  Image1->Canvas->Brush->Color = clYellow;
//  Image1->Canvas->FillRect(Rect(0, 0, Image1->Width, Image1->Height));
  ScrollBox1->HorzScrollBar->Range = 1000;
  ScrollBox1->VertScrollBar->Range = 1000;
  Image1->Canvas->MoveTo(10, 10);
  Image1->Canvas->LineTo(990, 990);
  Image1->Canvas->MoveTo(990, 10);
  Image1->Canvas->LineTo(10, 990);
}
В очередной раз вспомнил про старые надёжные грабли - хочешь геморрой - рисуй на TImage! Для рисовалки надо TPaintBox использовать.  smile 
А вот и обещанный геморрой. В смысле, использование WinAPI для рисования именно на имидже
Код

void __fastcall TForm1::Button1Click(TObject *Sender) {
  ScrollBox1->HorzScrollBar->Range = 1000;
  ScrollBox1->VertScrollBar->Range = 1000;
  //-------------------------------------------------------------------------
  HDC dc = Image1->Canvas->Handle;
  RECT rect;
  rect.left = 0;
  rect.top = 0;
  rect.right = Image1->Width;
  rect.bottom = Image1->Height;
  HBRUSH brush = ::CreateSolidBrush(clYellow);
  ::SelectObject(dc, brush);
  ::FillRect(dc, &rect, brush);
  ::DeleteObject(brush);
  //-------------------------------------------------------------------------
  Image1->Canvas->MoveTo(10, 10);
  Image1->Canvas->LineTo(990, 990);
  Image1->Canvas->MoveTo(990, 10);
  Image1->Canvas->LineTo(10, 990);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender) {
  int wid = 500;
  int hei = 500;
  ScrollBox1->HorzScrollBar->Range = wid;
  ScrollBox1->VertScrollBar->Range = hei;
  //-------------------------------------------------------------------------
  HDC dc = Image1->Canvas->Handle;
  RECT rect;
  rect.left = 0;
  rect.top = 0;
  rect.right = Image1->Width;
  rect.bottom = Image1->Height;
  HBRUSH brush = ::CreateSolidBrush(clAqua);
  ::SelectObject(dc, brush);
  ::FillRect(dc, &rect, brush);
  ::DeleteObject(brush);
  //-------------------------------------------------------------------------
  for (int i = 10; i < wid - 10; i += 10) {
    Image1->Canvas->MoveTo(i, 10);
    Image1->Canvas->LineTo(wid - i, hei - 10);
} }

ЗЫ - по идее и собственно рисовать надо винапишными функциями - начиная от CreatePen()...
PM MAIL   Вверх
Лапоть
Дата 10.11.2009, 20:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 185
Регистрация: 3.4.2009

Репутация: 1
Всего: 2



 smile 
Код

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ExtCtrls.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm {
__published :
        TScrollBox     *ScrollBox1;
        TButton        *Button1;
        TButton        *Button2;
        void __fastcall Button1Click(TObject *Sender);
        void __fastcall Button2Click(TObject *Sender);
        void __fastcall FormClose(TObject *Sender, TCloseAction &Action);
private :
        TImage         *Image1;  // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
public :
             __fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif

Код

#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner) {
  Image1 = NULL;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action) {
  if (Image1)
    delete Image1;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender) {
  if (Image1)
    delete Image1;
  Image1 = new TImage(ScrollBox1);
  Image1->Parent = ScrollBox1;
  ScrollBox1->HorzScrollBar->Range = 1000;
  ScrollBox1->VertScrollBar->Range = 1000;
  Image1->Align = alClient;
  //-------------------------------------------------------------------------
  HDC dc = Image1->Canvas->Handle;
  RECT rect;
  rect.left = 0;
  rect.top = 0;
  rect.right = Image1->Width;
  rect.bottom = Image1->Height;
  HBRUSH brush = ::CreateSolidBrush(clYellow);
  ::SelectObject(dc, brush);
  ::FillRect(dc, &rect, brush);
  ::DeleteObject(brush);
  //-------------------------------------------------------------------------
  HPEN pen = ::CreatePen(PS_SOLID, 1, clRed);
  ::SelectObject(dc, pen);
  ::MoveToEx(dc, 10, 10, NULL);
  ::LineTo(dc, 990, 990);
  ::MoveToEx(dc, 990, 10, NULL);
  ::LineTo(dc, 10, 990);
  ::DeleteObject(pen);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender) {
  if (Image1)
    delete Image1;
  Image1 = new TImage(ScrollBox1);
  Image1->Parent = ScrollBox1;
  int wid = 500;
  int hei = 500;
  ScrollBox1->HorzScrollBar->Range = wid;
  ScrollBox1->VertScrollBar->Range = hei;
  Image1->Align = alClient;
  //-------------------------------------------------------------------------
  HDC dc = Image1->Canvas->Handle;
  RECT rect;
  rect.left = 0;
  rect.top = 0;
  rect.right = Image1->Width;
  rect.bottom = Image1->Height;
  HBRUSH brush = ::CreateSolidBrush(clAqua);
  ::SelectObject(dc, brush);
  ::FillRect(dc, &rect, brush);
  ::DeleteObject(brush);
  //-------------------------------------------------------------------------
  HPEN pen = ::CreatePen(PS_SOLID, 1, clBlue);
  ::SelectObject(dc, pen);
  for (int i = 10; i < wid - 10; i += 10) {
    ::MoveToEx(dc, i, 10, NULL);
    ::LineTo(dc, wid - i, hei - 10);
  }
  ::DeleteObject(pen);
}

Не исключено, что при динамическом создании имиджей корректно будут работать методы канвы - сам проверь!

Это сообщение отредактировал(а) Лапоть - 10.11.2009, 20:56
PM MAIL   Вверх
Нитонисе
Дата 10.11.2009, 21:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



Блин. Вот ты кода выдал, мне тут месяц разбираться)) Вообще мне не принципиально на чем рисовать. Если ты говоришь что PaintBox для этого лучше подходит, то попробую с ним работать. Я его изначально не взял потому как никогда раньше его не пользовал. Видно надо начинать))
PM MAIL   Вверх
586
Дата 10.11.2009, 21:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 57
Всего: 146



Слишком много у вас лишнего кода.
Код
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
    Image1->Stretch = true;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    Image1->Width = Image1->Width * 2;
    Image1->Height = Image1->Height * 2;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)
{
    Image1->Width = Image1->Width / 2;
    Image1->Height = Image1->Height / 2;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button3Click(TObject *Sender)
{
    if(OpenPictureDialog1->Execute())
    {
        Image1->Picture->Bitmap->LoadFromFile(OpenPictureDialog1->FileName);
        Image1->AutoSize = true;
        Image1->AutoSize = false;
    }
}

Форма: (аттач)

Присоединённый файл ( Кол-во скачиваний: 9 )
Присоединённый файл  form.PNG 12,46 Kb
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0916 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.