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

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

07.10.2010, 19:40. Показов 4027. Ответов 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
3957 / 1812 / 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
Ответ Создать тему
Новые блоги и статьи
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru