|
Вопрос # 2 170/ вопрос открыт / |
|
Здравствуйте, уважаемые эксперты!
помогите разобраться, рисую средствами апи, но неполучается, отрисовать все в начальный момент запуска программы, В событии Формы.онShow функция отрисовки выполняется но на устройство контекстное недоходит.
Заставьте это работать чтобы после запуска программы отрисовывалось нормально,
сейчас отрисовка только после изменений параметров(манипуляций на форме)
всё в аттаче. заранее спасибо, гугл непомог((
К вопросу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки вопроса)
Приложение: Переключить в обычный режим- begin
- dc:=GetDC(panel1.Handle);
- center.x:=panel1.Width div 2;
- center.y:=panel1.Height div 2;
-
- RotatePoint(points1,center,2,a1);
- RotatePoint(points2,center,2,a2);
-
- // double buffer
- hdcMem := CreateCompatibleDC(dc);
- hbmMem := CreateCompatibleBitmap(dc, panel1.Width,panel1.Height);
- hOld := SelectObject(hdcMem, hbmMem);
- ...
![[Mazzay]](http://www.delphi.int.ru/avatars/2572--50.png) |
Вопрос задал: [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 и отображения формы.
Приложение: Переключить в обычный режим- ...
-
- interface
-
- uses
- ...
-
- const
-
-
- type
- T{FormName} = class(TForm)
- ...
- privare
- procedure AfterShow(var A:TMessage);message WM_AfterShow;
- ...
-
- implementation
-
- ...
-
- procedure T{FormName}.AfterShow(var A:TMessage);
- begin
-
- end;
-
- procedure T{FormName}.OnShow(Sender: TObject);
- begin
- PostMessage(Handle, WM_AfterShow, 0, 0);
- end;
-
- ...
-
- end.
 |
Ответ отправил: Amidamaru (статус: 4-ый класс)
Время отправки: 7 декабря 2008, 14:08
Оценка за ответ: 3
Комментарий к оценке: порядок событий при создании формы
OnCreate -> OnShow -> OnActivate -> OnPaint -> OnResize -> OnPaint
|
Мини-форум вопроса
Всего сообщений: 1; последнее сообщение — 7 декабря 2008, 15:56; участников в обсуждении: 1.
|
[Mazzay] (статус: Посетитель), 7 декабря 2008, 15:56 [#1]:
всем спасибо,направили меня в нужное русло,
всеже удалось победить,
dc:=BeginPaint(panel1.Handle,ps); //вот этой строчки нехватало
dc:=GetDC(panel1.Handle);
дебилизм...
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|