C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Сохранение цвета,  — Опять этот StringGrid -
Aptem
  Отправлено: 31.08.2003, 04:55


Мастер участка

Группа: Участник
Сообщений: 349



Привет, народ !
Я уже наверное достал всех своим гридом, но все-таки у меня опять проблема. Помогите...

Я меняю стиль и цвет текста одной из ячеек грида с помощью:
CODE

void TForm1::PaintCell ( int ACol, int ARow, TColor Color )
{
 TRect Coordinates;

 Coordinates = StringGrid6 -> CellRect ( ACol, ARow );

 StringGrid6 -> Canvas -> Font -> Color = Color;
 StringGrid6 -> Canvas -> Font -> Style = TFontStyles () << fsBold;
 StringGrid6 -> Canvas -> TextOut ( Coordinates.Left, Coordinates.Top, WideString ( StringGrid6 -> Cells[ACol][ARow] ) );
}


Все получается как надо, однако, предположим у меня запущено два приложения: моя прога и допустим FAR. Если раскрашу ячейку, а затем сделаю активным окно FAR'а, так, чтобы оно закрыло мою прогу, то после того, как я активизирую мое окно сново, то вся раскраска пропадает. Как сохранить раскраску ячейки?

Надеюсь все понятно.

Спасибо за внимание !!!
Георгий
Отправлено: 31.08.2003, 11:38


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



рисовать то надо в onDrawCell, а ты рисуешь непойми где — вот стандартный обработчик перерисовки и раскрасил всё по стандартному...
Aptem
Отправлено: 31.08.2003, 13:39


Мастер участка

Группа: Участник
Сообщений: 349



А если я хочу по нажатию кнопки раскрашивать?
Георгий
Отправлено: 31.08.2003, 14:16


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



Хорошее желание!
я вроде готов снова нести свет в массы
небольшая экскурсия в GUI:
1. ОС глубоко безразлично, что рисуется в отведённом приложению окне
2. приложению глубоко безразлично где расположено его окно и на каком физическом устройстве
3. "благодаря" пунктам №1 и № 2 при перекрытии нашего окна чужим окном — мы:
3.1 этот факт (перекрытие нашего окна) не узнаем
3.2 все наши попытки что-либо нарисовать в перекрытой области фактически будут проигнорированы (тут могут быть вариации с учётом аппаратной реализации устройства отображения)
4. когда перекрытие нашего окна чужим окном прекращено (что собственно ты и описываешь) есть несколько очевидных способов восстановления собержимого экранной области, с учётом того, что сейчас должно быть видно содержилое нашего окна:
4.1 перекрытые области памяти ОС сохраняет у себя и, по мере необходимости, сама восстанавливает содержимое окна. Минусы — жрёт много памяти
4.2 ОС "говорит" окну — перерисуй такой-то кусок. Минусы — в приложении должна быль логика, обрабатывающая эту ситуацию
5. т.к. речь идёт не об абстрактном GUI, то в MS Windows реализован именно пункт №4.2

Выводы — рисовать на канве ты можешьчто тебе угодно, но, когда твоё окно будет показано из-под другого окна, то будет нарисовано именно то, что нарисует обработчик сообщения ОС WM_PAINT, а так как ты TStringGrid`у не говоришь, что у тебя есть представления о внешнем виде TStringGrid`а, отличные от стандартных, то он рисует стандартный внешний вид.

Мораль сей басни такова — рисуй в OnDrawCell и перерисовывай вызывая метод Repaint.

А как как внешний вид у тебя задаёт пользователь,то придётся все его пожелания по раскраске где-то хранить (массив описаний форматов ячеек) и при перерисовке учитывать то, что в этом массиве указано.
Aptem
Отправлено: 01.09.2003, 03:58


Мастер участка

Группа: Участник
Сообщений: 349



Какую хорошую философскую базу Вы подвели, Георгий !

Спасибо за ответ!
Георгий
Отправлено: 02.09.2003, 07:46


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



Философия, не философия, но я заметил, что если к решению задачи подходить комплексно — разобраться что надо, какие средства есть, почему именно такие средства и алгоритмы, то задача решается сама собой.

Вернуться в Вопросы программирования в C++Builder