![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
как подменить 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