Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
14-25095
Agent Smith
2002-12-21 20:31
2003.01.09
Клиффорд Саймак


3-24809
Che
2002-12-16 23:48
2003.01.09
Внесение данных


1-24918
kla
2002-12-26 07:41
2003.01.09
компонент


3-24823
drpass
2002-12-14 21:44
2003.01.09
Баг в IBExpress, или я чего-то не знаю?


1-24953
TAG_SPB
2002-12-26 18:46
2003.01.09
Как скоприровать все из RichEdit1 в RichEdit2





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский