Поиск:

Ответ в темуСоздание новой темы Создание опроса
> динамическое рисование эллипса, динамические фигуры 
:(
    Опции темы
evgovs1991
Дата 9.10.2014, 23:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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

#ifndef UGrEditH
#define UGrEditH
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <Buttons.hpp>
#include <Dialogs.hpp>
#include <ExtCtrls.hpp>
#include <ExtDlgs.hpp>
#include <Menus.hpp>
#include <clipbrd.hpp>
class TForm1 : public TForm
{
__published:    // IDE-managed Components
TImage *Image3;
TSpeedButton *SBRect;
TSpeedButton *SBRectang;
TSpeedButton *SBEllip;
TMainMenu *MainMenu1;
TMenuItem *MFile;
TMenuItem *MOpen;
TMenuItem *MSave;
TMenuItem *N1;
TOpenPictureDialog *OpenPictureDialog1;
TSavePictureDialog *SavePictureDialog1;
TButton *Button1;
TColorBox *ColorBox1;
void __fastcall FormCreate(TObject *Sender);
void __fastcall FormDestroy(TObject *Sender);
void __fastcall Image3MouseMove(TObject *Sender, TShiftState Shift, int X,
int Y);
void __fastcall Image3MouseUp(TObject *Sender, TMouseButton Button,
TShiftState Shift, int X, int Y);
void __fastcall MSaveClick(TObject *Sender);
void __fastcall Button1Click(TObject *Sender);
void __fastcall SBEllipClick(TObject *Sender);
void __fastcall Image3MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift,
int X, int Y);
void __fastcall ColorBox1Change(TObject *Sender);
private:    // User declarations
public:    // User declarations
__fastcall TForm1(TComponent* Owner);
};
Graphics::TBitmap *BitMap = new Graphics::TBitmap;
TRect R,R0;
int X0,Y0,X1,Y1;
bool RBegin = false, REnd = false, RDrag = false;
extern PACKAGE TForm1 *Form1;
endif


UGrEdit.cpp
Код

#include <vcl.h>
#pragma hdrstop
#include"Unit2.h"
#include "UGrEdit.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
// константы курсоров
const int crFill = 1;
const int crPlus = 2;
const int crDraw = 3;
const int crErase = 4;
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
void __fastcall TForm1::FormCreate(TObject *Sender)
{
// регистрация курсоров
Screen->Cursors[crFill] = LoadCursor(HInstance, "FILL");
Screen->Cursors[crPlus] = LoadCursor(HInstance, "PLUS");
Screen->Cursors[crDraw] = LoadCursor(HInstance, "DRAW");
Screen->Cursors[crErase] = LoadCursor(HInstance, "ERASE");
Image3->Canvas->Rectangle(200,120,200,120);
BitMap->Assign(Image3->Picture);
Image3->Canvas->Pen->Color=clBlack;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormDestroy(TObject *Sender)
{
BitMap->Free();
}
void __fastcall TForm1::Image3MouseMove(TObject *Sender, TShiftState Shift,
int X, int Y)
{
if (SBEllip->Down && RBegin==true)
{
// Режим рисования эллипса

Image3->Canvas->Pen->Mode=pmNotXor;
Image3->Canvas->Ellipse(R);
if (X0 < X) { R.Left = X0; R.Right = X; }
else { R.Left = X; R.Right = X0; }
if (Y0 < Y) { R.Top = Y0; R.Bottom = Y; }
else { R.Top = Y; R.Bottom = Y0; }
}
}
void __fastcall TForm1::Image3MouseUp(TObject *Sender, TMouseButton Button,
TShiftState Shift, int X, int Y)
{
RBegin=false;
}
void __fastcall TForm1::MSaveClick(TObject *Sender)
{
if (SavePictureDialog1->Execute())
{
BitMap->Assign(Image3->Picture);
BitMap->SaveToFile(SavePictureDialog1->FileName);
}
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
;
}
void __fastcall TForm1::SBEllipClick(TObject *Sender)
{
Image3->Canvas->Brush->Color=ColorBox1->Selected;
Image3->Canvas->Brush->Style=bsClear;
Image3->Canvas->Pen->Color=ColorBox1->Selected;
BitMap->Assign(Image3->Picture);
}
void __fastcall TForm1::Image3MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift,
int X, int Y)
{
if(SBEllip->Down){
RBegin=true;
X0=X;
Y0=Y;
}
}
void __fastcall TForm1::ColorBox1Change(TObject *Sender)
{
Image3->Canvas->Pen->Color=ColorBox1->Selected;
}

user posted image
PM MAIL   Вверх
xvr
Дата 10.10.2014, 09:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Прежде чем рисовать новый эллипс вы долны стереть старый. Это можно сделать либо сохранением BitMap перед рисованием и восстановлением перед каждым новым рисованием эллипса, либо 2х кратным рисованием эллипса в режиме XOR (что бы 2е рисование того же самого эллипса его удаляло)

PM MAIL   Вверх
evgovs1991
Дата 10.10.2014, 11:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



решил проблему с рисованием эллипса динамически....но мне нужно рисовать неограниченное количество эллипсов как в paint

Код

// Режим рисования эллипса
Image3->Canvas->Pen->Mode=pmNotXor;
Image3->Canvas->PenColor=ColorBox1->Selected;
Image3->Canvas->Ellipse(R);
if (X0 < X) { R.Left = X0; R.Right = X; }
else { R.Left = X; R.Right = X0; }
if (Y0 < Y) { R.Top = Y0; R.Bottom = Y; }
else { R.Top = Y; R.Bottom = Y0; }
Image3->Canvas->Ellipse(R);



Добавлено через 2 минуты и 8 секунд
Цитата(xvr @ 10.10.2014,  09:18)
Прежде чем рисовать новый эллипс вы долны стереть старый. Это можно сделать либо сохранением BitMap перед рисованием и восстановлением перед каждым новым рисованием эллипса, либо 2х кратным рисованием эллипса в режиме XOR (что бы 2е рисование того же самого эллипса его удаляло)

а как хранить временное изображение эллипса и где лучше?

Добавлено через 13 минут и 30 секунд
  Вот что получается когда много эллипсов
user posted image
PM MAIL   Вверх
xvr
Дата 10.10.2014, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(evgovs1991 @  10.10.2014,  11:19 Найти цитируемый пост)
а как хранить временное изображение эллипса и где лучше?

Лучше не хранить - будут большие тормоза

А для того, что бы элипсы были не такие рваные, можно в процессе рисования использовать pmNotXor, а когда рисование закончилось (пользователь отпустил кнопку мыши) стирать элипс (тем же pmNotXor), а потом рисовать конечную версию обычным pmCopy (или как он там называется)

PM MAIL   Вверх
evgovs1991
Дата 10.10.2014, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(xvr @ 10.10.2014,  12:16)
Цитата(evgovs1991 @  10.10.2014,  11:19 Найти цитируемый пост)
а как хранить временное изображение эллипса и где лучше?

Лучше не хранить - будут большие тормоза

А для того, что бы элипсы были не такие рваные, можно в процессе рисования использовать pmNotXor, а когда рисование закончилось (пользователь отпустил кнопку мыши) стирать элипс (тем же pmNotXor), а потом рисовать конечную версию обычным pmCopy (или как он там называется)

Это помогло но мне надо рисовать не один эллипс а много...как отпускаю кнопку мыши то рисуется эллипс..но если рисую заново то старый стирается вот поэтому и спрашиваю как хранить а потом вставлять изображение
PM MAIL   Вверх
xvr
Дата 10.10.2014, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(evgovs1991 @  10.10.2014,  13:19 Найти цитируемый пост)
но если рисую заново то старый стирается

Это почему? Он должен остаться на канве Image3, и с момента отпускания клавиши мыши он станет фоновым рисунком, поверх которого вы будете рисовать новые элипсы.

Проверьте обработчики. У вас первое Xor рисование должно быть в обработчике MouseDown, 2 штуки в MouseMove и заключительные Xor и Сopy в MouseUp


PM MAIL   Вверх
evgovs1991
Дата 10.10.2014, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



всё исправил теперь работает smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

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

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

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

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


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

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


 




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


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

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