Как получить значение непубличных членов picturebox? - PullRequest
6 голосов
/ 22 июля 2010

Мне нужно получить значение прямоугольника изображения от непубличных членов picturebox.

Как получить это значение?

Заранее спасибо.

Ответы [ 3 ]

9 голосов
/ 22 июля 2010

Вот как получить значение, используя отражение:

PropertyInfo pInfo = pictureBox1.GetType().GetProperty("ImageRectangle", 
    System.Reflection.BindingFlags.Public | 
    System.Reflection.BindingFlags.NonPublic | 
    System.Reflection.BindingFlags.Instance);

Rectangle rectangle = (Rectangle)pInfo.GetValue(pictureBox1, null);

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

2 голосов
/ 22 июля 2010

Ну, вы могли бы делать это с отражением ... но вы не должны. Не совсем понятно, что вы подразумеваете под «значением прямоугольника изображения», но вам определенно следует попытаться сделать все это через общедоступный API. Чего ты пытаешься достичь? Там может быть по-другому.

РЕДАКТИРОВАТЬ: Хорошо, теперь я вижу свойство, к которому вы пытаетесь получить доступ ... вас может заинтересовать эта ошибка подключения , поданная в 2004 году. Вы не единственный, кто хочет этого. ... хотя вам это нужно по той же причине или нет, я не знаю.

0 голосов
/ 13 июля 2014

Хотя Нивас не утверждал, чего он хотел достичь, я подозреваю, что это похоже на то, на что я только что смотрел - перевод нарисованного пользователем (т.е. обрезанного) прямоугольника в пространство изображения в окне рисунка. Я не пробовал наследование, как предложил RvdK, я использовал метод отражения как быстрый обходной путь. Альтернативой предложению RvdK или открытию Microsoft доступа к ImageRectangle может быть предоставление метода RectangleToImageRectangle. Который я полагаю, я мог бы обернуть в объект, который наследуется от PB ...

Ссылка на проблему с Microsoft Connect не работает.

Вот код, который я использовал, он предоставляет прямоугольник изображения PB и был протестирован для режимов .Zoom и .StretchImage:

PropertyInfo pInfo = pictureBox1.GetType().GetProperty("ImageRectangle",
            System.Reflection.BindingFlags.Public |
            System.Reflection.BindingFlags.NonPublic |
            System.Reflection.BindingFlags.Instance);

Rectangle ImRectangle = (Rectangle)pInfo.GetValue(pictureBox1, null);

Point rTL = new Point((rectCropArea.Left - ImRectangle.Left) * pictureBox1.Image.Width / ImRectangle.Width,
                      (rectCropArea.Top - ImRectangle.Top) * pictureBox1.Image.Height / ImRectangle.Height);
Size rSz = new Size(pictureBox1.Image.Width * rectCropArea.Width / ImRectangle.Width,
                    pictureBox1.Image.Height * rectCropArea.Height / ImRectangle.Height);

'rect' = new Rectangle(rTL,rSz);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...