Сделайте карту крупным планом в C#
В этом примере карта крупным планом отображает увеличенную область под мышью, когда вы перемещаете ее по карте. Программа хранит увеличенную версию карты в скрытом PictureBox с именем picHidden. Когда мышь перемещается, программа копирует часть этого изображения поверх более мелкого изображения, которое видно, что дает крупный план области под мышью.
Следующий код показывает, как запускается программа.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
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); } |
Этот код сначала определяет некоторые константы. Затем, когда форма загружается, она сохраняет ссылки на большие (скрытые) и маленькие (видимые) изображения. Он также делает копию небольшого изображения для последующего изменения.
Программа выполняет следующий код, когда мышь перемещается по видимой карте.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
// Подготовьте новое изображение карты. 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, чтобы сделать этот эллипс прозрачным.
Далее код копирует оригинальную маленькую карту в модифицированную версию, чтобы удалить предыдущий крупный план. Он копирует кусок большой карты на измененный.
Затем программа копирует патч поверх расширенной области. Поскольку патч содержит прозрачное отверстие, это оставляет эллиптическую область в среднем увеличенном, но делает углы вне эллипса похожими на лежащую ниже небольшую карту.