Модераторы: gambit, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> SrollBar & ClientRectangle, Как получить полную область? 
:(
    Опции темы
skhilkov
Дата 27.7.2011, 07:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 371
Регистрация: 11.4.2006
Где: TOMSK

Репутация: нет
Всего: 7



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



--------------------
Кто понял жизнь, тот не спешит. 
PM MAIL   Вверх
skhilkov
Дата 27.7.2011, 09:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 371
Регистрация: 11.4.2006
Где: TOMSK

Репутация: нет
Всего: 7



Самое обидное - это то, что у чекЛистбокса есть свойство HorizontalScrollBar,
но нет свойства VerticalScrollBar


--------------------
Кто понял жизнь, тот не спешит. 
PM MAIL   Вверх
mr.DUDA
Дата 27.7.2011, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 24
Всего: 232



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

Пишем свой наследник от 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 чекедлистбокса. Профит!

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


--------------------
user posted image
PM MAIL WWW   Вверх
skhilkov
Дата 27.7.2011, 16:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 371
Регистрация: 11.4.2006
Где: TOMSK

Репутация: нет
Всего: 7



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

checkedListBox.ClientRectangle.Contains(e.Location)

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




--------------------
Кто понял жизнь, тот не спешит. 
PM MAIL   Вверх
mr.DUDA
Дата 27.7.2011, 18:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 24
Всего: 232



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);
            }
        }
    }
}


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

Это сообщение отредактировал(а) mr.DUDA - 27.7.2011, 18:37

Присоединённый файл ( Кол-во скачиваний: 1 )
Присоединённый файл  WindowsFormsApplication1.zip 10,24 Kb


--------------------
user posted image
PM MAIL WWW   Вверх
skhilkov
Дата 27.7.2011, 18:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 371
Регистрация: 11.4.2006
Где: TOMSK

Репутация: нет
Всего: 7



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

checkedListBox.ClientRectangle.Contains(e.Location)

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



--------------------
Кто понял жизнь, тот не спешит. 
PM MAIL   Вверх
skhilkov
Дата 23.8.2011, 14:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 371
Регистрация: 11.4.2006
Где: TOMSK

Репутация: нет
Всего: 7



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


--------------------
Кто понял жизнь, тот не спешит. 
PM MAIL   Вверх
Google
  Дата 21.2.2020, 07:11 (ссылка)  





  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Разработка Windows Forms | Следующая тема »


 




[ Время генерации скрипта: 0.0839 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.