gpt4 book ai didi

c++ - Win32 Screensaver 多台显示器,主显示器不在最左边

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:28:11 25 4
gpt4 key购买 nike

我制作了一个屏幕保护程序,它可以简单地从右向左滚动用户定义的文本,如果超出左边界则自动跳回到右边。

它可以完美地与多台显示器配合使用,除了一个异常(exception):如果“主显示器”位于右侧(即显示器 #2 是主要显示器),那么我看不到滚动文本,但是监视器被代码黑了。如果主显示器是 #1,则没有问题。

我已经研究代码几个小时了,无法确定问题出现在哪个阶段;我可以确认文本位于正确的位置(我插入了验证其当前位置的日志记录代码),但就好像其中一个 API 调用只是将其删除一样。我已经阅读了他们的文档,看起来一切正常。

我通过以下方式在 WM_CREATE 中创建自定义 DC:

if (( hDC = CreateDC(TEXT("DISPLAY"), NULL, NULL, NULL)) == NULL )

为了防止闪烁,我创建了要更新的兼容对象:

void
TickerScreensaver::Paint_Prep(HDC hDC)
{
_devcon_mem = CreateCompatibleDC(hDC);
_devcon_orig = hDC;
_bmp_mem = CreateCompatibleBitmap(hDC, _width, _height);
}

并且在 WM_PAINT 中绘制时(在 BeginPaint 等之后),执行到实际设备上下文的位 block 传输:

void
TickerScreensaver::Paint(HDC hDC, RECT rect)
{
_bmp_orig = (HBITMAP)SelectObject(_devcon_mem, _bmp_mem);

FillRect(_devcon_mem, &rect, (HBRUSH)GetStockObject(BLACK_BRUSH));

if ( _gdiplus_token != NULL )
{
Graphics graphics(_devcon_mem);
SolidBrush brush(cfg.display.font_colour);
FontFamily font_family(cfg.display.font_family.c_str());
Font font(&font_family, cfg.display.font_size, FontStyleRegular, UnitPixel);
PointF point_f((f32)cfg.display.text_pos.x, (f32)cfg.display.text_pos.y);
RectF layout_rect(0, 0, 0, 0);
RectF bound_rect;

graphics.SetTextRenderingHint(TextRenderingHintAntiAlias);

graphics.MeasureString(cfg.display.text.c_str(), cfg.display.text.length(), &font, layout_rect, &bound_rect);
cfg.display.offset.x = (DWORD)(0 - bound_rect.Width);
cfg.display.offset.y = (DWORD)(bound_rect.Height / 2);

graphics.DrawString(cfg.display.text.c_str(), cfg.display.text.length(), &font, point_f, &brush);
}

BitBlt(hDC, 0, 0, _width, _height, _devcon_mem, 0, 0, SRCCOPY);

SelectObject(_devcon_mem, _bmp_orig);
}

我这样计算尺寸:

void
TickerScreensaver::GetFullscreenRect(HDC hDC, RECT *rect)
{
RECT s = { 0, 0, 0, 0 };

if ( EnumDisplayMonitors(hDC, NULL, EnumMonitorCallback, (LPARAM)&s) )
{
CopyRect(rect, &s);

s.left < 0 ?
_width = s.right + (0 + -s.left) :
_width = s.right;

s.top < 0 ?
_height = s.bottom + (0 + -s.top) :
_height = s.bottom;
}
}

请注意,计算出的宽度、高度等均为 100% 准确;纯粹是绘图代码在主显示器上似乎不起作用,只有当它在右侧时(将原点设置为 {0,0},监视器 #1 然后为负值)。它也可以在三显示器上重现,主要在中央。

最佳答案

好吧,事实证明它很好也很简单 - 在 Paint() 中,我们应该使用一个使用真实宽度和高度的矩形,而不是检索到的包含负值的矩形(实际检索到的那个来自 API 函数):

RECT r = { 0, 0, _width, _height }; 

_bmp_orig = (HBITMAP)SelectObject(_devcon_mem, _bmp_mem);

FillRect(_devcon_mem, &r, (HBRUSH)GetStockObject(BLACK_BRUSH));

关于c++ - Win32 Screensaver 多台显示器,主显示器不在最左边,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15908022/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com