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

Вниз

как подменить HDC   Найти похожие ветки 

 
Diamond Cat ©   (2002-11-19 01:17) [0]

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


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

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


 
KSergey ©   (2002-11-19 09:37) [2]

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


 
Diamond Cat ©   (2002-11-19 14:44) [3]

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


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

Diamond Cat © (19.11.02 14:44)

Бред


 
MBo ©   (2002-11-19 14:59) [5]

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


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

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

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


 
Dmk ©   (2002-11-20 02:36) [7]

Поскольку ранее я имел дело с программированием в защищенном режиме, то смею предположить, что 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 имеет при каждом вызове всегда
разный индекс. Это Билли пытается защититься :)
Подробнее по почте. Если интересно.


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

Dmk © (20.11.02 02:36)

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


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

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


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

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


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


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

С уважением,


 
Diamond Cat ©   (2002-11-20 16:07) [9]

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


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

Diamond Cat © (20.11.02 16:07)

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


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

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



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

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

Наверх




Память: 0.49 MB
Время: 0.014 c
14-25020
Ketmar
2002-12-19 12:37
2003.01.09
господа, никто не встречал реализацию LISP а на OP?


1-24960
Kventin
2002-12-26 19:41
2003.01.09
Класс - контейнер


1-24882
idpro
2002-12-25 16:03
2003.01.09
Отключение темы WIndows XP для своего приложения


1-24833
Начинающий програмер
2002-12-27 13:13
2003.01.09
2 вопроса


14-25062
Kotka
2002-12-19 21:25
2003.01.09
Мне интересно ваше мнение...