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
|
Философия, не философия, но я заметил, что если к решению задачи подходить комплексно — разобраться что надо, какие средства есть, почему именно такие средства и алгоритмы, то задача решается сама собой. |
|
|