Сделайте карту крупным планом в C#

В этом примере карта крупным планом отображает увеличенную область под мышью, когда вы перемещаете ее по карте. Программа хранит увеличенную версию карты в скрытом PictureBox с именем picHidden. Когда мышь перемещается, программа копирует часть этого изображения поверх более мелкого изображения, которое видно, что дает крупный план области под мышью.

Следующий код показывает, как запускается программа.

private const int ScaleFactor = 2;
private const int SmallRadius = 25;
private const int BigRadius = SmallRadius * ScaleFactor;
private const int BigDiameter = 2 * BigRadius;

private int OriginalWid, OriginalHgt;
private Bitmap BigMap, OriginalMap, ModifiedMap, MapPatch;
private Rectangle PatchRect =
    new Rectangle(0, 0, BigDiameter, BigDiameter);
private Rectangle SrcRect =
    new Rectangle(0, 0, BigDiameter, BigDiameter);
private Rectangle DestRect =
    new Rectangle(0, 0, BigDiameter, BigDiameter);

// Сохраним исходное изображение маленькой карты.
private void Form1_Load(object sender, EventArgs e)
{
    OriginalWid = picMap.Image.Width;
    OriginalHgt = picMap.Image.Height;

    // Сохранить большую карту.
    BigMap = (Bitmap)picHidden.Image;

    // Сохраним исходную карту.
    OriginalMap = (Bitmap)picMap.Image;

    // Создаем копию для отображения.
    ModifiedMap = (Bitmap)(OriginalMap.Clone());

    // Создаем область патча.
    MapPatch = new Bitmap(BigDiameter, BigDiameter);
}

Этот код сначала определяет некоторые константы. Затем, когда форма загружается, она сохраняет ссылки на большие (скрытые) и маленькие (видимые) изображения. Он также делает копию небольшого изображения для последующего изменения.

Программа выполняет следующий код, когда мышь перемещается по видимой карте.

// Подготовьте новое изображение карты.
private void picMap_MouseMove(object sender, MouseEventArgs e)
{
    // Отрегулируйте, где находятся растровые изображения источника и адресата.
    SrcRect.X = e.X * ScaleFactor - BigRadius;
    SrcRect.Y = e.Y * ScaleFactor - BigRadius;
    DestRect.X = e.X - BigRadius;
    DestRect.Y = e.Y - BigRadius;

    // Сделайте часть маленькой карты с прозрачным отверстием в ней.
    using (Graphics gr = Graphics.FromImage(MapPatch))
    {
        // Нарисуем небольшое изображение карты в патч.
        gr.DrawImage(OriginalMap, PatchRect, DestRect,
            GraphicsUnit.Pixel);

        // Сделайте прозрачное отверстие в патче.
        using (SolidBrush br =
            new SolidBrush(Color.FromArgb(255, 1, 2, 3)))
        {
            gr.FillEllipse(br, PatchRect);
            MapPatch.MakeTransparent(br.Color);
        }
    }

    using (Graphics gr = Graphics.FromImage(ModifiedMap))
    {
        gr.SmoothingMode = SmoothingMode.AntiAlias;

        // Восстановить исходную карту.
        gr.DrawImage(OriginalMap, 0, 0, OriginalWid, OriginalHgt);

        // Скопируем в него кусок большого изображения.
        gr.DrawImage(BigMap, DestRect, SrcRect, GraphicsUnit.Pixel);

        // Рисуем патч, чтобы сделать крупным планом круглый.
        gr.DrawImage(MapPatch, DestRect, PatchRect,
            GraphicsUnit.Pixel);

        // Очертите область.
        gr.DrawEllipse(Pens.Blue, DestRect);

        // Отображение результата.
        picMap.Image = ModifiedMap;
    }
}

При перемещении мыши программа корректирует исходный и целевой прямоугольники для больших и малых карт. Они указывают, какая часть большого изображения копируется на какую часть маленького изображения.

Затем код копирует небольшое изображение карты в растровое изображение MapPatch. Он заполняет эллипс в центре патча и использует MakeTransparent, чтобы сделать этот эллипс прозрачным.

Далее код копирует оригинальную маленькую карту в модифицированную версию, чтобы удалить предыдущий крупный план. Он копирует кусок большой карты на измененный.

Затем программа копирует патч поверх расширенной области. Поскольку патч содержит прозрачное отверстие, это оставляет эллиптическую область в среднем увеличенном, но делает углы вне эллипса похожими на лежащую ниже небольшую карту.

Источник: http://csharphelper.com/blog/2015/07/make-a-closeup-map-in-c/

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (Пока оценок нет)
Adblock
detector