Решил сделать настройку цвета. Создал палитру:
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);
Комментариев нет:
Отправить комментарий