Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
3 / 2 / 2
Регистрация: 26.05.2021
Сообщений: 150

Как получить PointToClient, с изображения, если оно центрировано по panel

31.05.2021, 01:54. Показов 1923. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть panel, а внутри picturebox. Изображение меньше чем panel по одной из сторон, и оно центрировано. Как следствие - пустые пиксели (в данном случае, сверху и снизу). Требуется: получить PointToClient, но с ИЗОБРАЖЕНИЯ, а не с picturebox.
Скриншот добавил ниже, красная точка - точка клика. Ожидаемый результат - точка отсутствует (или отрицательная, смотря как себя ведет c# в таких условиях), реальный результат - рассчет идет от picturebox, а не от изображения, и пустые пиксели тоже учитываются, ввиду чего указывается координата.
C#
1
Point point = picturebox.PointToClient(Cursor.Position); // кликаю - получаю координату окна (но не ту, что нужна)
Изображения
 
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
31.05.2021, 01:54
Ответы с готовыми решениями:

PointToClient с динамическими контролами
WinForms. Создаю динамический PictureBox координаты какието от фени.... и?.. надо задать вопрос...

На родительской форме расположена panel, при открытие дочерней формы, она прячется под panel
Как сделать, чтобы она была сверху?

Динамическое создание panel в panel
Доброго времени суток. Задача: нужно в панели вывести еще одну панель при нажатой радио кнопке....

2
 Аватар для ViterAlex
8952 / 4864 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
31.05.2021, 13:05
Лучший ответ Сообщение было отмечено Pandamonk как решение

Решение

Я так понимаю, что SizeMode = Zoom?
C#
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
/// <summary>
/// Перевод экранной координаты в координаты изображения, находящего в PictureBox
/// </summary>
static Point PicturePointToClient(PictureBox pb, Point pt)
{
    if (pb.Image == null)
    {
        return Point.Empty;
    }
    var picW = (float)pb.Image.Width;
    var picH = (float)pb.Image.Height;
    //Фактическая ширина и высота изображения
    float w, h;
    if (pb.ClientRectangle.Width > pb.ClientRectangle.Height)
    {
        w = pb.ClientRectangle.Height * (picW / picH);
        h = pb.ClientRectangle.Height;
    }
    else
    {
        w = pb.ClientRectangle.Width;
        h = pb.ClientRectangle.Width / (picW / picH);
    }
    //Соотношение сторон
    var r = picW / w;
    //Смещение изображения от границ PictureBox
    var dx = (pb.ClientRectangle.Width - w) / 2;
    var dy = (pb.ClientRectangle.Height - h) / 2;
    //Результирующая точка
    var result = pb.PointToClient(pt);
    result.Offset(-(int)dx, (int)dy);
    //С учётом масштаба.
    result = new Point((int)(result.X * r), (int)(result.Y * r));
    return result;
}
1
3 / 2 / 2
Регистрация: 26.05.2021
Сообщений: 150
31.05.2021, 16:53  [ТС]
@ViterAlex, предполагал, что придется считать отступы, но в целом, надеялся на существования уже готового метода именно в самом классе, который учитывает отступ, но не мог его найти. Также думал создать новое пустое изображение поверх старого, вычислив координаты в клиенте, и использовать его как объект для координаты, но все равно все сводилось к рассчету отступов (винформ изучаю на-практике как-есть, и последнее пытался понять до прочтения вашего сообщения, - что такое dock, archon и margin, предполагая, что что-то из этого даст доступ к значению отступов)
SizeMode всегда стоит как CenterImage, чуть ранее это же изображение большего размера загружается в больший пикчербокс, в котором происходит *скалирование* (код ниже) под малый пикчербокс, как следствие, если стороны изображения в оригинале не равны - в миникопии всегда будут отступы с пустыми пикселями.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
// проверка большого изображения, что длиннее, чтобы понять, как потом отобразить минимизированное изображение в малом пикчербоксе
if (bitmap.Width > bitmap.Height) // если ширина большого больше длины - изображение должно влезть по ширине
{
   zoomBoxScaling = 1f * pictureBox.Image.Width / zoomBox.Width; // вычисление значение делителя
   // на него будет делиться оригинальный размер изображения
}
else // и наоборот
{
   zoomBoxScaling = 1f * pictureBox.Image.Height / zoomBox.Height;
}
// и впоследствии
zoomBitmap = new Bitmap(bitmap, Convert.ToInt32(bitmap.Width / zoomBoxScaling), Convert.ToInt32(bitmap.Height / zoomBoxScaling)); // создается малый битмап для на основе большого
zoomBox.Image = zoomBitmap ; // ...и помещается в созданный для него пикчербокс *zoomBox*
Добавлено через 1 час 42 минуты
И вопрос сверху. Этот способ работает, но при координатах больше\меньше, чем размер изображения, создаются значения, которых в действительности не существует (отрицательные значения к примеру). Я это поправил кодом ниже через изменение координат, но чтение координаты все равно идет с области пикчербокса, а не изображения, поэтому в идеале хотелось бы просто создавать новую пустую область поверх текущего изображения как только изображение загружено, основываясь на смещениях, что вы предоставили выше, чтобы уже с нее получать значение позиции точки и не иметь возможности получать координаты, если точка вне области.
Посоветуйте объект\класс, который мог бы тут помочь. Может, это прозрачный битмап размером с изображение, который будет ставится на координатах старого изображения (с учетом его смещения с вашим кодом), и с него уже идет PicturePointToClient, или еще что
C#
1
2
3
4
result.X = (result.X < 0) ? 0 : result.X; // если не вмещается, то отрицательные значения убираются
result.Y = (result.Y < 0) ? 0 : result.Y;
result.X = (result.X > pb.Image.Width) ? pb.Image.Width : result.X; // как и сверхположительные за границами изображения
result.Y = (result.Y > pb.Image.Height) ? pb.Image.Height : result.Y;
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
31.05.2021, 16:53
Помогаю со студенческими работами здесь

Странное наложение Panel/Panel/PictureBox
На одной панели (белая область вокруг шахматной доски), расположена другая панель (сама шахматная...

Очистка текстбоксов и проверка их же на пустоту Panel в Panel
Добрый день! Есть панель Pan_F в ней текстбокс Tb_3 и панель Pan_FxFF в которой 2 текстбокса...

В Panel-е не появляется скрол, а сам Panel выезжает за границу экрана
Здравстуйте, уважаемые форумчане! Столкнулся со следующей проблемой, на веб-странице есть таблица...

Panel поверх Panel
Необходимо чтобы при нажатии на &quot;День 1&quot; и &quot;День 2&quot; показывались кнопки &quot;1/1, 1/2&quot; и &quot;2/1, 2/2&quot;...

Создание panel под panel
Здравствуйте форумчане, не получается сделать так, чтобы при нажатии на кнопку на форме, в panel...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача №1: при указании работ (справочник РаботыПоРемонтуСпецтехники),. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru