Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Маштабирование DrawGrid

12K
13 июля 2006 года
@leX
21 / / 14.06.2006
Пишу игру "Жизнь", полем является DrawGrid, ячейки которого заполняются одним или другим цветом с помощью FillRect в OnDrawCell, при маштабировании DawGrid с помощью изменения свойств DrawGrid (DefaultRowHeight и DefaultColWidth) и обновлении DrawGrid местами появляются сбои. Подскажите, пожалуйста, как их избежать. Заранее благодарен.
246
14 июля 2006 года
GIZMO
1.8K / / 30.07.2004
[QUOTE=@leX]Пишу игру "Жизнь", полем является DrawGrid, ячейки которого заполняются одним или другим цветом с помощью FillRect в OnDrawCell, при маштабировании DawGrid с помощью изменения свойств DrawGrid (DefaultRowHeight и DefaultColWidth) и обновлении DrawGrid местами появляются сбои. Подскажите, пожалуйста, как их избежать. Заранее благодарен.[/QUOTE]
Что за сбои? Поясни, пожайлуста. И код неплохо бы приводить, например у меня при изменении вышеуказанных св-в все ок. У тебя DefaultDrawing == true?
12K
14 июля 2006 года
@leX
21 / / 14.06.2006
[QUOTE=GIZMO]Что за сбои? Поясни, пожайлуста. И код неплохо бы приводить, например у меня при изменении вышеуказанных св-в все ок. У тебя DefaultDrawing == true?[/QUOTE]
DefaultDrawing был false, с ним все работало, кроме увеличения и уменьшения (при них некоторые ячейки разваливались на прямоугольники или
наоборот соединялись в большие квадраты и прямоуголиники), после того как поставил DefaultDrawing в true увеличение и уменьшение работает, но после
клика на ячейки квадрат не всегда меняет цвет, а только после увеличения
или уменьшения, попробывал поставить refresh в DrawCell, как будто прога зависает. Вообщем подскажи если можешь.:confused:
 
Код:
void __fastcall TMainForm::VPoleDrawCell(TObject *Sender, int ACol,
      int ARow, TRect &Rect, TGridDrawState State)
{
        if(Pole->IsBusy(ARow,ACol))
            VPole->Canvas->Brush->Color = clGreen;

        else
                VPole->Canvas->Brush->Color = clWhite;
        VPole->Canvas->FillRect(VPole->CellRect(ARow,ACol));
}

Клик обрабатываю с помощью OnMouseUp.
Код:
void __fastcall TMainForm::VPoleMouseUp(TObject *Sender,
      TMouseButton Button, TShiftState Shift, int X, int Y)
                int i,j;
                VPole->MouseToCell(X,Y,i,j);
                if (Pole->IsEmpty(i,j))
                {
                        Pole->SetBusy(i,j);
                        VPole->Canvas->Brush->Color =  clGreen;
                }else{
                        Pole->SetEmpty(i,j);
                        VPole->Canvas->Brush->Color =  clWhite;
                }
                VPole->Canvas->FillRect(VPole->CellRect(i,j));
8.7K
15 июля 2006 года
Rubicon
55 / / 28.10.2005
[QUOTE=@leX]попробывал поставить refresh в DrawCell, как будто прога зависает. [/QUOTE]
Ну естественно, у тебя бесконечная рекурсия получается:
<выдержка из help-а>
void __fastcall Refresh(void);
Description
Call Refresh method to repaint the control immediately.
</выдержка из help-а>
:)
Поставь Refresh() в VPoleMouseUp(...) посде FillRect(...) и все будет хорошо.
12K
15 июля 2006 года
@leX
21 / / 14.06.2006
Вообще, снова попробывал поменять DefaultDrawing на true и поставил Refresh() в VPoleMouseUp после FillRect тут начинается какая-то аномалия, поле у меня квадратное, если щелкаю на ячейке выше главной диагонали она закрашивается и становиться белой при повторном щелчке, вообщем работает нормально, правда мигает сильно, а при щелчке на ячейке ниже главной диагонали, я чейка мигает зеленым цветом и снова становиться белой, а если щелкнуть после этого
на другой клетке, старая снова мигает зеленым, как будто она прорисовывается зеленым, а затем снова белым.
8.7K
16 июля 2006 года
Rubicon
55 / / 28.10.2005
попробуй убрать из MouseUp() FillRect-ы --- изменяй статус поля и обновляй (Refresh), тогда должно перестать мигать (приношу извинения, сразу не сообразил).

Едва ли это изменит картину, но оптимизирует:
в DrawCell
 
Код:
замени
VPole->Canvas->FillRect(VPole->CellRect(ARow,ACol));
на
VPole->Canvas->FillRect(Rect);

он же тебе в параметрах передается.
P.S.: странно, такую же методику использовал ранее (специально нашел старую программку) все прекрасно работало...
12K
16 июля 2006 года
@leX
21 / / 14.06.2006
[QUOTE=Rubicon]попробуй убрать из MouseUp() FillRect-ы --- изменяй статус поля и обновляй (Refresh), тогда должно перестать мигать (приношу извинения, сразу не сообразил).

Едва ли это изменит картину, но оптимизирует:
в DrawCell
 
Код:
замени
VPole->Canvas->FillRect(VPole->CellRect(ARow,ACol));
на
VPole->Canvas->FillRect(Rect);

он же тебе в параметрах передается.
P.S.: странно, такую же методику использовал ранее (специально нашел старую программку) все прекрасно работало...[/QUOTE]

Не совсем тебя понял, если имел ввиду закомментировать FillRect в OnMouseUp и поставить там Refresh, то это ничего не дало все также, мигало. А вот после того как в параметрах заменил VPole->Canvas->FillRect(VPole->CellRect(ARow,ACol)); на VPole->Canvas->FillRect(Rect); пропало мигание! все клетки стали работать как надо (закрашиваться по нажатию то одним то другим цветом) но теперь закрашивается не клетка на которою нажал, а клетка симметричная ее относительно главной диагонали!:o Вообщем полтергейст какой-то.
Если есть время могу выслать исходники посмотреть.
12K
16 июля 2006 года
@leX
21 / / 14.06.2006
Кстати Refresh все-таки помог без него не выделяется.
12K
16 июля 2006 года
@leX
21 / / 14.06.2006
Спасибо, все работает, я извиняюсь, сам виноват в DrawCel при проверки на занятость поля перепутал местами ARow и ACol, сколько ни смотрел не замечал.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог