Как средствами WinApi получить адрес растра по его Handle?
От: ILY Россия  
Дата: 06.09.02 09:09
Оценка:
Здравствуйте.
Мне нужно рисовать попиксельно на рабочем столе. Делаю это с помощью функции Winapi PutPixel, но хочется быстрее. Как средствами WinApi узнать адрес рабочего стола в видеопамяти, чтобы менять пиксели непосредственно (скажем, средствами assembler-a)?
Re: Как средствами WinApi получить адрес растра по его Handl
От: old Dutchman Беларусь http://blogs.rsdn.org/ikemefula
Дата: 06.09.02 09:16
Оценка:
Здравствуйте ILY, Вы писали:

ILY>Здравствуйте.

ILY>Мне нужно рисовать попиксельно на рабочем столе. Делаю это с помощью функции Winapi PutPixel, но хочется быстрее. Как средствами WinApi узнать адрес рабочего стола в видеопамяти, чтобы менять пиксели непосредственно (скажем, средствами assembler-a)?

Ы, на рабочем столе рисовать... Это что имеешь ввиду ? Заместо валлпапера ?

Если да, то создай битмап, в который будешь рисовать напрямую. Сбрось его в файл и поставь как валлпапер.
Если нет — в смысле поверх окон всех — то получаешь GetDesktopWindow и рисуй туда чз Bitmap. А в видео память никто тебя не пустит.
Re[2]: Как средствами WinApi получить адрес растра по его Ha
От: ILY Россия  
Дата: 06.09.02 10:46
Оценка:
Рисовать мне нужно не заместо валлпапера, а прямо на нем.
В общем, на рабочем столе находится картинка, не важно, кем и когда она туда поставлена. Я с помощью кода

HDC Desktop;
Desktop=GetDC(GetDesktopWindow());
//И затем в цикле:
   SetPixel(Desktop,cx+270,cy+570,cb<<16 |cg<<8 |cr);

Слегка подправляю эту картинку. Нужен именно попиксельный вывод, а не блиттинг, скажем, целого битмапа, поскольку изображаемая картинка генерируется математически в реальном времени.
Я так понимаю, что картинка, HDC которой я получил, находящаяся на рабочем столе, находится где-то в памяти — должен же Windows как-то обновлять рабочий стол. Да и SetPixel куда-то же пишет. Вот я и хочу написать на assembler-e ускоренный аналог функции SetPixel. Разве этого нельзя сделать?
Re[3]: Как средствами WinApi получить адрес растра по его Ha
От: old Dutchman Беларусь http://blogs.rsdn.org/ikemefula
Дата: 06.09.02 11:00
Оценка:
Здравствуйте ILY, Вы писали:

ILY>Рисовать мне нужно не заместо валлпапера, а прямо на нем.

ILY>В общем, на рабочем столе находится картинка, не важно, кем и когда она туда поставлена. Я с помощью кода

ILY>
ILY>HDC Desktop;
ILY>Desktop=GetDC(GetDesktopWindow());
ILY>//И затем в цикле:
ILY>   SetPixel(Desktop,cx+270,cy+570,cb<<16 |cg<<8 |cr);
ILY>

ILY>Слегка подправляю эту картинку. Нужен именно попиксельный вывод, а не блиттинг, скажем, целого битмапа, поскольку изображаемая картинка генерируется математически в реальном времени.
ILY>Я так понимаю, что картинка, HDC которой я получил, находящаяся на рабочем столе, находится где-то в памяти — должен же Windows как-то обновлять рабочий стол. Да и SetPixel куда-то же пишет. Вот я и хочу написать на assembler-e ускоренный аналог функции SetPixel. Разве этого нельзя сделать?


А рисовать на WallPapere ты не сможешь. Это уже пробегало две недели назад.
GetDesktopWindow — это самое верхнее по Z-order прозрачное окно. Рисуя на нем, ты затираешь все остальные окна. Чз него грабится скрин.

А wellpaper — принадлежит даже не эксплореру. Прибей эксплорер и убедишься. Эксплорер рисует иконки на битмап, который заполняется PaintWindow.


Есть функция — PaintDesktop. Посмотри описание. Мот поможет.

Ты можешь хранить BMP и его модифицировать на асме. Периодически сбрасываешь на диск и обновляешь Wellpaper.


Если есть Activedesktop — тогда руби HTML с ActiveX и обновляй хучь в RealTime. А по другому не выйдет.

Если сабкласишь эксплорерный ListView — кроме как WM_ERASEBKGND, он еще гдето рисует дрянь эту. И может отменить сабкласс. Я помучал его — отменяет сволочь.

А от асма выигрыша не будет особого — только BMP заполнишь быстро. А это только 10% от всего времени.
Re[4]: Как средствами WinApi получить адрес растра по его Ha
От: ILY Россия  
Дата: 06.09.02 14:17
Оценка:
Ну ладно, спасибо.
Я все-таки еще помучаюсь, может все-таки что придумаю.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.