Windows GetPixel typedef C ++

时间:2014-10-14 09:23:23

标签: winapi

如何定义GetPixel的类型和/或我还缺少什么才能使用GetPixel?

#include <windows.h>
class PollPixelArray
{
public:
    PollPixelArray(HDC hdcMonitor, LPRECT lprcMonitor);
    unsigned long createHex(int r, int g, int b);
private:
    PollPixelArray();
};

PollPixelArray::PollPixelArray(HDC hdcMonitor, LPRECT lprcMonitor)
{
    GetPixel(hdcMonitor, 50, 100);
}

unsigned long createHex(int r, int g, int b){
    return (((r & 0xff) << 16) + ((g & 0xff) << 8) + (b & 0xff));
}

无论X坐标还是Y坐标,始终返回相同的无符号长整数/ DWORD / COLORREF。

while (tempX<40){
    COLORREF tempREF = GetPixel(hdcMonitor, tempX, tempY); //COLORREF | unsigned long | 
    unsigned int dummy = GetRValue(tempREF);
    std::cout << "RGB: " << ("%d", dummy);
    dummy = GetGValue(tempREF);
    std::cout << "," << ("%d", dummy);
    dummy = GetBValue(tempREF);
    std::cout << "," << ("%d", dummy);
    std::cout << " at " << ("%d", tempX) << ", " << ("%d", tempY) << std::endl;
    tempX++;
    tempY++;
}

对于RGB值,循环总是返回255,255,255。

HDC回拨功能:

#include <windows.h>
#include "pollpixelarray.h"
BOOL CALLBACK MonitorEnumProc(HMONITOR hMonitor, HDC hdcMonitor, LPRECT lprcMonitor, LPARAM dwData)
{

    PollPixelArray::PollPixelArray(hdcMonitor, lprcMonitor);

    return true;
}

void main()
{
    EnumDisplayMonitors(NULL, NULL, MonitorEnumProc, 0);

    std::cin.get();
}

1 个答案:

答案 0 :(得分:2)

这与typedef没有任何关系,GetPixel正常工作。对于您观察到的行为,有几个合理的解释:

  1. 设备上下文无效,或
  2. 您传递的坐标超出了设备的范围。
  3. 查看您的代码,两者都可能是这种情况,

    hdc EnumDisplayMonitors参数的文档说:

      

    如果此参数为NULL,则传递给回调函数的hdcMonitor参数将为NULL,感兴趣的可见区域是包含桌面上所有显示的虚拟屏幕。

    GetPixel的文档说:

      

    如果像素位于当前剪切区域之外,则返回值为CLR_INVALID(Wingdi.h中定义的0xFFFFFFFF)。