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

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

25.05.2013, 15:33. Показов 4162. Ответов 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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru