#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);
Комментариев нет:
Отправить комментарий