Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.07.15;
Скачать: CL | DM;

Вниз

Canvas формы.   Найти похожие ветки 

 
zje ©   (2002-06-28 14:41) [0]

Надо на Canvas формы(форма fsMDIForm) надо нарисовать Panel c некоторыми control- ами ней. У панели есть Метод Panel1.PaintTo c помощью которого это можно сделать. Вызов метода размещается Form.OnPaint.
А проблема в следующем в NT2000 все это здорово работает, а вот в 9x жутко ломается.
Подскажите как заставить это в 9x работать?
Все это делается в Delphi 6.


 
MBo ©   (2002-06-28 14:49) [1]

ээээ...
Именно нарисовать, а не просто положить TPanel на форму?


 
zje ©   (2002-07-01 11:07) [2]

Угу. Именно нарисовать. Если просто панель положить на форму, то она будет поверх дочерних окон.


 
MBo ©   (2002-07-01 11:16) [3]

может, поможет
http://www.lmc-mediaagentur.de/dpool/tips04/0359.htm


 
valery_f   (2002-07-01 12:02) [4]

> zje © (28.06.02 14:41) ...а вот в 9x жутко ломается

А что ломается то? Че пишет?


 
zje ©   (2002-07-01 16:13) [5]

Спасибо за ссылку. Я ее уже видел просто хотелось сделать как бы по проще.
В onPainte формы пишу следующее:
Panel1.PaintTo(Canvas , 10 , ClientHeight - Panel1.Height - 10);
Refresh;
Если Refresh убрать, то работает но криво (форма не перерисовывается при изменении размеров, появляется как бы несколько панелей).
А с Refresh в 9х прога падает со словами "Программа выролнила недопустимую операцию и будет закрыта" (сбой при обращении к странице памяти).


 
DeMoN-777 ©   (2002-07-01 21:32) [6]



 
Юрий Зотов ©   (2002-07-01 22:47) [7]

Бедняга 9x. И NT тоже. Уж и так, и сяк их ломают... А они, хоть и ломаются, но пока живут...

Смотрим хелп:
procedure PaintTo(DC: HDC; X, Y: Integer);

Что Вы передаете в первом параметре? Canvas. А надо что? DC. Так чему же удивляться?

Только тому, что это вообще как-то работает, даже и под 2k.

Panel1.PaintTo(Canvas. Handle , ...);
И не надо ругаться на 9x. Не она виновата...


 
zje ©   (2002-07-03 10:35) [8]

Привет.
К сожелению Ваш совет не помог.
Хотя я действительно был неправ там нужен handle, но это почему то делу не помоглою. В nt как работало так и работает, под 9х как падала так и падает. :(


 
Skier ©   (2002-07-03 11:36) [9]

>zje
Свой код в onPaint-e не покажешь ?


 
zje ©   (2002-07-03 12:10) [10]

Да конечно.
Просто создается новое приложение. Главная форма fsMDIForm.
Кладется панель. Ставиться у панели visible = False.
Желательно на панель что-нибудь положить, типа календаря.
В OnPaint-е формы пишется следующее:
Panel1.PaintTo(Canvas.Handle , 10 , ClientHeight - Panel1.Height - 10);
Refresh;
В принципет даже Refersh можно закомментировать, вроде и безнего падает.
Попробуйте у кого время есть.



 
Skier ©   (2002-07-03 12:16) [11]

>zje
Извини конечно, но... может объяснишь в кратце
зачем тебе именно такой способ отрисовки.

Может можно как-то иначе всё это сделать ?
Т.е. что ты хочешь иметь в итоге ??


 
zje ©   (2002-07-03 13:01) [12]

Мне то это не надо, где то начальство углядело как в MDI (главной форме) нарисована какая та бадяга и тоже захотели.
Вот и требуется что внутри этой MDI рамки было что то нарисовано,
например, календарь.
Так что вот теперь мучаюсь.


 
Skier ©   (2002-07-03 13:05) [13]

>zje
А нельзя ли просто положить на главную форму - календарь ?


 
valery_f   (2002-07-03 13:16) [14]

> 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 (проверил оба варианта - ОК).


 
zje ©   (2002-07-03 14:05) [15]

Так есно работает, а ты именно так попробуй. :)
Panel1.PaintTo(Canvas.Handle , 10 , ClientHeight - Panel1.Height - 10</b);
Refresh
Нужно что бы рисовалось внизу формы, причем корректно при изменние ее размеров.


 
Skier ©   (2002-07-03 14:07) [16]

>zje

> ...при изменние ее размеров

Так может быть тогда использовать OnResize или WM_SIZE;


 
zje ©   (2002-07-03 16:31) [17]

К сожалению OnResize не подходит для этих целей :(


 
valery_f   (2002-07-03 16:39) [18]

> zje © (03.07.02 14:05) ...ClientHeight - Panel1.Height - 10...

Все нормально, ничего не падает, правда без Refresh - если его вызывать в OnPaint - начнется бесконечная рекурсия и выскочит Stack overflow.

> zje © (03.07.02 14:05) ...при изменние ее размеров

О, это отдельный гемор. Винда пытается, насколько это возможно, пореже вызывать перерисовку. В результате при уменьшении размера окна сообщение на перерисовку вообще может не прийти (мы просто отсекаем часть уже нарисованного), а при увеличении винда может ограничить область перерисовки добавимшимся куском. В общем, попробуй устраивать принудительную перерисовку в OnResize формы. Если не выйдет - кинь мне на мыло, посмотрим "на месте".


 
Skier ©   (2002-07-03 16:39) [19]

>zje
Если я правильно понял, то тебе нужно

> рисовалось внизу формы, причем корректно при изменние ее
> размеров


???
И тебя не волнует каким способом это сделать ? Так ?

Если так, то пришли мне код по почте и по-подробней
напиши что бы ты хотел сделать



 
zje ©   (2002-07-03 17:21) [20]

Всем желающим исходник выслал.
Буду весьма признателен запомощь.



Страницы: 1 вся ветка

Текущий архив: 2002.07.15;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.012 c
6-47637
JohnKZ
2002-05-04 09:29
2002.07.15
Help


6-47650
DeaDMan_77
2002-05-07 01:05
2002.07.15
Мастера, подскажите как отключить доступ к Интернету


8-47623
Ruslan.
2002-03-06 19:57
2002.07.15
DXWaveList


3-47132
AlexNord
2002-06-20 05:13
2002.07.15
IBQuery и фильтрация записей


14-47696
BigBadMutuh
2002-06-02 13:12
2002.07.15
Вот и у меня сайт появился.