【发布时间】:2016-09-01 16:08:01
【问题描述】:
我目前正在开发一个应用程序,该应用程序需要为连接到系统的每个屏幕提供HDC。
我目前正在使用这样的代码:
std::vector<HDC> dcs;
HDC dcMain = ::GetDC(nullptr); // <-- don't understand this
::EnumDisplayMonitors(dcMain, nullptr, MONITORENUMPROC(&DisplayMonitorCallback), LPARAM(&dcs));
我的回调如下:
BOOL DisplayMonitorCallback(const HMONITOR monitor, const HDC hdcMonitor, const LPRECT lprcMonitor, std::vector<HDC>& dcs)
{
dcs.push_back(hdcMonitor);
// here is where it gets weird!
HBRUSH br = CreateSolidBrush(RGB(0, 255, 0));
auto rst = FillRect(hdcMonitor, lprcMonitor, br);
// Process all monitors
return TRUE;
}
请注意,我目前正在每个屏幕上渲染一个绿色画笔。这在 THIS 上下文中(即在回调中)非常有效。
现在,问题是,我正在捕获那些 HDCs 以供以后使用。
几行之后,我将遍历我的 dcs 向量:
for (HDC dc : dcs)
{
HBRUSH br = CreateSolidBrush(RGB(255, 255, 0));
RECT x = { 100, 100, 500, 500 };
auto rst = FillRect(dc, &x, br);
printf("%d", rst);
}
所以,我的问题是:
对于
dcMain,我必须把这个传进去,这是获得一个的好方法吗?为什么渲染在回调中起作用,但当我捕获
HDCs 并稍后对其进行迭代时不起作用?
【问题讨论】:
-
文档没有详细说明,但是您可以假设,考虑到类似的枚举函数在其他 API 中的工作方式,赋予每个回调函数的 HDC 是由 EnumDisplayMonitors() 本身在枚举过程中获取的然后在回调返回时立即释放;也就是说,只有在回调函数本身期间使用该 HDC 才可能是安全的。但是继续这种思路将把我们带入 XY 问题领域,所以:你想做什么需要单独的监视器 HDC?
-
@andlabs 谢谢,我需要 HDC 来实例化 IDXGISurface1:msdn.microsoft.com/en-us/library/windows/desktop/…
-
该方法返回与 IDXGISurface1 关联的 HDC;你用什么来实际创建对象?