none
Как узнать,отображается ли у контрола сейчас полоса прокрутки? RRS feed

  • Вопрос

  • Интересует этот вопрос для контролов TextBox и WebBrowser. Требуется сделать следующее, вывести текст в эти контролы и если текст не поместился (т.е. появилась прокрутка), то увеличить размер этого контрола.
    • Перемещено Siddharth Chavan 1 октября 2010 г. 22:41 MSDN Forums Consolidation (От:Visual C#)
    29 декабря 2009 г. 8:11

Ответы

  • Если речь идет о WinForms, то для TextBox предлагаю обрабатывать событие TextChanged и сравнивать размеры клиентской области TextBox с размерами строкового содержимого отображаемого в нём, соотвественно изменять размеры TextBox, для WebBrowser предлагаю в событии DocumentСompleted смотреть размер области прокрутки документа и сравнивать с размером WebBrowser и менять его размеры соответсвенно. Вот примеры кода, которые можете приспособить для вашей ситуации.
            public Form1()
            {
                InitializeComponent();
                initWidth = textBox1.Width;
            }
            private int initWidth;
            private void textBox1_TextChanged(object sender, EventArgs e)
            {
                TextBox txt = (TextBox)sender;
                Graphics g = txt.CreateGraphics();
                if ((g.MeasureString(txt.Text, txt.Font).Width > txt.Width) || 
                    (textBox1.Width > initWidth))
                {
                    txt.Width = (int)Math.Ceiling(g.MeasureString(txt.Text, txt.Font).Width);
    
                }
            }
            private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
            {
                WebBrowser browser = (WebBrowser)sender;
                browser.Width = browser.Document.Body.ScrollRectangle.Width / 2;
                browser.Height = browser.Document.Body.ScrollRectangle.Width / 2;
                //MessageBox.Show(browser.Document.Body.ScrollRectangle.ToString());
            }
    • Помечено в качестве ответа I.Vorontsov 29 декабря 2009 г. 11:25
    29 декабря 2009 г. 10:25

Все ответы

  • Если речь идет о WinForms, то для TextBox предлагаю обрабатывать событие TextChanged и сравнивать размеры клиентской области TextBox с размерами строкового содержимого отображаемого в нём, соотвественно изменять размеры TextBox, для WebBrowser предлагаю в событии DocumentСompleted смотреть размер области прокрутки документа и сравнивать с размером WebBrowser и менять его размеры соответсвенно. Вот примеры кода, которые можете приспособить для вашей ситуации.
            public Form1()
            {
                InitializeComponent();
                initWidth = textBox1.Width;
            }
            private int initWidth;
            private void textBox1_TextChanged(object sender, EventArgs e)
            {
                TextBox txt = (TextBox)sender;
                Graphics g = txt.CreateGraphics();
                if ((g.MeasureString(txt.Text, txt.Font).Width > txt.Width) || 
                    (textBox1.Width > initWidth))
                {
                    txt.Width = (int)Math.Ceiling(g.MeasureString(txt.Text, txt.Font).Width);
    
                }
            }
            private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
            {
                WebBrowser browser = (WebBrowser)sender;
                browser.Width = browser.Document.Body.ScrollRectangle.Width / 2;
                browser.Height = browser.Document.Body.ScrollRectangle.Width / 2;
                //MessageBox.Show(browser.Document.Body.ScrollRectangle.ToString());
            }
    • Помечено в качестве ответа I.Vorontsov 29 декабря 2009 г. 11:25
    29 декабря 2009 г. 10:25
  • Задача усложнена двумя факторами. Первый, я не уточнил, чтоб не пугать народ :) , но меня интересует compact framework. Отличие в том, что там нет свойства  Document. Ну да ладно, подсказали мне вот это http://www.csharp-examples.net/check-scrollbars-visibility/ . Я выбрал по понятным причинам второй вариант. Но тут появилаь вторая загвоздка. Когда отрабатывает событие DocumentCompleted, то оказывается, что в этот момент контрол загрузил документ, но еще не отобразил его. Т.е. скроллов никаких еще нет  и в помине.  Вот как  узнать о том, что браузер не только загрузил документ, но и отобразил его?
    30 декабря 2009 г. 9:54
  • Проблема оказалась в другом. GetWindowLong для WebBrowser стабильно возвращает 0x50000000. Проверил код на других контролах, работает. Не понятно почему и не понятно, чего теперь делать...
    30 декабря 2009 г. 12:23
  • Ну на мой взгляд вопрос решён, но не для compact framework. В этом случае надо подумать=)
    30 декабря 2009 г. 12:37
  • В смысле надо создать другую тему? Просто сейчас вопрос в том, почему GetWindowLong не корректно работает для контрола webBrowser. ПРи чем не важно framework это или compact framework. Или все таки вопрос остается только более конкретным, как определить отображаетяс ли именно webBrowser в именно compact framework'e со скроллбаром :)

    30 декабря 2009 г. 13:57