С Новым годом! Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.52/21: Рейтинг темы: голосов - 21, средняя оценка - 4.52
 Аватар для Luntegg
8 / 8 / 1
Регистрация: 06.02.2010
Сообщений: 87

Paint - как сделать вставку текста

07.10.2010, 19:40. Показов 3985. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
К концу семестра нужно сделать Paint. Все основное, такое как карандаш, кисть, распылитель, линии и т.д. сделал. Вот не знаю, как сделать вставку текста в нем... Кто что посоветует? Рисуется все на TImage... Например, если выбрана вставка текста, при клике создавать TEdit (если такое возможно вообще, потому что проходя рисование, не помню, можно ли там просто печатать)... Ну вообщем у кого какие соображения?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
07.10.2010, 19:40
Ответы с готовыми решениями:

Как сделать построчную вставку текста в Builder C++?
Имеется код: void __fastcall TForm1::Button5Click(TObject *Sender) { Memo1->SelText =...

Необходимо сделать вставку <b></b> по краям выделенного текста в Memo1, к примеру, что бы получился такой результат: <b>01</b>. Кто сможет помочь?
Имеется кнопка и текстовое поле: void __fastcall TForm1::Button7Click(TObject *Sender) { Memo1-&gt;SelText =...

пишу программу на С++, и делаю в ней ассемблеровскую вставку. Возможно ли в этой _asm вставке сделать С++ вставку?
Я пишу программу на С++, и делаю в ней ассемблеровскую вставку. Возможно ли в этой _asm вставке сделать С++ вставку? Если да, то как?

18
Тутошний я
 Аватар для Grey
2147 / 1202 / 225
Регистрация: 03.11.2009
Сообщений: 4,424
Записей в блоге: 2
08.10.2010, 16:23
Если попроще, то так.
C++
1
2
Image1->Canvas->Font->Size=14;//размер шрифта
Image1->Canvas->TextOutA(10,20,Edit1->Text);
Но лучше у Bitmap настроить прозрачность, и печатать туда. А потом копировать на Image. Тогда под текстом полосы не будет.

Добавлено через 9 минут
Перечитал задание, немного не так будет.
1
Эксперт С++
 Аватар для MikeSoft
3956 / 1811 / 184
Регистрация: 21.11.2009
Сообщений: 2,540
08.10.2010, 16:26
Grey, мне кажется, примерно так и будет.
Динамически создавать объект класса TMemo, растягивать его до выбранных размеров рамки (намеченной текстовой области) и разрушать его как только он теряет фокус. При разрушении воспользоваться функцией TextOut
2
 Аватар для Luntegg
8 / 8 / 1
Регистрация: 06.02.2010
Сообщений: 87
08.10.2010, 18:07  [ТС]
Можно немного поподробнее?

Я написал
C++
1
2
3
TMemo *b=new TMemo(Image1);
Image1->Canvas->Font->Size=14;
Image1->Canvas->TextOutA(10,20,b->Text);
ну и конечно как всегда все неправильно... ну не знаю я как надо

надо же создавать его где кликнули мышкой, делать на него фокус

Добавлено через 16 минут
извиняюсь, чего-то совсем затупил...
сделал
C++
1
2
3
TMemo *b=new TMemo(Image1);
b->SetFocus();
Image1->Canvas->Font->Size=14;
ошибка:
C++
1
class EInvalidOperation with message 'Control' has no parent window
0
Покинул форум
3189 / 1368 / 109
Регистрация: 29.01.2010
Сообщений: 2,887
08.10.2010, 18:10
Luntegg, вот небольшой примерчик, думаю, разберетесь:
Вложения
Тип файла: rar forforum.rar (460.1 Кб, 135 просмотров)
1
 Аватар для Luntegg
8 / 8 / 1
Регистрация: 06.02.2010
Сообщений: 87
08.10.2010, 22:57  [ТС]
довольно интересно сделано, огромное спасибо!
0
 Аватар для Luntegg
8 / 8 / 1
Регистрация: 06.02.2010
Сообщений: 87
08.10.2010, 23:13  [ТС]
Не знаю, и так и сяк перепробовал, ошибка "E2247 'TControl::Text' is not accessible"
Вложения
Тип файла: rar Paint.rar (360.5 Кб, 95 просмотров)
0
Тутошний я
 Аватар для Grey
2147 / 1202 / 225
Регистрация: 03.11.2009
Сообщений: 4,424
Записей в блоге: 2
09.10.2010, 18:48
У формы свойство KeyPriview в true.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void __fastcall TForm1::FormKeyPress(TObject *Sender, char &Key)
{
TMemo *b=new TMemo(this);
b->Parent=this;
b->SetFocus();
//b->Visible=true;
 
b->Text=b->Text+Key;
b->SelStart=b->SelStart+2;//не получается курсор сдвинуть
Image1->Canvas->Font->Size=14;
 
Image1->Canvas->TextOutA(x,y,b->Text);//x и y из примера Папы Карло
 
delete b;
Добавлено через 28 минут
Не удивительно, что курсор не двигался. Memo каждый раз заново создавалось.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
TMemo *c;
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
c=new TMemo(this);
c->Parent=this;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormKeyPress(TObject *Sender, char &Key)
{
c->SetFocus();
c->SelStart=c->SelStart+1;
Image1->Canvas->Font->Size=14;
 
Image1->Canvas->TextOutA(x,y,c->Text);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
delete c;
Только теперь с запозданием на 1 символ выводит.
1
 Аватар для Gremlin
519 / 307 / 58
Регистрация: 30.07.2008
Сообщений: 607
10.10.2010, 01:33
Внесу и свою лепту =) Правдо этот код был сделан под Edit фиксированной длинны строки но и под Мемо можно использовать, правда немного доделать нужно (в цикле рисовать строки из Мемо)

C++
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
int cur_x; // глобальная
int cur_y; // глобальная
//---------------------------------------------------------------------------
void __fastcall TForm1::Image3Click(TObject *Sender)
{
    //if(GetAsyncKeyState(VK_CONTROL) != 0)
    //{
        Memo1->BorderStyle = bsNone;
        Memo1->BevelKind = bkTile;
        Memo1->Top = Image3->Top + cur_y;
        Memo1->Left = Image3->Left + cur_x;
        Memo1->Visible = true;
        Memo1->Text = "text";
        Memo1->SetFocus();
        Memo1->SelectAll();
    //}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Image3MouseMove(TObject *Sender, TShiftState Shift,
      int X, int Y)
{
    cur_x = X;
    cur_y = Y;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Memo1KeyDown(TObject *Sender, WORD &Key,
      TShiftState Shift)
{
    // рисуем тест и прячем мемое при нажати [Enter]
    if(GetAsyncKeyState(VK_RETURN) != 0)
    {
        Image3->Canvas->TextOutA(Memo1->Left-Image3->Left + 2, Memo1->Top-Image3->Top + 2, Memo1->Text);
        Memo1->Top = -1000;
        Memo1->Left = -1000;
        Memo1->Visible = false;
    }
    // прячем мемое при нажати [Escape]
    if(GetAsyncKeyState(VK_ESCAPE) != 0)
    {
        Memo1->Top = -1000;
        Memo1->Left = -1000;
        Memo1->Visible = false;
    }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Memo1MouseDown(TObject *Sender,
      TMouseButton Button, TShiftState Shift, int X, int Y)
{
    // двигаем мемо по форме мышкой
    long SC_DRAGMOVE = 0xF012;
    if(Button == mbLeft)
    {
        ReleaseCapture();
        SendMessage(Memo1->Handle, WM_SYSCOMMAND, SC_DRAGMOVE, 0);
    }
}
//---------------------------------------------------------------------------
1
 Аватар для Luntegg
8 / 8 / 1
Регистрация: 06.02.2010
Сообщений: 87
10.10.2010, 02:18  [ТС]
Grey, так у Папы Карло же вроде полегче в примере, с ошибкой бы просто разобраться бы...
0
 Аватар для Gremlin
519 / 307 / 58
Регистрация: 30.07.2008
Сообщений: 607
10.10.2010, 02:21
да, у "Папа Карло" хороший пример, я просто выложил что у меня уже было, только подправил
0
 Аватар для Luntegg
8 / 8 / 1
Регистрация: 06.02.2010
Сообщений: 87
10.10.2010, 02:41  [ТС]
я попытался по твоему сделать, у меня только мемо это перемещается рандомно, ближе к стрелке, текст на канвасе не пишется, мемо не убирается... тебе не сложно будет встроить свой пример в мой пеинт? ну блин, честно, все 3 варианта попробовал, руки кривые у меня...
0
 Аватар для Gremlin
519 / 307 / 58
Регистрация: 30.07.2008
Сообщений: 607
10.10.2010, 04:28
C++
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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
int cur_x; // глобальная
int cur_y; // глобальная
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Image1Click(TObject *Sender)
{
    Memo1->BorderStyle = bsNone;
    Memo1->BevelKind = bkTile;
    Memo1->Top = Image1->Top + cur_y;
    Memo1->Left = Image1->Left + cur_x;
    Memo1->Visible = true;
    Memo1->Text = "text";
    Memo1->SetFocus();
    Memo1->SelectAll();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Image1MouseMove(TObject *Sender, TShiftState Shift,
      int X, int Y)
{
    cur_x = X;
    cur_y = Y;    
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Memo1KeyDown(TObject *Sender, WORD &Key,
      TShiftState Shift)
{
    // рисуем тест и прячем мемое при нажати [Enter]
    if(GetAsyncKeyState(VK_RETURN) != 0)
    {
        Graphics::TBitmap *Bitmap = new Graphics::TBitmap;
        Bitmap->Width = 500;
        Bitmap->Height = 500;
 
        Bitmap->Canvas->Font->Color = ColorBox1->Selected;
        Bitmap->Canvas->TextOutA(0, 0, Memo1->Text);
 
        Bitmap->Transparent = true;         //  это чтобы не было белого фона у текста
        Bitmap->TransparentColor = clWhite; //
 
        Image1->Canvas->Draw(Memo1->Left - Image1->Left + 2, Memo1->Top - Image1->Top + 2, Bitmap);
        delete Bitmap;
 
        Memo1->Top = -1000;
        Memo1->Left = -1000;
        Memo1->Visible = false;
    }
    // прячем мемое при нажати [Escape]
    if(GetAsyncKeyState(VK_ESCAPE) != 0)
    {
        Memo1->Top = -1000;
        Memo1->Left = -1000;
        Memo1->Visible = false;
    }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Memo1MouseDown(TObject *Sender,
      TMouseButton Button, TShiftState Shift, int X, int Y)
{
    // двигаем мемо по форме мышкой
    long SC_DRAGMOVE = 0xF012;
    if(Button == mbLeft)
    {
        ReleaseCapture();
        SendMessage(Memo1->Handle, WM_SYSCOMMAND, SC_DRAGMOVE, 0);
    }
}
//---------------------------------------------------------------------------
Вложения
Тип файла: zip pp.zip (1.45 Мб, 44 просмотров)
1
 Аватар для Luntegg
8 / 8 / 1
Регистрация: 06.02.2010
Сообщений: 87
10.10.2010, 12:13  [ТС]
спасибо, красиво, но только ведь после нажатия Enter все что правее и ниже Memo1 становится белым, рисунок стирается...
0
 Аватар для Gremlin
519 / 307 / 58
Регистрация: 30.07.2008
Сообщений: 607
10.10.2010, 15:39
хм... у меня все нормально, попробуй

заменить на это
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
        Graphics::TBitmap *Bitmap = new Graphics::TBitmap;
        Bitmap->Width = Memo1->Width;
        Bitmap->Height = Memo1->Height;
        Bitmap->Canvas->Font->Color = ColorBox1->Selected;
        Bitmap->Canvas->TextOutA(0, 0, Memo1->Text);
 
        Bitmap->Transparent = true;         //  это чтобы не было белого фона у текста
        Bitmap->TransparentColor = Bitmap->Canvas->Pixels[0][0]; // попробуй так
 
        Image1->Canvas->Draw(Memo1->Left - Image1->Left + 2, Memo1->Top - Image1->Top + 2, Bitmap);
        delete Bitmap;
 
        Memo1->Top = -1000;
        Memo1->Left = -1000;
        Memo1->Visible = false;
1
 Аватар для Luntegg
8 / 8 / 1
Регистрация: 06.02.2010
Сообщений: 87
11.10.2010, 16:43  [ТС]
там можно было просто убрать заполнение белым
но все равно не до конца работает
все нормально, но белым закрашивается все остальное, где текста нет... можно конечно сделать его высоту 12, и ширину 40, но тогда будет влезать несколько букв.... надо как то сжимать это Memo1 по ширине и высоте текста...
0
 Аватар для Gremlin
519 / 307 / 58
Регистрация: 30.07.2008
Сообщений: 607
11.10.2010, 18:02
Непонимаю, почему у тебя лишнее закрашивается

тут есть Изменение размера в зависимости от текста
ограничение перемещения внутри Image
Вложения
Тип файла: zip pp.zip (1.82 Мб, 45 просмотров)
1
 Аватар для Luntegg
8 / 8 / 1
Регистрация: 06.02.2010
Сообщений: 87
12.10.2010, 00:49  [ТС]
не знаю, так же, пот именно за текстом - рисунок, а все остальное - белое... скрин думаю не надо, итак все понятно...
0
1 / 1 / 0
Регистрация: 13.10.2012
Сообщений: 34
13.10.2012, 14:16
Ребята помогите сделать paint на C++ Builder?
Подробнее пишите код программы!!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
13.10.2012, 14:16
Помогаю со студенческими работами здесь

Создать меню с командами Size, Color, Paint, Quit. При запуске приложения сделать недоступной команду Paint
Создать меню с командами Size, Color, Paint, Quit. При запуске приложения сделать недоступной команду Paint. При выборе команды Quit...

Как сделать ассемблерную вставку в с++ ?
void encode_symbol (short int symbol ) { long range=0; asm{ mov ax,high //---------------находим range-------------- ...

Как сделать вставку в цикл?
Ребята, подскажите как сделать вставку внутрь цикла, который вводит посты в категории. Нужно каждые 2 или 3 поста делать вставку...

Как сделать вставку из буфера?
скажите пожалуйста как сделать вставку из буфера, текста в эдит другой программы, а потом сделать ввод(Enter). Пробовал SendMessage но...

Как сделать вставку на ассемблере?
Пытался написать вставку с Turbo на ABC на отключение курсора: procedure CursorOff; assembler; asm mov ah,1 mov ch, 20h int...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и источниками (напряжения, ЭДС и тока). Найти токи и напряжения во всех элементах. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru