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

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

как подменить HDC [D5, WinXP]


Diamond Cat ©   (2002-11-19 01:17:00) 

как подменить HDC, функции типа fillrect заполняют регион но и то только до перерисовки контрола


Dmk   (2002-11-21 22:42:00) [1]

Игорь Шевченко © (20.11.02 10:53)
Спасибо за отзыв! Буду продолжать учиться :)


Игорь Шевченко   (2002-11-20 16:11:00) [2]

Diamond Cat © (20.11.02 16:07)

Из книг, из MSDN. Из опыта :-)))


Diamond Cat   (2002-11-20 16:07:00) [3]

Вроде стало понятнее, вопрос к Игорю Шевченко, а откуда вы черпаете столь интересную и почти всегда верную инфу????


Игорь Шевченко   (2002-11-20 10:53:00) [4]

Dmk © (20.11.02 02:36)

> HDC это индекс в системной таблице указателей на блоки памяти.


Не совсем так, но очень близко к истине. Младшие 16-бит HDC являются индексом в той самой таблице (gpentHmgr).

> При обращении к HDC система наверняка проверяет принадлежность/права
> вашего процесса к странице памяти контекста.


Совсем близко к истине. DC имеет две части - одна в пользовательской части адресного пространстве (дабы GDI32 каждый раз в режим ядра не переключался), другая в системной части адресного пространства.

Подменить не получится :-)


> HiddenDC имеет при каждом вызове всегда
> разный индекс. Это Билли пытается защититься


Нет, это работает кэширование контекстов устройств с разными атрибутами (регионами отсечения, например) :-)

С уважением,


Dmk   (2002-11-20 02:36:00) [5]

Поскольку ранее я имел дело с программированием в защищенном режиме, то смею предположить, что HDC это индекс в системной таблице указателей на блоки памяти. При обращении к HDC система наверняка проверяет принадлежность/права вашего процесса к странице памяти контекста. Никогда система вам этого сделать не даст. А в вашем случае с bmp идет обращение к легальным страницам вашего процесса. Поэтому все работает.
Лучше делать как писал г-н Mbo.
Я вдоволь нахлебался с такими экспериментами :(. Да и еще! При перерисовке окна в N-ный раз, в N+1 может передаться совершенно иное значение индекса.

Да! И собственно по сабжу.

Имеется функция BeginPaint
Она позволяет нарисовать до WM_PAINT то, что
должно будет появиться в окне.
Причем в моем примере используется блок памяти
созданный функцией CreateDIBSection -> (RepaintBuffer.dbMemDC)
функция BeginPaint возвращает HDC который будет
прорисован в момент вызова EndPaint.
EndPaint вызывает WM_PAINT для Handle.
Handle это Handle вашего окна.
Так что после EndPaint в вашем окне появится то, что захотите.

Procedure TDrawForm.Repaint;
var
HiddenDC: HDC;
PS: TPaintStruct;

begin
HiddenDC := BeginPaint(Handle,PS);
BitBlt(HiddenDC,
vp.Left,
vp.Top,
vp.Width,
vp.Height,
RepaintBuffer.dbMemDC,
0,
0,
SRCCOPY);
EndPaint(Handle,PS);
end;

И что интересно, HiddenDC имеет при каждом вызове всегда
разный индекс. Это Билли пытается защититься :)
Подробнее по почте. Если интересно.


Diamond Cat   (2002-11-20 00:07:00) [6]

Ok вернемся к нашим баранам, подменить нельзя, но тогда как работат такая фишка
var
bmp:Tbitmap;
.........
image1.canvas.handle:=bmp.canvas.handle;

на мой взгляд я делаю не чот иное как указываю откуда брать контекст, и если это работает (а это работает) то почему нельзя это проделать с чужими окнами?


MBo   (2002-11-19 14:59:00) [7]

>Diamond Cat
контекст устройства подменить нельзя.
если получить (getdc, например) контекст, связанный с окном, нарисованное на нем будет сохраняться лишь до первого вызова wm_paint.


Игорь Шевченко   (2002-11-19 14:46:00) [8]

Diamond Cat © (19.11.02 14:44)

Бред


Diamond Cat   (2002-11-19 14:44:00) [9]

2 MBoесли заполнять его перехватывая wm_paint, то надо ставить ловушку, а этого хотелосьбы избежать, есть предположение что можно как-то выципить где находиться этот самый hdc и забить туда свой, при таком раскладе не понадобится перехватывать сообщения, система будет сама отрисовывать регион с заданым мной рисунком
2 KSergeyчтобы показывать то что хочеться мне , а не то что показывает билли


KSergey   (2002-11-19 09:37:00) [10]

Зачем его подменять?!


MBo   (2002-11-19 06:15:00) [11]

ну так заполняй этот регион в обработчике wm_paint


Наверх

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