Проблемы с добавлением пользовательского элемента управления в winforms tabcontrol

У меня возникли проблемы с динамическим добавлением настраиваемого элемента управления масштабированием и панорамированием окна изображения на страницу tabcontrol.tabpage во время выполнения. Я много пробовал, и мне было интересно, может ли кто-нибудь из вас, умные ребята, дать какой-нибудь совет для бедного новичка, такого как я... вот некоторый код...

using Microsoft.VisualBasic;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
using System.ComponentModel;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;
namespace TAQTv4
{
    public class ZoomPanPicBox : ScrollableControl
    {
        private Image _image;
        //Double buffer the control
        public ZoomPanPicBox()
        {
            this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint | ControlStyles.ResizeRedraw | ControlStyles.UserPaint | ControlStyles.DoubleBuffer, true);
            this.AutoScroll = true;
            this.Image = null;
            this.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
            this.Zoom = 1f;
        }
        //New
        [Category("Appearance"), Description("The image to be displayed")]
        public Image Image
        {
            get { return _image; }
            set
            {
                _image = value;
                UpdateScaleFactor();
                Invalidate();
            }
        }
        private float _zoom = 1f;
        [Category("Appearance"), Description("The zoom factor. Less than 1 to reduce. More than 1 to magnify.")]
        public float Zoom
        {
            get { return _zoom; }
            set
            {
                if (value < 0 || value < 1E-05)
                {
                    value = 1E-05f;
                }
                _zoom = value;
                UpdateScaleFactor();
                Invalidate();
            }
        }
        private void UpdateScaleFactor()
        {
            if (_image == null)
            {
                this.AutoScrollMargin = this.Size;
            }
            else
            {
                this.AutoScrollMinSize = new Size(Convert.ToInt32(this._image.Width * _zoom + 0.5f), Convert.ToInt32(this._image.Height * _zoom + 0.5f));
            }
        }
        //UpdateScaleFactor
        private InterpolationMode _interpolationMode = InterpolationMode.High;
        [Category("Appearance"), Description("The interpolation mode used to smooth the drawing")]
        public InterpolationMode InterpolationMode
        {
            get { return _interpolationMode; }
            set { _interpolationMode = value; }
        }
        protected override void OnPaintBackground(PaintEventArgs pevent)
        {
        }
        //OnPaintBackground
        protected override void OnPaint(PaintEventArgs e)
        {
            //if no image, don't bother. I tried check for IsNothing(_image) but this test wasn't detecting a no-image.
            if (_image == null)
            {
                base.OnPaintBackground(e);
                return;
            }
            //Added because the first test sometimes failed
            try
            {
                int H = _image.Height;
                //Throws an exception if image is nothing.
            }
            catch (Exception ex)
            {
                base.OnPaintBackground(e);
                return;
            }
            //Set up a zoom matrix
            Matrix mx = new Matrix(_zoom, 0, 0, _zoom, 0, 0);
            mx.Translate(this.AutoScrollPosition.X / _zoom, this.AutoScrollPosition.Y / _zoom);
            e.Graphics.Transform = mx;
            e.Graphics.InterpolationMode = _interpolationMode;
            e.Graphics.DrawImage(_image, new Rectangle(0, 0, this._image.Width, this._image.Height), 0, 0, _image.Width, _image.Height, GraphicsUnit.Pixel);
            base.OnPaint(e);
        }
        //OnPaint
    }
}
//ZoomPicBox

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

public void loadImagesToTabControl()
{
    int i = 0;


    foreach (Bitmap bitmap in intDwg.getBitmaps())
    {
        //ToDo add pic boxes and tabs and bitmaps to tabcontrol1

        TAQTv4.ZoomPanPicBox picBox = new TAQTv4.ZoomPanPicBox();
        picBox.Image = bitmap;

        picBox.Anchor = AnchorStyles.Top;
        picBox.Anchor = AnchorStyles.Bottom;
        picBox.Anchor = AnchorStyles.Left;
        picBox.Anchor = AnchorStyles.Right;
        picBox.AutoScroll = true;
        picBox.CausesValidation = true;
        picBox.Visible = true;
        picBox.Zoom = 1;
        picBox.BackgroundImageLayout = ImageLayout.Tile;
        picBox.Location = new System.Drawing.Point(0, 0);
        picBox.TabStop = true;
        picBox.Enabled = true;
        picBox.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
        picBox.CreateControl();





        string title = "Pg " + (tabControl1.TabCount + 1).ToString();
        TabPage myTabPage = new TabPage(title);
        tabControl1.TabPages.Add(myTabPage);
        tabControl1.TabPages[i].Controls.Add(picBox);
        i++;



        /* Possible pictureBox Implementation...
        string title = "Pg " + (tabControl1.TabCount + 1).ToString();
        TabPage myTabPage = new TabPage(title);
        tabControl1.TabPages.Add(myTabPage);
        PictureBox picbox = new PictureBox();
        picbox.Anchor = AnchorStyles.Top;
        picbox.Anchor = AnchorStyles.Bottom;
        picbox.Anchor = AnchorStyles.Left;
        picbox.Anchor = AnchorStyles.Right;
        picbox.Image = bitmap;
        picbox.Height = 800;
        picbox.Width = 1300;
        tabControl1.TabPages[i].Controls.Add(picbox);                
        i++;
        */
    }
}

}

И последнее примечание... реализация pictureBox также работала нормально, поэтому я знаю, что прекрасно извлекаю свои изображения с диска в методе десериализации моего класса intDwg. Любые мысли будут высоко оценены! Заранее спасибо!

ОБНОВИТЬ:

Я получил контроль над загрузкой изображений, установив для backgroundimage растровое изображение вместо picBox.Image.... РАЗОЧАРОВАНИЕ.... но кажется, что то, как я его настроил, изображение не привязано правильно... пытаясь улучшить это и разработайте это сейчас ... любые советы и рекомендации были бы просто потрясающими! Спасибо!

ОБНОВИТЬ:

Снимок экрана... как вы можете видеть, страницы вкладок загружаются правильно и по одной для каждого растрового изображения в моей коллекции, но пользовательский элемент управления zoomPanPicBox, похоже, не хочет отображаться! Смотрите ниже:

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

https://www.dropbox.com/s/ogj5jlcce831n3p/scrst.png?v=0mcns

...

ОБНОВЛЕНИЕ СНОВА ПОЛУЧИЛО СПАСИБО Все отсутствовало, устанавливая размер, как вы упомянули, используя следующее: picBox.SetBounds(0, 0, 300, 300);

:D:D:D:D:D:D:)


person OverCodingUnderSleeping    schedule 30.05.2013    source источник
comment
Вам нужно задать для пикбокса Size()!   -  person Idle_Mind    schedule 30.05.2013
comment
Вы говорите буквально о picbox, а не о picBox ... поскольку я решил, что лучше использовать реализацию пользовательского элемента управления, а не реализацию Windows PictureBox. Реализация PictureBox на данный момент работает нормально... Я пытаюсь реализовать zoomPanPicBox....   -  person OverCodingUnderSleeping    schedule 31.05.2013
comment
Я имел в виду буквально picBox, так как это имя вашей переменной типа ZoomPanPicBox. Вы не указали размер. Было бы полезно, если бы вы могли показать скриншот того, как это не работает...   -  person Idle_Mind    schedule 31.05.2013
comment
Насколько я знаю, ZoomPanPicBox не имеет члена var для размера.... он наследуется от прокручиваемого элемента управления, который я нашел способ получить size.width и size.height... но не нашел способ их установить ... позвольте мне сделать снимок экрана ... спасибо за помощь: D   -  person OverCodingUnderSleeping    schedule 31.05.2013
comment
СПАСИБО Idle_Mind Я бы поставил ++, но мой ‹ приемлемо RepPlusPlusMin .... ах, пошутите и возьмите этот REP ++ в любом случае. Спасибо!   -  person OverCodingUnderSleeping    schedule 31.05.2013


Ответы (1)


Кроме того, вместо использования счетчика:

    TabPage myTabPage = new TabPage(title);
    tabControl1.TabPages.Add(myTabPage);
    tabControl1.TabPages[i].Controls.Add(picBox);
    i++;

Просто используйте ссылку «myTabPage»:

    TabPage myTabPage = new TabPage(title);
    myTabPage.Controls.Add(picBox);
    tabControl1.TabPages.Add(myTabPage);
person Idle_Mind    schedule 30.05.2013
comment
Совершенно верно Idle_Mind Я даже не думал об этом... Я немного нуб, как вы можете заметить. Спасибо! - person OverCodingUnderSleeping; 31.05.2013