Мне нужно нарисовать линию (с помощью мыши) над всем с C#. Я могу получить объект Graphics окна рабочего стола с помощью P/Invoke:Получить DeviceContext всего экрана с несколькими монтированиями
DesktopGraphics = Graphics.FromHdc (GetDC (IntPtr.Zero));
Однако все, что я рисую с использованием этого графического объекта, отображается только на левом мониторе, и ничего не отображается на правом мониторе. Это не терпит неудачу или что-то еще, это просто не показывает.
После того, как я создаю объект Graphics, он показывает, что область видимого клипа будет 1680 x 1050, что является разрешением моего левого монитора. Я могу только предположить, что это только получение контекста устройства для левого монитора. Является ли их способ получить контекст устройства для обоих мониторов (или любого числа)?
EDIT 3/7/2009: Дополнительная информация об исправлении я использовал.
Я использовал исправление, предоставленное colithium, чтобы создать следующий код для создания графического объекта для каждого монитора, а также способ хранения смещения, чтобы я мог переводить глобальные точки мыши на действительные точки на графике поверхность.
private void InitializeGraphics()
{
// Create graphics for each display using compatibility mode
CompatibilitySurfaces = Screen.AllScreens.Select(s => new CompatibilitySurface()
{
SurfaceGraphics = Graphics.FromHdc(CreateDC(null, s.DeviceName, null, IntPtr.Zero)),
Offset = new Size(s.Bounds.Location)
}).ToArray();
}
private class CompatibilitySurface : IDisposable
{
public Graphics SurfaceGraphics = null;
public Size Offset = default(Size);
public PointF[] OffsetPoints(PointF[] Points)
{
return Points.Select(p => PointF.Subtract(p, Offset)).ToArray();
}
public void Dispose()
{
if (SurfaceGraphics != null)
SurfaceGraphics.Dispose();
}
}
[DllImport("gdi32.dll")]
static extern IntPtr CreateDC(string lpszDriver, string lpszDevice, string lpszOutput, IntPtr lpInitData);
Хорошо, теперь это действительно, действительно странно. Ваш код работает для FillRectangle(), но не для DrawString и других методов объекта SurfaceGraphics. DrawString всегда использует первичный дисплей, без учета того, что SurfaceGraphics я использую, но FillRectangle ведет себя правильно. : | – Cipi