Плавное затемнение экрана
От: hotstone  
Дата: 19.09.05 08:09
Оценка:
Уважаемые знатоки!

Передо мной стоит задача плавно затемнить каждый второй пиксел экрана за исключением некоторой прилегающей области к курсору ( например, прямоугольника ). Естесвенно, это не должно мешать выполняться другим приложениям. Понятно, что надо повесить пару hook-ов . Проблема заключается в другом... А именно, каким инструментарием пользоваться для быстрой работы с пикселами экрана? Пробовал использовать GDI (CreateDIBSection, как самую быструю), тормозит. Кто сталкивался с такой задачей, подскажите, пожалуйста. А еще лучше, ссылочку бы на какой-нить пример работающий..

Заранее благодарю.

19.09.05 12:23: Перенесено из 'C/C++'
Re: Плавное затемнение экрана
От: gear nuke  
Дата: 19.09.05 10:16
Оценка:
Здравствуйте, hotstone, Вы писали:

H>каким инструментарием пользоваться для быстрой работы с пикселами экрана?

H>Пробовал использовать GDI (CreateDIBSection, как самую быструю), тормозит.

Можно попробовать DirectDraw.
Вот простой пример, который заштриховывает весь экран.

Только не запускайте при глубине цвета != 32 bpp!!! Тут нет никаких проверок, по хорошему, нужно смотреть поле ddpfPixelFormat в DDSURFACEDESC2, ну и про DirectDraw немного почитать.

#define INITGUID
#include <ddraw.h>
#include <windows.h>
#pragma comment(lib, "ddraw.lib") 

void shade()
{
    IDirectDraw7          * direct_draw;
    IDirectDrawSurface7   * primary_surface;
    DDSURFACEDESC2          surface_descriptor = { sizeof(surface_descriptor) };

    DirectDrawCreateEx(0, (void**)&direct_draw, IID_IDirectDraw7, 0);

    direct_draw->SetCooperativeLevel(0, DDSCL_NORMAL);

    surface_descriptor.dwFlags = DDSD_CAPS;
    surface_descriptor.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;

    direct_draw->CreateSurface(&surface_descriptor, &primary_surface, NULL);

    primary_surface->Lock(0, &surface_descriptor, 0, 0);
    void * memory = surface_descriptor.lpSurface;

    for( int dy = surface_descriptor.dwHeight;
         dy; 
         dy--, memory = (char *)memory + surface_descriptor.lPitch )
    {
        for( int dx = surface_descriptor.dwWidth; dx; --dx )
            if ( (dx ^ dy) & 1 ) 
                *((int *)memory + dx) = -1;  
    }
    primary_surface->Unlock(0);
}
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.