Форум: "WinAPI";
Текущий архив: 2003.01.09;
Скачать: [xml.tar.bz2];
Внизкак подменить 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 вся ветка
Форум: "WinAPI";
Текущий архив: 2003.01.09;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.007 c