![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Canvas ;формы. [D6, Win95/98, Win2k]
zje © (2002-06-28 14:41:00)Надо на Canvas формы(форма fsMDIForm) надо нарисовать Panel c некоторыми control- ами ней. У панели есть Метод Panel1.PaintTo c помощью которого это можно сделать. Вызов метода размещается Form.OnPaint.
А проблема в следующем в NT2000 все это здорово работает, а вот в 9x жутко ломается.
Подскажите как заставить это в 9x работать?
Все это делается в Delphi 6.
zje (2002-07-03 17:21:00) [1]Всем желающим исходник выслал.
Буду весьма признателен запомощь.
Skier (2002-07-03 16:39:00) [2]>zje
Если я правильно понял, то тебе нужно
> рисовалось внизу формы, причем корректно при изменние ее
> размеров
???
И тебя не волнует каким способом это сделать ? Так ?
Если так, то пришли мне код по почте и по-подробней
напиши что бы ты хотел сделать
valery_f (2002-07-03 16:39:00) [3]> zje © (03.07.02 14:05) ...ClientHeight - Panel1.Height - 10...
Все нормально, ничего не падает, правда без Refresh - если его вызывать в OnPaint - начнется бесконечная рекурсия и выскочит Stack overflow.
> zje © (03.07.02 14:05) ...при изменние ее размеров
О, это отдельный гемор. Винда пытается, насколько это возможно, пореже вызывать перерисовку. В результате при уменьшении размера окна сообщение на перерисовку вообще может не прийти (мы просто отсекаем часть уже нарисованного), а при увеличении винда может ограничить область перерисовки добавимшимся куском. В общем, попробуй устраивать принудительную перерисовку в OnResize формы. Если не выйдет - кинь мне на мыло, посмотрим "на месте".
zje (2002-07-03 16:31:00) [4]К сожалению OnResize не подходит для этих целей :(
Skier (2002-07-03 14:07:00) [5]>zje
> ...при изменние ее размеров
Так может быть тогда использовать OnResize или WM_SIZE;
zje (2002-07-03 14:05:00) [6]Так есно работает, а ты именно так попробуй. :)
Panel1.PaintTo(Canvas.Handle , 10 , ClientHeight - Panel1.Height - 10</b);
Refresh
Нужно что бы рисовалось внизу формы, причем корректно при изменние ее размеров.
valery_f (2002-07-03 13:16:00) [7]> zje © (03.07.02 12:10)
Refresh там действительно лишний... Щас попробовал - кинул на пустую форму (FormStyle=fsMDIForm) панель (на всякий случай - на нее еще контролов), сразу поставил ей Visible=false и сделал OnPaint формы:
procedure TForm1.FormPaint(Sender: TObject);
begin
Panel1.PaintTo(Canvas.Handle,10,10);
end;
Все работает. Видимо что-то ты там еще намутил... Начни с минимально работающего варианта.
> Юрий Зотов © (01.07.02 22:47) Что Вы передаете в первом параметре? Canvas. А надо что? DC.
В шестерке метод PaintTo имеет две реализации - можно рисовать и на Canvas и на DC (проверил оба варианта - ОК).
Skier (2002-07-03 13:05:00) [8]>zje
А нельзя ли просто положить на главную форму - календарь ?
zje (2002-07-03 13:01:00) [9]Мне то это не надо, где то начальство углядело как в MDI (главной форме) нарисована какая та бадяга и тоже захотели.
Вот и требуется что внутри этой MDI рамки было что то нарисовано,
например, календарь.
Так что вот теперь мучаюсь.
Skier (2002-07-03 12:16:00) [10]>zje
Извини конечно, но... может объяснишь в кратце
зачем тебе именно такой способ отрисовки.
Может можно как-то иначе всё это сделать ?
Т.е. что ты хочешь иметь в итоге ??
zje (2002-07-03 12:10:00) [11]Да конечно.
Просто создается новое приложение. Главная форма fsMDIForm.
Кладется панель. Ставиться у панели visible = False.
Желательно на панель что-нибудь положить, типа календаря.
В OnPaint-е формы пишется следующее:
Panel1.PaintTo(Canvas.Handle , 10 , ClientHeight - Panel1.Height - 10);
Refresh;
В принципет даже Refersh можно закомментировать, вроде и безнего падает.
Попробуйте у кого время есть.
Skier (2002-07-03 11:36:00) [12]>zje
Свой код в onPaint-e не покажешь ?
zje (2002-07-03 10:35:00) [13]Привет.
К сожелению Ваш совет не помог.
Хотя я действительно был неправ там нужен handle, но это почему то делу не помоглою. В nt как работало так и работает, под 9х как падала так и падает. :(
Юрий Зотов (2002-07-01 22:47:00) [14]Бедняга 9x. И NT тоже. Уж и так, и сяк их ломают... А они, хоть и ломаются, но пока живут...
Смотрим хелп:
procedure PaintTo(DC: HDC; X, Y: Integer);
Что Вы передаете в первом параметре? Canvas. А надо что? DC. Так чему же удивляться?
Только тому, что это вообще как-то работает, даже и под 2k.
Panel1.PaintTo(Canvas. Handle , ...);
И не надо ругаться на 9x. Не она виновата...
DeMoN-777 (2002-07-01 21:32:00) [15]
zje (2002-07-01 16:13:00) [16]Спасибо за ссылку. Я ее уже видел просто хотелось сделать как бы по проще.
В onPainte формы пишу следующее:
Panel1.PaintTo(Canvas , 10 , ClientHeight - Panel1.Height - 10);
Refresh;
Если Refresh убрать, то работает но криво (форма не перерисовывается при изменении размеров, появляется как бы несколько панелей).
А с Refresh в 9х прога падает со словами "Программа выролнила недопустимую операцию и будет закрыта" (сбой при обращении к странице памяти).
valery_f (2002-07-01 12:02:00) [17]> zje © (28.06.02 14:41) ...а вот в 9x жутко ломается
А что ломается то? Че пишет?
MBo (2002-07-01 11:16:00) [18]может, поможет
http://www.lmc-mediaagentur.de/dpool/tips04/0359.htm
zje (2002-07-01 11:07:00) [19]Угу. Именно нарисовать. Если просто панель положить на форму, то она будет поверх дочерних окон.
MBo (2002-06-28 14:49:00) [20]ээээ...
Именно нарисовать, а не просто положить TPanel на форму?