Страницы

Поиск по вопросам

четверг, 9 апреля 2020 г.

Получение цвета в формате RGB по положению мыши в приложении

#cpp #windows

                    
Решил сделать настройку цвета. Создал палитру: 

void  render_ColorPolet(float x, float y, float w, float h, IDirect3DDevice9* pDevice)
{
    struct D3DVERTEX
    {
        float x, y, w, h;
        DWORD color;
    };

    D3DVERTEX   vertices[] =
    {
        { x, y, w, h, D3DCOLOR_ARGB(255, 255, 255, 0) },
        { x + w, y, w, h, D3DCOLOR_ARGB(255, 255, 0, 0) },
        { x, y + h, w, h, D3DCOLOR_ARGB(255, 0, 0, 255) },
        { x + w, y + h, w, h, D3DCOLOR_ARGB(255, 0, 255, 0) }
    };

    pDevice->SetTexture(0, NULL);
    pDevice->SetPixelShader(0);
    pDevice->SetFVF(D3DFVF_XYZRHW | D3DFVF_DIFFUSE);
    pDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, true);
    pDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
    pDevice->SetRenderState(D3DRS_ZENABLE, FALSE);
    pDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);

    pDevice->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, vertices, sizeof(D3DVERTEX));
}


Получил положение курсора:

POINT mpos;
GetCursorPos(&mpos);
ScreenToClient(GetForegroundWindow(), &mpos);
int Os_x = mpos.x;
int Os_y = mpos.y;


Теперь нужно получить по этим координатам цвет, записывая например в RGB. Я решил
определить макрос:

#define COLOR_A_TEST(r,g,b) D3DCOLOR_ARGB(255,r,g,b)


Осталось всего ничего, определить цвет. И тут я встрял, по многим форумам пролазил,
говорят нужно юзать GetPixel. Не могу понять как, помогите пожалуйста.
    


Ответы

Ответ 1



Вот так это можно сделать: COLOREF GetWindowPixel(HWND window, int x, int y) { auto window_dc = GetDC(window); // получаем контекст устройства if(window_dc) { auto pixel = GetPixel(window_dc, x, y); // получаем цвет ReleaseDC(window_dc); // освобождаем контекст return pixel; } return CLR_INVALID; } Обратите внимание, что функции GetDC можно передать хэндл окна равный NULL и тогда вы получите контекст экрана и соответвенно пиксель будет в координатах экрана. То есть передавая NULL можно получать цвета пикселей в глобальных координатах и вне своего окна. Таким образом, вы можете использовать функцию GetWindowPixel так: POINT mpos = {0}; GetCursorPos(&mpos); // ScreenToClient(GetForegroundWindow(), &mpos); // int Os_x = mpos.x; // int Os_y = mpos.y; auto color = GetWindowPixel(NULL, mpos.x, mpos.y);

Комментариев нет:

Отправить комментарий