Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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 на форму?


Наверх

Титульная страница Поиск, карта сайта Написать письмо