| 
| 
 | Вопрос # 2 170/ вопрос открыт / | 
 |  Здравствуйте, уважаемые эксперты! помогите разобраться, рисую средствами апи,  но неполучается, отрисовать   все в начальный момент запуска программы, В событии Формы.онShow функция отрисовки выполняется но на устройство контекстное недоходит.
 
 Заставьте это работать чтобы после запуска программы отрисовывалось нормально,
 сейчас отрисовка только после изменений параметров(манипуляций на форме)
 всё в аттаче. заранее спасибо, гугл непомог((
 К вопросу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки вопроса) Приложение:Переключить в обычный режим begindc:=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]](https://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);beginPostMessage(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]](https://www.delphi-int.ru/avatars/2572--50.png)  | [Mazzay] (статус: Посетитель), 7 декабря 2008, 15:56 [#1]:всем спасибо,направили меня в нужное русло, всеже удалось победить,
 
 dc:=BeginPaint(panel1.Handle,ps);  //вот этой строчки нехватало
 dc:=GetDC(panel1.Handle);
 
 дебилизм...
 |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |