Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/11: Рейтинг темы: голосов - 11, средняя оценка - 5.00
11 / 11 / 1
Регистрация: 01.12.2011
Сообщений: 162
Записей в блоге: 2

Выделение в стиле XP

24.01.2012, 11:32. Показов 2284. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Обыскал весь форум и гугл, ответа на свой вопрос так и не нашёл. Хотя были примеры и с вторым Image и Chart.

Собственно сам вопрос. В программе Image элемент. В нём загружено изображение. Изображение всегда bmp, но загружаться изображения могут с разными размерами. За счёт скрула изображение можно мотать вверх, вниз и тд. Итак, необходимо создать сетку поверх Image для того чтобы по ней выделать часть изображения (естественно мышью, зажимаем левую кнопку мыши и выделяем).

Каждая клетка сетки 50х50 пикселей. Сетка от начала и до конца изображения. Кстати, сетка должна так же перемещаться как и изображение (скрулом).

В итоге после выделения в Memo выносится высата и ширина выделенной области измеряющаяся в клетках (пример: высота=2кл ширина=5кл) и на какой высате от верха и ширине от левого края находится выделенная область тоже в клетках (пример: отступ с верха=15кл отступ слева=30кл)

Пока что сам мучаюсь вторым Image и Chart,
C++
1
2
3
4
Image2->Canvas->MoveTo(10,10);
Image2->Canvas->LineTo(10,10);
Image2->Canvas->MoveTo(0,20);
Image2->Canvas->LineTo(30,30);
но не получается того что нужно.
Поэтому прошу у вас совета.

Заранее спасибо !

Добавлено через 20 часов 18 минут
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
80
81
82
83
84
85
86
87
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
TImage * Pict = new TImage(Form1);
int  RectX0,RectY0,koefX,koefY;
bool vibor;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::FormCreate(TObject *Sender)
{
 Pict->AutoSize = true;
 Pict->Picture->LoadFromFile("C:\\ui_icon_equipment.bmp");
 Image1->Width=Pict->Width;
 Image1->Height=Pict->Height;
 //delete Pict;
 DoubleBuffered=1;
Pict->Canvas->Pen->Color=RGB(181,197,156);//-зелёный, (167,52,52) - красный
Pict->Canvas->Pen->Width=1;
koefX=50;
koefY=50;
while (koefX<Pict->Width)
{
Pict->Canvas->MoveTo(koefX,0);
Pict->Canvas->LineTo(koefX,Pict->Height);
koefX=koefX+50;
}
while (koefY<Pict->Height)
{
Pict->Canvas->MoveTo(0,koefY);
Pict->Canvas->LineTo(Pict->Width,koefY);
koefY=koefY+50;
}
Image1->Canvas->CopyRect(Image1->ClientRect, Pict->Canvas,
        Rect(0,0,Pict->Width,Pict->Height));
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Image1MouseDown(TObject *Sender,
      TMouseButton Button, TShiftState Shift, int X, int Y)
{
if (Button == mbLeft)
{
vibor=1;
Image1->Canvas->CopyRect(Image1->ClientRect, Pict->Canvas,
        Rect(0,0,Pict->Width,Pict->Height));
RectX0 = X;
RectY0 = Y;
Image1->Canvas->Pen->Color=clSkyBlue;//(167,52,52) - красный
Image1->Canvas->Brush->Color=RGB(23,40,60);//(12,40,71);//clSkyBlue;
Image1->Canvas->Pen->Width=2;
Image1->Canvas->Brush->Style=bsBDiagonal;//bsClear;//bsDiagCross;
}
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Image1MouseMove(TObject *Sender, TShiftState Shift,
      int X, int Y)
{
if(vibor){
//Image1->Canvas->DrawFocusRect(TRect(RectX0,RectY0,X,Y));
Image1->Canvas->CopyRect(Image1->ClientRect, Pict->Canvas,
        Rect(0,0,Pict->Width,Pict->Height));
Image1->Canvas->RoundRect(RectX0,RectY0,X,Y,5,5);//Rectangle(RectX0,RectY0,X,Y); RoundRect
}
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Image1MouseUp(TObject *Sender, TMouseButton Button,
      TShiftState Shift, int X, int Y)
{
if (Button == mbLeft)
{
vibor=0;
}
}
//---------------------------------------------------------------------------
Возник вопрос построение прямоугольника показывающий область выделения.
Пока что я сделал в Image1MouseMove перерисовку всего Image и прямоугольника, но думаю это слишком нагружает комп. Так вот можно ли обойти перерисовку? Может менять координаты уже имеющегося прямоугольника? Или предложите пожалуйста другой способ показывать выделение.

Добавлено через 1 час 57 минут
Обновил немного код (сделал привязку выделения к сетке).
Вопрос всё равно про прямоугольник остаётся.
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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
TImage * Pict = new TImage(Form1);
int  RectX0,RectY0,RectX0Rev,RectY0Rev,RectX1,RectY1,koefX,koefY;
bool vibor;
div_t z;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::FormCreate(TObject *Sender)
{
 Pict->AutoSize = true;
 Pict->Picture->LoadFromFile("C:\\ui_icon_equipment.bmp");
 Image1->Width=Pict->Width;
 Image1->Height=Pict->Height;
 //delete Pict;
 DoubleBuffered=1;
Pict->Canvas->Pen->Color=RGB(181,197,156);//-зелёный, (167,52,52) - красный
Pict->Canvas->Pen->Width=1;
koefX=50;
koefY=50;
while (koefX<Pict->Width)
{
Pict->Canvas->MoveTo(koefX,0);
Pict->Canvas->LineTo(koefX,Pict->Height);
koefX=koefX+50;
}
while (koefY<Pict->Height)
{
Pict->Canvas->MoveTo(0,koefY);
Pict->Canvas->LineTo(Pict->Width,koefY);
koefY=koefY+50;
}
Image1->Canvas->CopyRect(Image1->ClientRect, Pict->Canvas,
        Rect(0,0,Pict->Width,Pict->Height));
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Image1MouseDown(TObject *Sender,
      TMouseButton Button, TShiftState Shift, int X, int Y)
{
if (Button == mbLeft)
{
vibor=1;
Image1->Canvas->CopyRect(Image1->ClientRect, Pict->Canvas,
        Rect(0,0,Pict->Width,Pict->Height));
 
z=div (X,50);
RectX0=50*z.quot;
RectX0Rev=50*(z.quot+1);
z=div (Y,50);
RectY0=50*z.quot;
RectY0Rev=50*(z.quot+1);
Image1->Canvas->Pen->Color=clSkyBlue;//(167,52,52) - красный
Image1->Canvas->Brush->Color=RGB(23,40,60);//(12,40,71);//clSkyBlue;
Image1->Canvas->Pen->Width=2;
Image1->Canvas->Brush->Style=bsBDiagonal;//bsClear;//bsDiagCross;
}
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Image1MouseMove(TObject *Sender, TShiftState Shift,
      int X, int Y)
{
if(vibor){
//Image1->Canvas->DrawFocusRect(TRect(RectX0,RectY0,X,Y));
 
z=div (X,50);
if (X>RectX0){
RectX1=50*(z.quot+1);
}
else if(X<RectX0){
RectX0=RectX0Rev;
RectX1=50*z.quot;
}
 
z=div (Y,50);
if (Y>RectY0){
RectY1=50*(z.quot+1);
}
else if(Y<RectY0){
RectY0=RectY0Rev;
RectY1=50*z.quot;
}
 
//zX=div (X,50);
//RectX0=50*zX.quot;
//zY=div (Y,50);
//RectY0=50*zY.quot;
//zX=div (X,50);
//RectX1=50*(zX.quot+1);
//zY=div (Y,50);
//RectY1=50*(zY.quot+1);
 
Image1->Canvas->CopyRect(Image1->ClientRect, Pict->Canvas,
        Rect(0,0,Pict->Width,Pict->Height));
Image1->Canvas->RoundRect(RectX0,RectY0,RectX1,RectY1,5,5);//Rectangle(RectX0,RectY0,X,Y); RoundRect
}
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Image1MouseUp(TObject *Sender, TMouseButton Button,
      TShiftState Shift, int X, int Y)
{
if (Button == mbLeft)
{
vibor=0;
}
}
//---------------------------------------------------------------------------
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
24.01.2012, 11:32
Ответы с готовыми решениями:

Выделение памяти (CodeGear RAD Studio 2009 - C++ builder). Выделение памяти - консоль vs SDIApp
Есть определенный класс - длинная арифметика. Не идеальный - хранение данных исполнено в виде динамического массива типа short int, каждая...

Динамическое выделение памяти под строки в стиле Си
В программе пользователь вводит строку неизвестного заранее размера. Ее нужно передать в функцию для работы с ней. Как это оформить на c++?...

C++ в функциональном стиле: как писать в стиле C#/LINQ (без дополнительных библиотек)?
Как писать в стиле C#/LINQ (без дополнительных библиотек)? Вот, допустим, есть простейшая задача: ввести число n, ввести n групп чисел, в...

10
11 / 11 / 1
Регистрация: 01.12.2011
Сообщений: 162
Записей в блоге: 2
04.02.2012, 23:44  [ТС]
Здесь ссылки на другие форумы запрещены Правилами решался вопрос о показе выделения, в ответах даже есть пример кода, но к сожаления это всё для Delphi. Сам использую Builder.

Пробовал из ответа код подстраивать под builder, наверное что-то не так сделал. Поэтому вопрос: можно ли сделать выделение в стиле XP в Builder'е? Это вообще возможно? Если да помогите пожалуйста перевести код в builder.

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
    function AlphaBlend(
      hdcDest:HDC;             // handle to destination DC
      nXOriginDest,            // x-coord of upper-left corner
      nYOriginDest,            // y-coord of upper-left corner
      nWidthDest,              // destination width
      nHeightDest:integer;     // destination height
      hdcSrc:HDC;              // handle to source DC
      nXOriginSrc,             // x-coord of upper-left corner
      nYOriginSrc,             // y-coord of upper-left corner
      nWidthSrc,               // source width
      nHeightSrc:integer;      // source height
      blendFunction:TBLENDFUNCTION  // alpha-blending function
    ) : boolean;stdcall; external 'Msimg32.dll';
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    procedure blend(alpha:integer;Dest:TListView; Rdest:Trect; source:Tbitmap;
    Rsource:Trect );
    var sourceDC,destDC:HDC;
        TB:TBLENDFUNCTION;
        bres:boolean;
    begin
       TB.BlendOp:=0;
       TB.BlendFlags:=0;
       TB.SourceConstantAlpha:=alpha;
       TB.AlphaFormat:=0;
     bres:=alphablend(
        dest.canvas.handle,rdest.left,rdest.top,
        rdest.right-rdest.left,rdest.bottom-rdest.top,
      source.canvas.handle,
      rsource.left,rsource.top,
        rsource.right-rsource.left,rsource.bottom-rsource.top,
      TB);
    end;

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    var Bitmap1:TBitmap;
    ........................
    procedure TForm1.Button1Click(Sender: TObject);
    begin
    Bitmap1:=TBitmap.Create;
    Bitmap1.Width:=60;
    Bitmap1.Height:=60;
    Bitmap1.Canvas.Brush.Color:=clblue; //цвет заливки
    Bitmap1.Canvas.Rectangle(Rect(0,0,60,60)); //заливаем Bitmap
    //теперь наша функция
    blend(120,ShellListView1,Bitmap1.Canvas.ClipRect,Bitmap1,Bitmap1.Canvas.ClipRect);
    //теперь обведём рамку bitmap'а:
    ShellListView1.Canvas.Pen.Color:=clBlack;
    ShellListView1.Canvas.Polyline([Point(0,0),Point(60,0),Point(60,60),Point(0,60), Point(0,0)]);
    //освобождаем память
    Bitmap1.Free;
    end;
Заранее спасибо!
0
872 / 448 / 35
Регистрация: 25.10.2011
Сообщений: 910
05.02.2012, 05:32
Отрисовка прозрачного изображения на окне:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void __fastcall DrawBitmapAlpha(HDC hDestination, HBITMAP hBitmap, TRect Rect, BYTE AlphaValue)
{
    BITMAP hBitmapScript;
    ::GetObject(hBitmap,sizeof(BITMAP),&hBitmapScript);
    
    HDC hAlphaDevice = ::CreateCompatibleDC(hDestination);
    HGDIOBJ hREBitmap = ::SelectObject(hAlphaDevice,hBitmap);
    
    BLENDFUNCTION hAlphaBlend;
    memset(&hAlphaBlend,NULL,sizeof(BLENDFUNCTION));
    hAlphaBlend.SourceConstantAlpha = AlphaValue;
    
    ::AlphaBlend(hDestination,Rect.Left,Rect.Top,Rect.Width(),Rect.Height(),
        hAlphaDevice,0,0,hBitmapScript.bmWidth,hBitmapScript.bmHeight,hAlphaBlend);
    
    ::SelectObject(hAlphaDevice,hREBitmap);
    ::DeleteDC(hAlphaDevice);
}
Пример:
C++
1
2
3
4
HDC hDevice = ::GetDC(Panel1->Handle);
DrawBitmapAlpha(hDevice,Image1->Picture->Bitmap->Handle,Panel1->ClientRect,100);
// зальет Panel1 битмапом из Image1 по всей области с уровнем прозрачности 100 (0 ... 255).
::ReleaseDC(Panel1->Handle,hDevice);
Добавлено через 53 секунды
ps. Возможно потребуется подключить файл "msimg32.lib".

Добавлено через 3 минуты
Заливка окна прозрачным цветом:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void __fastcall FillRectAlpha(HDC hDestination, TRect Rect, COLORREF ValueRGB, BYTE AlphaValue)
{
    HBITMAP hAlphaBitmap = ::CreateCompatibleBitmap(hDestination,1,1);
    HDC hAlphaDevice = ::CreateCompatibleDC(hDestination);
    HGDIOBJ hREBitmap = ::SelectObject(hAlphaDevice,hAlphaBitmap);
    ::SetPixelV(hAlphaDevice,0,0,ValueRGB);
    
    BLENDFUNCTION hAlphaBlend;
    memset(&hAlphaBlend,NULL,sizeof(BLENDFUNCTION));
    hAlphaBlend.SourceConstantAlpha = AlphaValue;
    
    ::AlphaBlend(hDestination,Rect.Left,Rect.Top,Rect.Width(),Rect.Height(),
        hAlphaDevice,0,0,1,1,hAlphaBlend);
    
    ::SelectObject(hAlphaDevice,hREBitmap);
    ::DeleteObject(hAlphaBitmap);
    ::DeleteDC(hAlphaDevice);
}
Пример:
C++
1
2
3
4
HDC hDevice = ::GetWindowDC(Form1);
FillRectAlpha(hDevice,Form1->ClientRect,RGB(128,0,0),50);
// зальет всю форму1 темно-красным цветом с прозрачностью 50.
::ReleaseDC(Form1,hDevice);
Добавлено через 42 секунды
ps. А вообще для этого целесообразней использовать GDI+. Меньше затрат будет.
1
11 / 11 / 1
Регистрация: 01.12.2011
Сообщений: 162
Записей в блоге: 2
05.02.2012, 11:17  [ТС]
DefineTrueFalse, А можно поподробней о GDI+?
0
872 / 448 / 35
Регистрация: 25.10.2011
Сообщений: 910
05.02.2012, 16:18
Цитата Сообщение от X_Starter_X Посмотреть сообщение
DefineTrueFalse, А можно поподробней о GDI+?
Конечно можно, только вряд ли я вам сейчас все подробно опишу, ибо свободное время сводится к нулю. Вот что нам поведает n-нный сайт забитый в 2/3 браузеров.
GDI (Graphics Device Interface, Graphical Device Interface) — один из трёх основных компонентов или «подсистем», вместе с ядром и Windows API составляющих пользовательский интерфейс (оконный менеджер GDI) Microsoft Windows.
GDI — это интерфейс Windows для представления графических объектов и передачи их на устройства отображения, такие как мониторы и принтеры.
GDI отвечает за отрисовку линий и кривых, отображение шрифтов и обработку палитры. Он не отвечает за отрисовку окон, меню и т. п., эта задача закреплена за пользовательской подсистемой, располагающейся в user32.dll и основывающейся на GDI. GDI выполняет те же функции, что и QuickDraw в Mac OS.
Одно из преимуществ использования GDI вместо прямого доступа к оборудованию — это унификация работы с различными устройствами. Используя GDI, можно одними и теми же функциями рисовать на разных устройствах, таких как экран или принтер, получая на них практически одинаковые изображения. Эта возможность лежит в центре всех WYSIWYG-приложений для Windows.
Простые игры, которые не требуют быстрой графики, могут использовать GDI. Однако GDI не обеспечивает качественной анимации, поскольку в нём нет возможности синхронизации с кадровым буфером. Также, в GDI нет растеризации для отрисовки 3D-графики. Современные игры используют DirectX или OpenGL, что даёт программистам доступ к большему количеству аппаратных возможностей.
Касательно самого GDI+:
выходом Windows XP появился потомок подсистемы, GDI+, основанной на C++[1].

GDI+ является улучшенной средой для 2D-графики, в которую добавлены такие возможности, как сглаживание линий (antialiasing), использование координат с плавающей точкой, градиентная заливка, внутренняя поддержка таких графических форматов, как JPEG и PNG, куда лучшая поддержка регионов отсечения с возможностью использовать в них координаты с плавающей точкой (а не 16-битные целые) и применения к ним World Transform, преобразования двумерных матриц и т. п. GDI+ использует ARGB-цвета. Эти возможности используются в пользовательском интерфейсе Windows XP, а их присутствие в базовом графическом слое облегчает использование систем векторной графики, таких как Flash или SVG.
Динамические библиотеки GDI+ могут распространяться вместе с приложениями для использования в предыдущих версиях Windows.
Далее в Window 6.x его проробатывают и заменяют уже на DWM. Почему он > обычных попиксельных выводов на экран? Потому что, чем дальше развивают его возможности, тем глубже он уходит к видеокарте (хорошо бы они сохранили эту традицию). Даже несколько простых, но постоянных прорисовок (анимация кнопок, диалогов и т.п) используя только ресурсы процессора принесут очень не приятную ноту в производительность вашего приложения (а вернее сказать так, лучше никакой графики, чем та что мешает непосредственой работе программы).

Что касается пример, сожалею, но все-таки придется воспользоваться поиском на сайте, ибо "человеко-подобных" примеров у меня сейчас нет. На моей памяти было несколько подобных тем, да и мануалы еще никто не отменял.

Добавлено через 3 минуты
ps. и меня терзают крайние сомнения, что описанное мной как-то относится к исходному сабжу, во всяком случае, мне не понятно, что вы точно хотели сказать под "выделение в стиле xp".
1
11 / 11 / 1
Регистрация: 01.12.2011
Сообщений: 162
Записей в блоге: 2
05.02.2012, 16:53  [ТС]
DefineTrueFalse, Огромное спасибо за ответы, постараюсь дальше развивать .
0
11 / 11 / 1
Регистрация: 01.12.2011
Сообщений: 162
Записей в блоге: 2
05.02.2012, 17:24  [ТС]
мне не понятно, что вы точно хотели сказать под "выделение в стиле xp"

Под выделением я имел ввиду вот что (смотреть 1.jpg). Есть на форме Image в котором загружено изображение, мышью выделяется часть изображения для снятия координат для дальнейшей работы, программа уже работает как нужно, мышью выделяется всё правильно, при отпуске кнопки мыши строится прямоугольник выделенной области, всё замечательно. Одно но! Во время движения мыши выделение происходит в слепую, то есть нет того самого прямоугольника который показывал бы область выделения подобный на 1.jpg. Согласитесь, неудобно .

DrawFocusRect выкинул сразу, не понравился.
Миниатюры
Выделение в стиле XP  
1
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
05.02.2012, 18:10
C++
1
Canvas->Rectangle(координаты,курсора,манипулятора,крыса);
или
C++
1
LineTo(), MoveTo()
в таймере при зажатой ЛКМ.
Краткое руководство по работе с классом TCanvas для начинающих
1
11 / 11 / 1
Регистрация: 01.12.2011
Сообщений: 162
Записей в блоге: 2
05.02.2012, 18:34  [ТС]
LK, Я так и сделал при помощи Rectangle, но за движением мышью прямоугольники рисуются, и чтобы удалять старые очищаю Image. Но это сильно нагружает комп, поэтому ищу альтернативу.
Полный код программы можно посмотреть тут.
0
11 / 11 / 1
Регистрация: 01.12.2011
Сообщений: 162
Записей в блоге: 2
05.02.2012, 18:39  [ТС]
Немного оптимизировал код: теперь перерисовка Image происходит только в том случае когда прямоугольная область выделения изменяется. Сделал для изображения, сетки и области выделения отдельные Image. Теперь перерисовка происходит не изображения, а только выделяющей прямоугольной области. Изображение и сетка как стоят так и стоят.
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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1_PPI.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
TImage * Pict = new TImage(Form1);
TImage * Setka = new TImage(Form1);
int  RectX0,RectY0,RectX0Nrm,RectY0Nrm,RectX0Rev,RectY0Rev,RectX1,RectY1;
int  kletX,kletY,PredelX,PredelY,RectX1old,RectY1old;
bool vibor;
div_t z;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::FormCreate(TObject *Sender)
{
 
//Загружаем bmp изображения, подгоняем размеры в конце удалим - зачем память нагружать
//Image1->Parent=ScrollBox1;
 Pict->AutoSize = true;
 //Setka->AutoSize = true;
 Pict->Picture->LoadFromFile("C:\\ui_icon_equipment.bmp");
 //Setka->Canvas->Brush->Color=RGB(255,255,255);
 //Setka->Canvas->Rectangle(0,0,Pict->Width,Pict->Height);
 Image1->Width=Pict->Width;
 Image1->Height=Pict->Height;
 Image1->Canvas->CopyRect(Image1->ClientRect, Pict->Canvas,
        Rect(0,0,Image1->Width,Image1->Height));
 Pict->Picture = NULL;
 //delete Pict;
 
//Image2 это сетка, сделал отдельно, от картинки
 Image2->Width=Image1->Width;
 Image2->Height=Image1->Height;
 Image3->Width=Image1->Width;
 Image3->Height=Image1->Height;
// Image2->Canvas->Brush->Color=RGB(255,255,255);
// Image2->Canvas->Rectangle(0,0,Pict->Width,Pict->Height);
 
//Сетка не хотела становиться прозрачно, поэтому сделал такой фокус: закрасил
//белым прямоугольником а потом сделал прозрачность по белому цвету
// Setka->Canvas->Brush->Color=RGB(255,255,255);
 
//Image3 для показа выделения, загрузился сначала на всю картинку
//после работаем мышью изменяя размеры этого прямоугольника
//тем самым получается эффект выделения
 //Image3->Canvas->Brush->Color=RGB(255,255,255);
 Image3->Canvas->Rectangle(0,0,Image1->Width,Image1->Height);
 //Image3->Canvas->Brush->Color=RGB(50,100,120);
 //Image3->Canvas->Brush->Style=bsBDiagonal;//bsDiagCross;
 //Image3->Canvas->Rectangle(0,0,Pict->Width,Pict->Height);
 //Image3->Picture->Bitmap->TransparentColor=RGB(255,255,255);
 Pict->Canvas->Rectangle(0,0,Image1->Width,Image1->Height);
 Image3->Picture->Bitmap->TransparentColor=RGB(255,255,255);
 
 DoubleBuffered=1;
 
//Построим сетку
Button1Click(NULL);
 
//Теперь Image3 прозрачим
     /*BLENDFUNCTION blend;
     blend.BlendOp = AC_SRC_OVER;
     blend.BlendFlags = 0;
     blend.AlphaFormat = 0;
     blend.SourceConstantAlpha = 150;//blend
     ::AlphaBlend(Image1->Canvas->Handle,Image3->Left,Image3->Top,
     Image3->Width,Image3->Height,Image3->Canvas->Handle,0,0,
     Image3->Width,Image3->Height,blend);
     //Image3->Hide();
     Image1->Repaint();*/ //Блин вот с этим не получилось. Жалко.
                //Эффектно смотрится, изменять размеры не получается.
                        //Сделаю по старому.
     //Image3->Width=0;
     //Image3->Height=0;
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 Image3->Canvas->CopyRect(Image3->ClientRect, Pict->Canvas,
        Rect(0,0,Image1->Width,Image1->Height));
 
int koefX,koefY;
kletX=StrToInt(Edit1->Text);
kletY=StrToInt(Edit2->Text);
 Setka->Width=Image1->Width;
 Setka->Height=Image1->Height;
 Setka->Canvas->Rectangle(0,0,Pict->Width,Pict->Height);
 
 
 //Так, делаем линиями сетку
Setka->Canvas->Pen->Color=RGB(181,197,156);//-зелёный, (167,52,52) - красный
//Через каждые kletX и kletY пикселей, т.е клетка kletX на kletY
 
//Расчитаем предел
z=div (Image1->Width,kletX);
PredelX=kletX*z.quot;
z=div (Image1->Height,kletY);
PredelY=kletY*z.quot;
 
koefX=kletX;
koefY=kletY;
//Делаем пока изображение не кончится
while (koefX<=PredelX)
{
Setka->Canvas->MoveTo(koefX,0);
Setka->Canvas->LineTo(koefX,PredelY);
koefX=koefX+kletX;
}
while (koefY<=PredelY)
{
Setka->Canvas->MoveTo(0,koefY);
Setka->Canvas->LineTo(PredelX,koefY);
koefY=koefY+kletY;
}
//Грузим сетку для показа в Image2
Image2->Canvas->CopyRect(Image2->ClientRect, Setka->Canvas,
        Rect(0,0,Image1->Width,Image1->Height));
//Очистим
Setka->Picture = NULL;
//И делаем прозрачной
Image2->Picture->Bitmap->TransparentColor=RGB(255,255,255);
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Image1MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift,
          int X, int Y)
{
if (Button==mbLeft) {
 Image3->Canvas->CopyRect(Image3->ClientRect, Pict->Canvas,
        Rect(0,0,Image1->Width,Image1->Height));
if (X<PredelX && Y<PredelY) {
vibor=1;
//Image3->Picture = NULL;
//Image1->Canvas->CopyRect(Image1->ClientRect, Pict->Canvas,
//        Rect(0,0,Pict->Width,Pict->Height));
 
z=div (X,kletX);
RectX0Nrm=kletX*z.quot;
RectX0Rev=kletX*(z.quot+1);
z=div (Y,kletY);
RectY0Nrm=kletY*z.quot;
RectY0Rev=kletY*(z.quot+1);
RectX1old=-1;
RectY1old=-1;
 
//Image3->Canvas->Pen->Color=clSkyBlue;//(167,52,52) - красный
//Image3->Canvas->Brush->Color=RGB(23,40,60);//(12,40,71);//clSkyBlue;
//Image3->Canvas->Pen->Width=2;
//Image3->Canvas->Brush->Style=bsBDiagonal;//bsClear;//bsDiagCross;
}
}
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Image1MouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift,
          int X, int Y)
{
 
if (Button == mbLeft)
{
vibor=0;
/*
 
z=div (X,50);
if (X>RectX0){
RectX1=50*(z.quot+1);
}
else if(X<RectX0){
RectX0=RectX0Rev;
RectX1=50*z.quot;
}
 
z=div (Y,50);
if (Y>RectY0){
RectY1=50*(z.quot+1);
}
else if(Y<RectY0){
RectY0=RectY0Rev;
RectY1=50*z.quot;
}
 
Image1->Canvas->CopyRect(Image1->ClientRect, Pict->Canvas,
        Rect(0,0,Pict->Width,Pict->Height));
Image1->Canvas->RoundRect(RectX0,RectY0,RectX1,RectY1,5,5);//Rectangle(RectX0,RectY0,X,Y); RoundRect
*/
}
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Image1MouseMove(TObject *Sender, TShiftState Shift, int X,
          int Y)
{
if(vibor){
//Image1->Canvas->DrawFocusRect(TRect(RectX0,RectY0,X,Y));
 
 
if (X<PredelX) {
z=div (X,kletX);
if (X>RectX0){
RectX0=RectX0Nrm;
RectX1=kletX*(z.quot+1);
}
else if(X<RectX0){
RectX0=RectX0Rev;
RectX1=kletX*z.quot;
}
}
 
if (Y<PredelY) {
z=div (Y,kletY);
if (Y>RectY0){
RectY0=RectY0Nrm;
RectY1=kletY*(z.quot+1);
}
else if(Y<RectY0){
RectY0=RectY0Rev;
RectY1=kletY*z.quot;
}
}
 
 
if (RectX1old!=RectX1 || RectY1old!=RectY1) {
//zX=div (X,50);
//RectX0=50*zX.quot;
//zY=div (Y,50);
//RectY0=50*zY.quot;
//zX=div (X,50);
//RectX1=50*(zX.quot+1);
//zY=div (Y,50);
//RectY1=50*(zY.quot+1);
 
//Image1->Canvas->CopyRect(Image1->ClientRect, Pict->Canvas,
        //Rect(0,0,Pict->Width,Pict->Height));
Image3->Canvas->Pen->Color=clSkyBlue;//(167,52,52) - красный
Image3->Canvas->Brush->Color=RGB(23,40,60);//(12,40,71);//clSkyBlue;
Image3->Canvas->Pen->Width=2;
Image3->Canvas->Brush->Style=bsBDiagonal;//bsBDiagonal;//bsClear;//bsDiagCross;
 
 Image3->Canvas->CopyRect(Image3->ClientRect, Pict->Canvas,
        Rect(0,0,Image1->Width,Image1->Height));
 
Image3->Canvas->RoundRect(RectX0,RectY0,RectX1,RectY1,10,10);//Rectangle(RectX0,RectY0,X,Y); RoundRect
//Image3->Canvas->DrawFocusRect(R);
RectX1old=RectX1;
RectY1old=RectY1;
}
}
//Image3->Left=RectX0;
//Image3->Top=RectY0;
//Image3->Width=RectX1-RectX0;
//Image3->Height=RectY1-RectY0;
//}
}
//---------------------------------------------------------------------------
0
11 / 11 / 1
Регистрация: 01.12.2011
Сообщений: 162
Записей в блоге: 2
08.02.2012, 19:48  [ТС]
LK, По твоему совету сделал через таймер. Это как предел нагрузки на ЦП получился .
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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1_PPI.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
TImage * Pict = new TImage(Form1);
TImage * Setka = new TImage(Form1);
int  RectX0,RectY0,RectX0Nrm,RectY0Nrm,RectX0Rev,RectY0Rev,RectX1,RectY1,RectX1old,RectY1old;
int  kletX,kletY,PredelX,PredelY,MX0,MY0;
bool vibor;
div_t z;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Image3->Picture = NULL;
 
Image3->Canvas->CopyRect(Image3->ClientRect, Pict->Canvas,
       Rect(0,0,Image1->Width,Image1->Height));
Image3->Picture->Bitmap->TransparentColor=RGB(255,255,255);
 
int koefX,koefY;
kletX=StrToInt(Edit1->Text);
kletY=StrToInt(Edit2->Text);
 Setka->Width=Image1->Width;
 Setka->Height=Image1->Height;
 Setka->Canvas->Rectangle(0,0,Pict->Width,Pict->Height);
 
 
 //Так, делаем линиями сетку
Setka->Canvas->Pen->Color=RGB(181,197,156);//-зелёный, (167,52,52) - красный
//Через каждые kletX и kletY пикселей, т.е клетка kletX на kletY
 
//Расчитаем предел
z=div (Image1->Width,kletX);
PredelX=kletX*z.quot;
z=div (Image1->Height,kletY);
PredelY=kletY*z.quot;
 
koefX=kletX;
koefY=kletY;
//Делаем пока изображение не кончится
while (koefX<=PredelX)
{
Setka->Canvas->MoveTo(koefX,0);
Setka->Canvas->LineTo(koefX,PredelY);
koefX=koefX+kletX;
}
while (koefY<=PredelY)
{
Setka->Canvas->MoveTo(0,koefY);
Setka->Canvas->LineTo(PredelX,koefY);
koefY=koefY+kletY;
}
//Грузим сетку для показа в Image2
Image2->Canvas->CopyRect(Image2->ClientRect, Setka->Canvas,
        Rect(0,0,Image1->Width,Image1->Height));
//Делаем прозрачной
Image2->Picture->Bitmap->TransparentColor=RGB(255,255,255);
CheckBox1->Checked=true;
//И очистим
Setka->Picture = NULL;
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Image1MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift,
          int X, int Y)
{
if (Button==mbLeft) {
MX0=X;
MY0=Y;
//Освободим оперативную память
Image3->Picture = NULL;
 
 
Image3->Canvas->CopyRect(Image3->ClientRect, Pict->Canvas,
       Rect(0,0,Image1->Width,Image1->Height));
Image3->Picture->Bitmap->TransparentColor=RGB(255,255,255);
 
if (X<PredelX && Y<PredelY && X>0 && Y>0) {
vibor=1;
//Image3->Visible=true;
//Image3->Picture = NULL;
//Image1->Canvas->CopyRect(Image1->ClientRect, Pict->Canvas,
//        Rect(0,0,Pict->Width,Pict->Height));
 
z=div (X,kletX);
RectX0Nrm=kletX*z.quot;
RectX0Rev=kletX*(z.quot+1);
z=div (Y,kletY);
RectY0Nrm=kletY*z.quot;
RectY0Rev=kletY*(z.quot+1);
RectX1old=-1;
RectY1old=-1;
 
//Image3->Canvas->Pen->Color=clSkyBlue;//(167,52,52) - красный
//Image3->Canvas->Brush->Color=RGB(23,40,60);//(12,40,71);//clSkyBlue;
//Image3->Canvas->Pen->Width=2;
//Image3->Canvas->Brush->Style=bsBDiagonal;//bsClear;//bsDiagCross;
}
}
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Image1MouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift,
          int X, int Y)
{
 
if (Button==mbLeft)
{
vibor=0;
 
/*if (MX0==X && MY0==Y) {
Image3->Picture = NULL;
Image3->Canvas->CopyRect(Image3->ClientRect, Pict->Canvas,
       Rect(0,0,Image1->Width,Image1->Height));
Image3->Picture->Bitmap->TransparentColor=RGB(255,255,255);
}*/
 
 
if (RectX1<RectX0) {
RectX1=(RectX0-RectX1)/kletX;
}
else {
RectX1=(RectX1-RectX0)/kletX;
}
if (RectY1<RectY0) {
RectY1=(RectY0-RectY1)/kletY;
}
else {
RectY1=(RectY1-RectY0)/kletY;
}
if (RectX0>X) {
z=div (X,kletX);
RectX0=z.quot;
}
else {
RectX0=RectX0/kletX;
}
if (RectY0>Y) {
z=div (Y,kletY);
RectY0=z.quot;
}
else {
RectY0=RectY0/kletY;
}
 
Memo1->Lines->Strings[0]="inv_grid_width = " + IntToStr(RectX1);
Memo1->Lines->Strings[1]="inv_grid_height = " + IntToStr(RectY1);
Memo1->Lines->Strings[2]="inv_grid_x = " + IntToStr(RectX0);
Memo1->Lines->Strings[3]="inv_grid_y = " + IntToStr(RectY0);
 
RectX0=0;
RectY0=0;
RectX1=0;
RectY1=0;
//Image3->Visible=false;
 
/*
if (X<PredelX) {
z=div (X,kletX);
if (X>RectX0){
RectX0=RectX0Nrm;
RectX1=kletX*(z.quot+1);
}
else if(X<RectX0){
RectX0=RectX0Rev;
RectX1=kletX*z.quot;
}
}
 
if (Y<PredelY) {
z=div (Y,kletY);
if (Y>RectY0){
RectY0=RectY0Nrm;
RectY1=kletY*(z.quot+1);
}
else if(Y<RectY0){
RectY0=RectY0Rev;
RectY1=kletY*z.quot;
}
}
 
 
if (RectX1old!=RectX1 || RectY1old!=RectY1) {
//zX=div (X,50);
//RectX0=50*zX.quot;
//zY=div (Y,50);
//RectY0=50*zY.quot;
//zX=div (X,50);
//RectX1=50*(zX.quot+1);
//zY=div (Y,50);
//RectY1=50*(zY.quot+1);
 
//Image1->Canvas->CopyRect(Image1->ClientRect, Pict->Canvas,
        //Rect(0,0,Pict->Width,Pict->Height));
Image3->Canvas->Pen->Color=clSkyBlue;//(167,52,52) - красный
Image3->Canvas->Brush->Color=RGB(23,40,60);//(12,40,71);//clSkyBlue;
Image3->Canvas->Pen->Width=2;
Image3->Canvas->Brush->Style=bsBDiagonal;//bsBDiagonal;//bsClear;//bsDiagCross;
 
 Image3->Canvas->CopyRect(Image3->ClientRect, Pict->Canvas,
        Rect(0,0,Image1->Width,Image1->Height));
 
Image3->Canvas->RoundRect(RectX0,RectY0,RectX1,RectY1,10,10);//Rectangle(RectX0,RectY0,X,Y); RoundRect
//Image3->Canvas->DrawFocusRect(R);
RectX1old=RectX1;
RectY1old=RectY1;
}
}
//Image3->Left=RectX0;
//Image3->Top=RectY0;
//Image3->Width=RectX1-RectX0;
//Image3->Height=RectY1-RectY0;
//}
*/
}
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Image1MouseMove(TObject *Sender, TShiftState Shift, int X,
          int Y)
{
if(vibor){
//Image1->Canvas->DrawFocusRect(TRect(RectX0,RectY0,X,Y));
 
 
if (X<PredelX && X>0) {
z=div (X,kletX);
if (X>RectX0){
RectX0=RectX0Nrm;
RectX1=kletX*(z.quot+1);
}
else if(X<RectX0){
RectX0=RectX0Rev;
RectX1=kletX*z.quot;
}
}
 
if (Y<PredelY && Y>0) {
z=div (Y,kletY);
if (Y>RectY0){
RectY0=RectY0Nrm;
RectY1=kletY*(z.quot+1);
}
else if(Y<RectY0){
RectY0=RectY0Rev;
RectY1=kletY*z.quot;
}
}
 
 
            /*if (RectX1old!=RectX1 || RectY1old!=RectY1) {
            //zX=div (X,50);
            //RectX0=50*zX.quot;
            //zY=div (Y,50);
            //RectY0=50*zY.quot;
            //zX=div (X,50);
            //RectX1=50*(zX.quot+1);
            //zY=div (Y,50);
            //RectY1=50*(zY.quot+1);
 
            //Image1->Canvas->CopyRect(Image1->ClientRect, Pict->Canvas,
                    //Rect(0,0,Pict->Width,Pict->Height));
            Image3->Canvas->Pen->Color=clSkyBlue;//(167,52,52) - красный
            Image3->Canvas->Brush->Color=RGB(23,40,60);//(12,40,71);//clSkyBlue;
            Image3->Canvas->Pen->Width=2;
            Image3->Canvas->Brush->Style=bsBDiagonal;//bsBDiagonal;//bsClear;//bsDiagCross;
 
             Image3->Canvas->CopyRect(Image3->ClientRect, Pict->Canvas,
                    Rect(0,0,Image1->Width,Image1->Height));
 
 
            //Image3->Left=RectX0+1;
            //Image3->Top=RectY0+1;
            //Image3->Width=(RectX1-RectX0)-1;
            //Image3->Height=(RectY1-RectY0)-1;
 
 
            Image3->Canvas->RoundRect(RectX0,RectY0,RectX1,RectY1,10,10);//Rectangle(RectX0,RectY0,X,Y); RoundRect
            //Image3->Canvas->DrawFocusRect(R);
            RectX1old=RectX1;
            RectY1old=RectY1;
            }*/
}
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
if (vibor) {
if (RectX1old!=RectX1 || RectY1old!=RectY1) {
//zX=div (X,50);
//RectX0=50*zX.quot;
//zY=div (Y,50);
//RectY0=50*zY.quot;
//zX=div (X,50);
//RectX1=50*(zX.quot+1);
//zY=div (Y,50);
//RectY1=50*(zY.quot+1);
 
//Image1->Canvas->CopyRect(Image1->ClientRect, Pict->Canvas,
        //Rect(0,0,Pict->Width,Pict->Height));
Image3->Canvas->Pen->Color=clSkyBlue;//(167,52,52) - красный
Image3->Canvas->Brush->Color=RGB(23,40,60);//(12,40,71);//clSkyBlue;
Image3->Canvas->Pen->Width=2;
Image3->Canvas->Brush->Style=bsBDiagonal;//bsBDiagonal;//bsClear;//bsDiagCross;
 
 Image3->Canvas->CopyRect(Image3->ClientRect, Pict->Canvas,
        Rect(0,0,Image1->Width,Image1->Height));
 
 
//Image3->Left=RectX0+1;
//Image3->Top=RectY0+1;
//Image3->Width=(RectX1-RectX0)-1;
//Image3->Height=(RectY1-RectY0)-1;
 
 
Image3->Canvas->RoundRect(RectX0,RectY0,RectX1,RectY1,10,10);//Rectangle(RectX0,RectY0,X,Y); RoundRect
//Image3->Canvas->DrawFocusRect(R);
RectX1old=RectX1;
RectY1old=RectY1;
}
}
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::CheckBox1Click(TObject *Sender)
{
  if(CheckBox1->Checked)
  {
    Image2->Visible=true;
  }
  else
  {
    Image2->Visible=false;
  }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::N5Click(TObject *Sender)
{
    MessageDlg("Автор Starter АМК Форум\n"
                   "ICQ 498104769\n"
                   "Skype starter19861\n"
                   "Email [email]starter1986@yandex.ru[/email]\n"
                   "2012",
        mtInformation, TMsgDlgButtons() << mbOK, 0);
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::N2Click(TObject *Sender)
{
if (OpenDialog1->Execute()) {
//Тут чистим предыдущие
Image1->Picture = NULL;
Image2->Picture = NULL;
Image3->Picture = NULL;
Pict->Picture = NULL;
Setka->Picture = NULL;
 
//Включение органов управления
Image1->Enabled=true;
Image2->Enabled=true;
Image3->Enabled=true;
Edit1->Enabled=true;
Edit2->Enabled=true;
CheckBox1->Enabled=true;
Button1->Enabled=true;
Memo1->Enabled=true;
 
 
//Загружаем bmp изображения, подгоняем размеры в конце удалим - зачем память нагружать
//Image1->Parent=ScrollBox1;
 Pict->AutoSize = true;
 //Setka->AutoSize = true;
 Pict->Picture->LoadFromFile(OpenDialog1->FileName);
 //Pict->Picture->LoadFromFile("C:\\ui_icon_equipment.bmp");
 //Setka->Canvas->Brush->Color=RGB(255,255,255);
 //Setka->Canvas->Rectangle(0,0,Pict->Width,Pict->Height);
 Image1->Width=Pict->Width;
 Image1->Height=Pict->Height;
 Image1->Canvas->CopyRect(Image1->ClientRect, Pict->Canvas,
        Rect(0,0,Image1->Width,Image1->Height));
 Pict->Picture = NULL;
 //delete Pict;
 
//Image2 это сетка, сделал отдельно, от картинки
 Image2->Width=Image1->Width;
 Image2->Height=Image1->Height;
 Image3->Width=Image1->Width;
 Image3->Height=Image1->Height;
// Image2->Canvas->Brush->Color=RGB(255,255,255);
// Image2->Canvas->Rectangle(0,0,Pict->Width,Pict->Height);
 
//Сетка не хотела становиться прозрачно, поэтому сделал такой фокус: закрасил
//белым прямоугольником а потом сделал прозрачность по белому цвету
// Setka->Canvas->Brush->Color=RGB(255,255,255);
 
//Image3 для показа выделения, загрузился сначала на всю картинку
//после работаем мышью изменяя размеры этого прямоугольника
//тем самым получается эффект выделения
 Image3->Canvas->Brush->Color=RGB(255,255,255);
 Image3->Canvas->Rectangle(0,0,Image1->Width,Image1->Height);
//Image3->Canvas->Brush->Color=RGB(23,40,60);//(12,40,71);//clSkyBlue;
//Image3->Canvas->Brush->Style=bsBDiagonal;//bsBDiagonal;//bsClear;//bsDiagCross;
//Image3->Canvas->Rectangle(0,0,Image1->Width,Image1->Height);
 //Image3->Canvas->Brush->Color=RGB(50,100,120);
 //Image3->Canvas->Brush->Style=bsBDiagonal;//bsDiagCross;
 //Image3->Canvas->Rectangle(0,0,Pict->Width,Pict->Height);
 //Image3->Picture->Bitmap->TransparentColor=RGB(255,255,255);
 Pict->Canvas->Rectangle(0,0,Image1->Width,Image1->Height);
 Image3->Picture->Bitmap->TransparentColor=RGB(255,255,255);
 
 DoubleBuffered=1;
 
//Построим сетку
//Button1Click(NULL);
Button1->OnClick(Button1);
 
//Теперь Image3 прозрачим
     /*BLENDFUNCTION blend;
     blend.BlendOp = AC_SRC_OVER;
     blend.BlendFlags = 0;
     blend.AlphaFormat = 0;
     blend.SourceConstantAlpha = 150;//blend
     ::AlphaBlend(Image1->Canvas->Handle,Image3->Left,Image3->Top,
     Image3->Width,Image3->Height,Image3->Canvas->Handle,0,0,
     Image3->Width,Image3->Height,blend);
     //Image3->Hide();
     Image1->Repaint();*/ //Блин вот с этим не получилось. Жалко.
                //Эффектно смотрится, изменять размеры не получается.
                        //Сделаю по старому.
     //Image3->Width=0;
     //Image3->Height=0;
}
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::N3Click(TObject *Sender)
{
Close();
}
//---------------------------------------------------------------------------
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
08.02.2012, 19:48
Помогаю со студенческими работами здесь

Как на cellclick сделать выделение только строки, а выделение столбца отменить
Здравствуйте, проблема такая, программа работает отлично, но я занимаюсь сопровождением ПО. И при выделении строки все хорошо, а при...

Как поменять выделение некоторых слов курсивом на жирное выделение
Здравствуйте. Есть вордовский документ состоящий из 1100 страниц.Подскажите пожалуйста как во всем документе заменить выделение курсивом...

Что за строчка кода будет означать выделение теста или выделение абзаца в котором находится курсор?
Что за строчка кода будет означать выделение теста или выделение абзаца в котором находится курсор

Выделение несмежных столбцов через равные промежутки, выделение столбцов с числами. И их форматирование (ширина и проч)
Добрый день, форумчане! Прошу вашей помощи: Сейчас с помощью макроса привожу в надлежащий вид набор данных, сформировав из них...

Прерывания в стиле С++
Решил побаловаться и попробовать написать чего-нибудь на С++ под stm32. Чисто ради любопытства, накорябал класс Led (хотя наверное можно...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru