Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка Windows Forms > SrollBar & ClientRectangle


Автор: skhilkov 27.7.2011, 07:44
Привет )
Сегодня наткнулся на интересную вещь: есть у меня CheckedListbox,
мне нужно проверять событие клика мыши на  нем: попал или нет.
Использую чекЛистБокс.ClientRectangle.Contains(e.Location)
Интересное начинается если у литбокса появляется скроллбар.
ClientRectangle как я прочитал, не захватывает границы, скроллбары и тому подобное,
как выход, конечно, можно попробовать добавлять ширину скроллбара к клиентской области,
НО таких чеклистбоксов у меня много, и я не могу знать где есть скролл а где его нет,
по крайней мере я не нашел как это определить.
Может кто знает бубны на этот случай? ))

Автор: skhilkov 27.7.2011, 09:32
Самое обидное - это то, что у чекЛистбокса есть свойство HorizontalScrollBar,
но нет свойства VerticalScrollBar

Автор: mr.DUDA 27.7.2011, 11:45
(Кулхацкер моде он)

Пишем свой наследник от CheckedListBox:
Код

        public class MyCheckedListBox : CheckedListBox
        {
            private const uint WM_NCLBUTTONDOWN = 0x00A1;

            protected override void WndProc(ref Message m)
            {
                if (m.Msg == WM_NCLBUTTONDOWN)
                {
                    var pos = PointToClient(Cursor.Position);
                    OnMouseClick(new MouseEventArgs(MouseButtons.Left, 1, pos.X, pos.Y, 0));
                }

                base.WndProc(ref m);
            }
        }



В коде .Designer.cs формы заменяем CheckedListBox на MyCheckedListBox. Подписываемся на событие MouseClick чекедлистбокса. Профит!

(кулхацкер моде офф)

Автор: skhilkov 27.7.2011, 16:28
не понял как это должно работать, но все равно попытался - не работает )
Хотя, может я чего-то не догнал..
Мне надо чтобы в обработчике нажатия мыши работал этот код:
Код

checkedListBox.ClientRectangle.Contains(e.Location)

или работал любой другой код, который бы определял: попал я мышкой
в чекедлистбокс(включая скролл) или нет..


Автор: mr.DUDA 27.7.2011, 18:35
skhilkov, если пришло в обработчик MouseClick, то условие ClientRectangle.Contains(e.Location) по-любому уже выполнено, зачем его ещё раз отдельно проверять?

Код:
Код
using System;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void checkedListBox1_MouseClick(object sender, MouseEventArgs e)
        {
            MessageBox.Show("Oh yeah !!! " + e.Location.ToString());
        }

        public class MyCheckedListBox : CheckedListBox
        {
            private const uint WM_NCLBUTTONDOWN = 0x00A1;

            protected override void WndProc(ref Message m)
            {
                if (m.Msg == WM_NCLBUTTONDOWN)
                {
                    var pos = PointToClient(Cursor.Position);
                    OnMouseClick(new MouseEventArgs(MouseButtons.Left, 1, pos.X, pos.Y, 0));
                }

                base.WndProc(ref m);
            }
        }
    }
}


Проект в аттаче.

Автор: skhilkov 27.7.2011, 18:56
mr.DUDA
В том-то и дело, что не приходит. Дело в том, что обработчик мыши срабатывает в любом случае, 
потому как у чекЛистбокса установлено Capture=true,
поэтому и проверяю попал или не попал, если не попал - чекЛистбокс прячу.
И вот тут(!) происходит этот прикол - когда я хочу прокрутить чекЛистбокс,
то при клике на его скролбар, он пропадает, потому как не выполняется 
Код

checkedListBox.ClientRectangle.Contains(e.Location)

Вот я и хочу понять как мне эту ситуевину разрулить.

Автор: skhilkov 23.8.2011, 14:31
Попробовал примерно высчитать есть ли в данный момент скролл у чекедлистбокса исходя из количества айтемов, вроде получилось...
Теперь осталась одна проблема - при клике на полосу прокрутки лист не закрывается, но и полоса не прокручивается, так как у листа Capture все время true... Это еще раз доказывает,  что скроллбар существует как-то отдельно от самого компонента...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)