- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试重新制作使用 C++ 和 WinAPI 编写的 Windows 屏幕保护程序以在多台显示器上运行。我找到了 this article这给出了基础知识。但是当我在自己的代码中实现它时,我得到了一个奇怪的结果。看看这段代码:
case WM_PAINT:
{
PAINTSTRUCT ps = {0};
HDC hdcE = BeginPaint(hWnd, &ps );
EnumDisplayMonitors(hdcE, NULL, MyPaintEnumProc, 0);
EndPaint(hWnd, &ps);
}
break;
BOOL CALLBACK MyPaintEnumProc(
HMONITOR hMonitor, // handle to display monitor
HDC hdc1, // handle to monitor DC
LPRECT lprcMonitor, // monitor intersection rectangle
LPARAM data // data
)
{
MONITORINFO mi = {0};
mi.cbSize = sizeof(mi);
if(GetMonitorInfo(hMonitor, &mi))
{
//Is it a primary monitor?
BOOL bPrimary = mi.dwFlags & MONITORINFOF_PRIMARY;
DoDrawing(bPrimary, hdc1, &mi.rcMonitor);
}
return 1;
}
void DoDrawing(BOOL bPrimaryMonitor, HDC hDC, RECT* pRcMonitor)
{
//#define DIRECT_PAINT //Comment out for double-buffering
int nMonitorW = abs(pRcMonitor->right - pRcMonitor->left);
int nMonitorH = abs(pRcMonitor->bottom - pRcMonitor->top);
HDC hMemDC = ::CreateCompatibleDC(hDC);
if(hMemDC)
{
HBITMAP hMemBmp = ::CreateCompatibleBitmap(hDC, nMonitorW, nMonitorH);
if(hMemBmp)
{
HBITMAP hOldBmp = (HBITMAP)SelectObject(hMemDC, hMemBmp);
COLORREF clr, clrBorder;
if(bPrimaryMonitor)
{
clr = RGB(0, 128, 0); //Green
clrBorder = RGB(255, 0, 0);
}
else
{
clr = RGB(128, 0, 0); //Red
clrBorder = RGB(0, 255, 0);
}
RECT rcRect;
#ifndef DIRECT_PAINT
//With double-buffering
rcRect.left = 0;
rcRect.top = 0;
rcRect.right = nMonitorW;
rcRect.bottom = nMonitorH;
#else
rcRect = *pRcMonitor;
#endif
HBRUSH hBrush = ::CreateSolidBrush(clr);
#ifndef DIRECT_PAINT
//With double-buffering
::FillRect(hMemDC, &rcRect, hBrush);
#else
::FillRect(hDC, &rcRect, hBrush);
#endif
#ifndef DIRECT_PAINT
//With double-buffering
::BitBlt(hDC, pRcMonitor->left, pRcMonitor->top, nMonitorW, nMonitorH, hMemDC, 0, 0, SRCCOPY);
#endif
//Debugging output
CString _s;
_s.Format(_T("%s\n")
_T("%s\n")
_T("hDC=0x%X\n")
_T("hMemDC=0x%X\n")
_T("RcMonitor: L=%d, T=%d, R=%d, B=%d")
,
bPrimaryMonitor ? _T("Primary") : _T("Secondary"),
#ifndef DIRECT_PAINT
_T("Double-buffering"),
#else
_T("Direct paint"),
#endif
hDC,
hMemDC,
pRcMonitor->left,
pRcMonitor->top,
pRcMonitor->right,
pRcMonitor->bottom);
::DrawText(hDC, _s, _s.GetLength(), pRcMonitor, DT_NOCLIP | DT_NOPREFIX);
SelectObject(hMemDC, hOldBmp);
::DeleteObject(hMemBmp);
}
::DeleteDC(hMemDC);
}
}
绘画始终在主显示器上进行。但是当我画到副显示器上时,我只能直接画到它的DC上。当我使用双缓冲技术(DIRECT_PAINT 预处理器指令被注释掉)时,我只在辅助监视器上看到黑屏,而它本应是红色的。
我在这里附上两张截图。
第一个直接绘画的作品:
然后是失败的双缓冲:
知道我在这里做错了什么吗?
最佳答案
替换 WM_PAINT 的代码
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
EnumDisplayMonitors(hdc, NULL, MyPaintEnumProc, 0);
EndPaint(hWnd, &ps);
与
case WM_PAINT:
hdc = GetDC(NULL);
EnumDisplayMonitors(hdc, NULL, MyPaintEnumProc, 0);
ReleaseDC(NULL, hdc);
它会起作用的。
查看此 http://msdn.microsoft.com/en-us/library/windows/desktop/dd162610(v=vs.85).aspx .
关于c++ - 似乎无法使用多个显示器进行双缓冲绘画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12504472/
我的问题很简单,我相信我只是遗漏了一些小东西,但我不知道它是什么。 我知道如何使用 GraphicsEnvironment、GraphicsConfiguration 和 GraphicsDevice
我目前正在使用一台机器,它的两侧有 2 个显示器。它有一个类似操纵杆的 4 个按钮,用于控制中央机械手的运动。它们都显示相同的屏幕,即显示 1 在第二个屏幕上重复显示。它们都是触摸屏。我希望它们根据用
虽然容器应该具有连接到显示器所需的权限,但我每次都收到此错误: docker exec -it my_container /# rqt QStandardPaths: XDG_RUNTIME_DIR
有没有办法通过 OS X 中的终端获取有关连接的显示器和显示器及其分辨率的信息? 我有一些安装在多台显示器上运行,有时如果没有连接显示器,GFLW 窗口似乎无法打开 - 我想检查显示器是否正确连接,并
本质上,我要完成的是让一个矩形显示器侧向(垂直方向),Android 显示屏处于纵向位置。由于显示器的限制,在显示器本身上旋转显示是不可行的。首先我设置禁用自动旋转,然后将其设置为纵向模式。 adb
我一直在思考一个我想开发的项目的可行性,我不知道是否可行。我想要的是一台标准的 Linux 计算机,当另一台机器通过 USB 插入它时,让它像 USB 显示器一样工作; IE。如果我用标准 USB 线
在 Windows 中,我们有关于我们的 Monitros 的信息——一些唯一的名称和 ID。例如 宏碁 xxx 三星xxx 我对如何在 C# 中获取信息有疑问,因为我知道我们可以从 WMI 获取序列
如何检测笔记本电脑/上网本中插入的显示器并在检测到后启用克隆显示 View ? 非常感谢 最佳答案 您可以使用 EnumDisplaySettingsEx() 这是类似的问题:How do I ena
我有一个使用 AWT 的 Java 程序,我想在 headless 系统上运行它。该程序的显示除了显示统计信息外什么都不做。当程序完成时,它退出。显示屏上没有用户交互。该程序创建了一个我在构建系统中使
我发现了很多关于 Retina Display 的问题,但没有一个答案在服务器端。 我想根据屏幕提供不同的图像,例如(在 PHP 中): if( $is_retina) $thumbnail
我在一个容器中显示多个 DIV,我希望它们在右侧没有更多空间时换行。它在 IOS 上运行良好,但我无法使其在 Android 上运行... -webkit-flex-wrap: wrap; -moz-
我在本地计算机上运行 matlab,并从 Java 调用以下函数(在 tomcat Web 服务器中运行): function df = getFig(file) f = openfig(fi
我想开发一个使用两个屏幕来显示信息的 Android 应用程序。例如:一个屏幕显示应用程序,另一个屏幕显示有关当前应用程序状态的一些信息。 我的问题:android 是否支持两个显示器/屏幕?您将如何
我想编写一个 Python 程序,自动查找和识别连接到我的计算机 (Windows) 的多个显示设备。此外,我还想以编程方式在其中一个设备中启动显示 session (例如幻灯片放映)。知道如何做到这
所以我的 Vista 机器设置为在 10 分钟后关闭显示器。 (注意:机器没有挂起或休眠) 我有一个 .Net 应用程序正在运行,它需要在指定时间“唤醒”系统。作为人类,您只需移动鼠标或按下一个键。我
如何校准 Mac 显示器以匹配 iPhone 的颜色? iPhone 的 Gamma 值是多少? 谢谢。 最佳答案 根据this article ,gamma 为 1.8,这就是 Mac OSX Le
有没有办法用 cocoa 禁用屏幕保护程序和显示器 sleep ? 最佳答案 OSX 10.8 中已弃用 UpdateSystemActivity(OverallAct) 的使用。 现在推荐的方法是通
我正在尝试将 wkhtmltopdf 与 Django、nginx、uwsgi 一起使用 它在使用 manage.py runserver 运行的开发环境中完美运行 但是当与 nginx ans uw
我正在使用 xmonad(具有最小配置,main = xmonad gnomeConfig{ modMask = mod4Mask,terminal = "gnome-terminal"}),我的计算
直接写入帧缓冲区不再有效。无论如何要写入 NDK 中的显示器?我可能会使用 ANativeWindow 但这需要一个现有的表面。有没有更好的办法?或者是在本地创建表面然后使用 ANativeWindo
我是一名优秀的程序员,十分优秀!