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