Страницы

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

суббота, 22 июня 2019 г.

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

Решил сделать настройку цвета. Создал палитру:
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. Не могу понять как, помогите пожалуйста.


Ответ

Вот так это можно сделать:
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);

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

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