Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 2 170

/ вопрос открыт /

Здравствуйте, уважаемые эксперты!
помогите разобраться, рисую средствами апи, но неполучается, отрисовать все в начальный момент запуска программы, В событии Формы.онShow функция отрисовки выполняется но на устройство контекстное недоходит.

Заставьте это работать чтобы после запуска программы отрисовывалось нормально,
сейчас отрисовка только после изменений параметров(манипуляций на форме)
всё в аттаче. заранее спасибо, гугл непомог((

К вопросу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки вопроса)

Приложение:
  1. begin
  2. dc:=GetDC(panel1.Handle);
  3. center.x:=panel1.Width div 2;
  4. center.y:=panel1.Height div 2;
  5.  
  6. RotatePoint(points1,center,2,a1);
  7. RotatePoint(points2,center,2,a2);
  8.  
  9. // double buffer
  10. hdcMem := CreateCompatibleDC(dc);
  11. hbmMem := CreateCompatibleBitmap(dc, panel1.Width,panel1.Height);
  12. hOld := SelectObject(hdcMem, hbmMem);
  13. ...


[Mazzay] Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: [Mazzay] (статус: Посетитель)
Вопрос отправлен: 7 декабря 2008, 13:23
Состояние вопроса: открыт, ответов: 2.

Ответ #1. Отвечает эксперт: Вадим К

Здравствуйте, [Mazzay]!
Рекомендую попробовать рисовать в OnPaint. Этот метод будет вызываться тогда, когда форму надо перерисовать. А вы себе берёте и рисуете, что надо.
Правильный подход обычно такой - все расчёты делаете в своих процедурах, а в OnPaint используя расчеты, быстренько отрисовываете. И не надо будет пользоваться АПИ функциями - всё будет рисоваться очень быстро. Если же надо рисовать в динамике (типа примитивного слайдшоу), то просто ставим таймер, куда вставляем Repaint/Refresh/Invalidate. И всё.

Ответ отправил: Вадим К (статус: Академик)
Время отправки: 7 декабря 2008, 13:57
Оценка за ответ: 4

Комментарий к оценке: спасибо но использование API обязательно.

Ответ #2. Отвечает эксперт: Amidamaru

Здравствуйте, [Mazzay]!
Попробуйте создать событие "после OnShow", т.к. событие OnShow происходит до отрисовки формы (т.е. форма ещё невидима).
Укажите константу сообщения в interface (см Приложение);
Создайте прцедуру обработки этого сообщения в форме;
И затем в OnShow используйте PostMessage для отправки этого сообщения форме.

Т.к. PostMessage возвращается не дожидаясь обработки сообщения, то сообщение будет обработано только после завершения OnShow и отображения формы.

Приложение:
  1. ...
  2.  
  3. interface
  4.  
  5. uses
  6. ...
  7.  
  8. const
  9.  
  10.  
  11. type
  12. T{FormName} = class(TForm)
  13. ...
  14. privare
  15. procedure AfterShow(var A:TMessage);message WM_AfterShow;
  16. ...
  17.  
  18. implementation
  19.  
  20. ...
  21.  
  22. procedure T{FormName}.AfterShow(var A:TMessage);
  23. begin
  24.  
  25. end;
  26.  
  27. procedure T{FormName}.OnShow(Sender: TObject);
  28. begin
  29. PostMessage(Handle, WM_AfterShow, 0, 0);
  30. end;
  31.  
  32. ...
  33.  
  34. end.


Ответ отправил: Amidamaru (статус: 4-ый класс)
Время отправки: 7 декабря 2008, 14:08
Оценка за ответ: 3

Комментарий к оценке: порядок событий при создании формы
OnCreate -> OnShow -> OnActivate -> OnPaint -> OnResize -> OnPaint


Мини-форум вопроса

Всего сообщений: 1; последнее сообщение — 7 декабря 2008, 15:56; участников в обсуждении: 1.
[Mazzay]

[Mazzay] (статус: Посетитель), 7 декабря 2008, 15:56 [#1]:

всем спасибо,направили меня в нужное русло,
всеже удалось победить,

dc:=BeginPaint(panel1.Handle,ps); //вот этой строчки нехватало
dc:=GetDC(panel1.Handle);

дебилизм...

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 23 февраля 2020, 02:30
Выполнено за 0.03 сек.
Рейтинг@Mail.ru