Здравствуйте.
Мне нужно рисовать попиксельно на рабочем столе. Делаю это с помощью функции Winapi PutPixel, но хочется быстрее. Как средствами WinApi узнать адрес рабочего стола в видеопамяти, чтобы менять пиксели непосредственно (скажем, средствами assembler-a)?
Рисовать мне нужно не заместо валлпапера, а прямо на нем.
В общем, на рабочем столе находится картинка, не важно, кем и когда она туда поставлена. Я с помощью кода
HDC Desktop;
Desktop=GetDC(GetDesktopWindow());
//И затем в цикле:
SetPixel(Desktop,cx+270,cy+570,cb<<16 |cg<<8 |cr);
Слегка подправляю эту картинку. Нужен именно попиксельный вывод, а не блиттинг, скажем, целого битмапа, поскольку изображаемая картинка генерируется математически в реальном времени.
Я так понимаю, что картинка, HDC которой я получил, находящаяся на рабочем столе, находится где-то в памяти — должен же Windows как-то обновлять рабочий стол. Да и SetPixel куда-то же пишет. Вот я и хочу написать на assembler-e ускоренный аналог функции SetPixel. Разве этого нельзя сделать?
Здравствуйте 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% от всего времени.
Ну ладно, спасибо.
Я все-таки еще помучаюсь, может все-таки что придумаю.