如何使用Direct2D的从窗口像素得到(How to get pixels from window

2019-10-20 03:43发布

我的问题是越来越像素的窗口。 我无法找到一个方法来做到这一点。 我使用标准的Windows功能,Direct2D的(不是DirectDraw的)。 我使用新窗口的标准初始化:

WNDCLASS wc;
wc.style = CS_OWNDC; 
wc.lpfnWndProc = WndProc; 
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH)(6);   
wc.lpszMenuName = 0;
wc.lpszClassName = L"WINDOW"; RegisterClass(&wc); 
hWnd = CreateWindow(L"WINDOW", L"Game", WS_OVERLAPPEDWINDOW,100,100,1024,768,NULL,NULL,hInstance,NULL);

然后,我创建了一个D2D1factory对象并绘制在窗口中的位图:

HWND hWnd = NULL;
srand((unsigned int)time((time_t)NULL));

ID2D1Factory* factory = NULL;
ID2D1HwndRenderTarget* rt = NULL;
CoInitializeEx(NULL,COINIT_MULTITHREADED);
My_CreateWindow(&hWnd, hInstance);
My_CreateFactory(&hWnd, factory, rt);
D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED,&factory);

factory->CreateHwndRenderTarget(RenderTargetProperties(), HwndRenderTargetProperties(hWnd,SizeU(800,600)), &rt);

// tons of code

rt->BeginDraw(); rt->DrawBitmap(background[0], RectF(0,0,800,600));
rt->DrawBitmap(GIFHorse[(int)iterator],
RectF(0+MyX-100,0+MyY-100,100+MyX,100+MyY));
rt->DrawBitmap(Star[(int)iterator], RectF(0 + starX, 0 + starY, 50 + starX, 50+starY)); rt->EndDraw();

我需要计算命中(我试图让简单的游戏)。 所以这就是为什么我需要访问所有的像素窗口。

我在考虑使用其他的算法,但他们很难做出,我想先从一些轻松。

我知道的GetPixel()函数,但我不能明白我应该使用HDC

Answer 1:

有没有简单易行的方式去D2D像素。

一个简单的碰撞检测可以用几何形状来实现。 如果你有你的对象的轮廓在ID2D1Geometry对象,可以使用对它们进行比较ID2D1Geometry::CompareWithGeometry

如果你坚持的像素,对其进行访问的方式是从DC通过获得IDXGISurface1::GetDC

在这种情况下,你需要使用DXGI表面呈现目标和交换链,而不是HWND渲染目标。

一步步:

  1. D3D11CreateDeviceAndSwapChain给你的交换链。
  2. IDXGISwapChain::GetBuffer给你DXGI表面。
  3. ID2D1Factory::CreateDxgiSurfaceRenderTarget给你渲染目标。
  4. IDXGISurface1::GetDC给你的DC。 阅读此页上的言论!


文章来源: How to get pixels from window using Direct2D