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

Обрезание TRect при рисовании TStringGrid

25.05.2013, 15:33. Показов 4146. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет.
Хочу сделать свой компонент на основе стандартного ТStringGrid для отрисовки объединенных ячеек.
То-есть переделываю только методы прорисовки.
Сделал свои функции Paint, DrawCells, DrawLines и много мелких побочных функций.
Использую RadStudio XE2. Большую часть кода просто перевел из дельфи в с++ и добавляю обработку объединенных ячеек. Компонент пока умеет рисовать только сетку на основе данных об объединенных ячейках.
Столкнулся с такой проблемой: для объединенной ячейки при попытке нарисовать вместо 2-х ячеек одной-срезается TRect ячейки. тоесть передаю я TRect с координатами объединенной одной большой ячейки, а рисуется только половина.
Смысл объединения такой же как и у ТМС-ов: к главной "базовой" ячейке(ячейка слева или сверху от присоединяемой ячейки, в зависимости от типа присоединения-вертикального или горизонтаольного)
присоединяю ячейку.

Вот функция прорисвки самих ячеек. сетка рисуется норм.
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
void __fastcall TMyStringGrid::DrawCellsEx(TColor FxColor, TColor ClColor,
    TGridRect Sel, DWORD FrameFlags1, DWORD FrameFlags2, TGridDrawInfo DrawInfo) 
{
    TRect AWhere, TempRect;
    TGridDrawState DState;
    bool Focused;
    int yRow,xCol;
    TRect CurCell;
    int deltaX;
    TColor AColor;
    //перенаправление фокусировки на базовую ячейку
    if(!CellProperties[Col][Row]->IsBaseCell)
    {
    TPoint bc=BaseCell(Col,Row);
    Row=bc.Y;
    Col=bc.X;
    }
    for(yRow=0;yRow<RowCount;yRow++)
    {
        for(xCol=0;xCol<ColCount;xCol++)
        {
            if((yRow==0 && FixedCols>0) || (xCol==0 && FixedRows>0))
            {
                DState<<gdFixed;
                AColor=FxColor;
            }
            else
            {
                DState>>gdFixed;
                AColor=ClColor;
            }
            if(CellProperties[xCol][yRow]->IsBaseCell)
            {
                CurCell=CellRect(xCol,yRow);
                if(IsXMergedCell(xCol,yRow))// пока только для горизонтального объединения
                {
                    deltaX=ColWidths[xCol+1]+GridLineWidth; 
                    CurCell.Right+=deltaX;
                    //работаем только с базовой яч.
                    //в Rect базовой добавляем и присоединяемую яч.
                }
                if ((CurCell.Right > CurCell.Left) && RectVisible(Canvas->Handle, &CurCell))
                {
                    if ((xCol == FHotTrackCell.Coord.X) &&
                        (yRow == FHotTrackCell.Coord.Y))
                    {
                        if (Options.Contains(goFixedHotTrack))
                            DState << gdHotTrack;
                        if (FHotTrackCell.Pressed)
                            DState << gdPressed;
                    }
                    Focused = IsActiveControl();
                    if (Focused && (yRow == Row) && (xCol == Col))
                    {
                        SetCaretPos(CurCell.Left, CurCell.Top);
                        DState << gdFocused;
                    }
                    if (PointInGridRect(xCol, yRow, Sel))
                        DState << gdSelected;
                    if (!DState.Contains(gdFocused) ||
                        !Options.Contains(goEditing) ||
                        !EditorMode || ComponentState.Contains(csDesigning))
                    {
                        if (DefaultDrawing ||
                            ComponentState.Contains(csDesigning))
                        {
                            Canvas->Font = this->Font;
                            if (DState.Contains(gdSelected) &&
                                (!DState.Contains(gdFocused) ||
                                (Options.Contains(goDrawFocusSelected) &&
                                Options.Contains(goRowSelect))))
                            {   //рисуем синее выделение
                                Canvas->Brush->Color=clBlue;
                                Canvas->FillRect(CurCell);
                                //DrawCellHighlight(CurCell, DState, xCol, yRow);
                            }else{
                                //рисуем фон ячейки
                                Canvas->Brush->Color=clWhite;
                                Canvas->FillRect(CurCell);
                                //DrawCellBackground(CurCell, AColor, DState, xCol, yRow);
                            }
                        }
                        //выделенный прямоугольник
                        if(DefaultDrawing && !ComponentState.Contains(csDesigning) &&
                            !(TStyleManager::IsCustomStyleActive &&
                            Options.Contains(goDrawFocusSelected)) &&
                            DState.Contains(gdFocused) &&
                            (!Options.Contains(goEditing) &&
                            !Options.Contains(goAlwaysShowEditor)) &&
                            !Options.Contains(goRowSelect))
                        {
                            TempRect = CurCell;
                            if ((FInternalDrawingStyle == gdsThemed) &&
                                (Win32MajorVersion >= 6) &&
                                !TStyleManager::IsCustomStyleActive)
                                InflateRect(TempRect, -1, -1);
                            Canvas->Brush->Style = bsSolid;
                            Canvas->Brush->Color=clRed;
                            if (TStyleManager::IsCustomStyleActive)
                                DrawStyleFocusRect(Canvas->Handle, TempRect);
                            else if (!UseRightToLeftAlignment()){
                                //здесь рисуется рамка выделения
                                bool b=DrawFocusRect(Canvas->Handle, &TempRect);
                                b=b;}//для отладки:)
                            else {
                                AWhere = TempRect;
                                AWhere.Left = TempRect.Right;
                                AWhere.Right = TempRect.Left;
                                DrawFocusRect(Canvas->Handle, &AWhere);
                            }
                        }
                    }
                }
            }
        }
    }
}
Так вызываю 1 раз из TMyStringGrid::Paint
C++
1
DrawCellsEx(LFixedColor,FInternalColor, Sel, FrameFlags1, FrameFlags2, DrawInfo);
пробовал рисовать повторно и присоединяемую яч.-не помогает.
Название: Безымянный.gif
Просмотров: 198

Размер: 15.3 Кб
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
25.05.2013, 15:33
Ответы с готовыми решениями:

Проверка на пересечение ограниченной с двух сторон линии и TRect, многоугольники
Подскажите какими классами и функциями можно создать линию с двумя координатами и проверить ее на...

Error: TopLeft is not a member of TRect
Может кто-нибудь подскажет, как исправить ошибку? class FIGURE:public POSITION { public: ...

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

1
 Аватар для stalkerMpro
1 / 1 / 2
Регистрация: 06.12.2012
Сообщений: 9
27.05.2013, 22:09  [ТС]
Заметил вот что, если форму свернуть-развернуть форма перерисовывается видимо и все становится нормально.
не знаю, правильно ли, я добавил команду перерисовки, и вроде работает
добавил глобальную булеву Repainted и добавил в вышеприведенную функцию после всех циклов
C++
1
2
3
4
5
6
7
if(Repainted)
{
    Repainted=false;
}else{
    Repainted=true;
    Repaint();
}
Подскажите плз, так правильно делать? repaint вроде всю форму перерисовывает а не один мой контрол
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
27.05.2013, 22:09
Помогаю со студенческими работами здесь

C++ MFC-приложение, ошибка при рисовании.
Учусь программировать, изучаю MFC. Решил написать простенькое приложение. Суть в том, чтобы на...

Большое значение при рисовании
Здравствуйте. Программа сервер принимает значения от клиента и сразу их рисует на графике. Значения...

Размытие при рисовании на Канве
Привет! Скажите, а что нужно использовать, чтобы добавить возможностей к рисованию на Канве....

Ошибка при рисовании текста - в XE3 не линкуется метод TCustomStyleServices::DrawText()
#include &lt;System.Types.hpp&gt; #include &lt;Vcl.Themes.hpp&gt;...

Разная толщина линий при рисовании методом DrawLine
Доброго времени суток. Формирую сетку методом DrawLine вот код: const int X_step = 43; const...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru