Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.47 MB
Время: 0.012 c
1-24881
xn0bys
2002-12-28 11:49
2003.01.09
СРОЧНО: нужна помощь по потомку TGraphicControl


1-24864
BillyJeans
2002-12-25 14:27
2003.01.09
не пойму, что делает функция Round...


7-25113
Пасечник
2002-10-13 22:15
2003.01.09
Где хранится 404 у IE?


7-25118
sancho
2002-10-28 19:05
2003.01.09
О часах windows и панели задач...


3-24804
Botcha
2002-12-16 22:02
2003.01.09
Win95 + ADO




   Наверх