Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/15: Рейтинг темы: голосов - 15, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 17.01.2018
Сообщений: 14

Пропустить Click через Panel

06.09.2018, 11:10. Показов 3064. Ответов 8

Студворк — интернет-сервис помощи студентам
Мне необходимо, чтобы Panel так скажем пропускал всевозможные действия мышью, ну или хотя бы клики. Нужно, чтобы контрол находящий за этим PaneL реагировал на всё это. PerformClick не поможет в моём случае... Visible = false тоже не прокатит, котрол должен оставаться видимым. Нужна ваша помощь и советы!
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
06.09.2018, 11:10
Ответы с готовыми решениями:

Из множества TextBox считать значения, и пропустить через формулу
Здравствуйте, есть 18 textbox, из них необходимо вытянуть значения и узнать среднее арифметическое. Я сделал это с помощью linq и массива....

Вызвать событие Click кнопки через делегат
Пытаюсь разобраться с событиями и делегатами, вроде бы понял, что событие можно назвать полем(или свойством) класса, которое содержит...

Нестыковка с перетаскиванием формы через компонент Panel
Использую: private Int32 tmpX; private Int32 tmpY; private bool MV = false; private void...

8
 Аватар для Shogun31337
557 / 534 / 225
Регистрация: 02.11.2016
Сообщений: 1,538
06.09.2018, 13:44
Цитата Сообщение от GolemtataMark2 Посмотреть сообщение
Нужно, чтобы контрол находящий за этим PaneL реагировал на всё это
в обработчике Panel_Click вызывайте обработчик клика нужного контрола. например, так:
C#
1
2
3
4
        private void Panel_Click(object sender, EventArgs e)
        {
            button_Click(null, null);
        }
0
0 / 0 / 0
Регистрация: 17.01.2018
Сообщений: 14
06.09.2018, 13:49  [ТС]
Боюсь, что так не выйдет, ибо заранее задний контрол не известен

Добавлено через 3 минуты
По сути своей, этот Panel организует зону, в которой возможно взаимодействие. Всё вышло уже, так работает, но если отправить его на задний план. Однако оказалось, что один из контрол просто нельзя передвинуть по этой Z-координате и соответственно мой способ перестаёт работать в этом случае, т.к. Panel перекрывает этот контрол, с которым необходимо организовать взаимодействие.
0
 Аватар для Shogun31337
557 / 534 / 225
Регистрация: 02.11.2016
Сообщений: 1,538
06.09.2018, 14:12
Цитата Сообщение от GolemtataMark2 Посмотреть сообщение
Боюсь, что так не выйдет, ибо заранее задний контрол не известен
Выйдет, если сделать словарь, в котором ключом будет контрол, а значением обработчик.

ЗЫ. а чем Вас PerformClick не устроил?
0
0 / 0 / 0
Регистрация: 17.01.2018
Сообщений: 14
06.09.2018, 14:31  [ТС]
PerformClick Есть не у всех элементов, ибо под этой панелью может быть часть какого-то контрола, и при этом у этой части просто не будет данного метода. Одна из строчек списка например.
Кроме этого, программа уже очень большая, в ней содержится тысяча проектов, и выдёргивать ото всюду различные элементы и приписывать к ним новые обработчики (так как далеко не всегда к элементу, на который необходимо нажать, подойдёт его собственный, т.к. надо задеть только лишь часть функционала)
Основной смысл этой затеи с панелью - упростить работу для программиста, который будет читать этот код и видоизменять его. Согласитесь, будет сложно бегать по проектам и искать где и какой контрол находится.
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18298 / 14222 / 5368
Регистрация: 17.03.2014
Сообщений: 28,898
Записей в блоге: 1
06.09.2018, 17:44
GolemtataMark2, попробуй прием с установкой стилей WS_EX_LAYERED, WS_EX_TRANSPARENT. Код лучше разместить в обработчике события HandleCreated.
1
0 / 0 / 0
Регистрация: 17.01.2018
Сообщений: 14
07.09.2018, 11:14  [ТС]
Я сделал, как вы, OwenGlendower, и предложили. В конструкторе отображается всё хорошо, даже элемент позади выделить получается. Однако, когда запускаешь программу, то Panel становится резко "нормальным"
В чём может быть причина? Либо же я не так понял суть текущего метода?
Вложения
Тип файла: zip TestThrooghClick.zip (48.3 Кб, 2 просмотров)
0
31 / 27 / 8
Регистрация: 25.05.2015
Сообщений: 113
07.09.2018, 16:38
Есть такая штука как переопределение WndProc в нужном контроле. Например, в коде ниже я блокировал перемещение окна за заголовок...

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
        protected override void WndProc(ref Message m)
        {
            const int SC_MOVE = 0xF010;
            switch (m.Msg)
            {
                case (int)WM.SYSCOMMAND:
                    int command = m.WParam.ToInt32() & 0xfff0;
                    if (command == SC_MOVE)
                        return;
                    break;
            }
            base.WndProc(ref m);
        }
Суть метода такова: при любом воздействии на вашу панель возникает WM команда (например клик, двойной клик и т.д.). Если вам надо передать клик в кнопку под панелью, то надо отловить нажатие на панель в месте где находится кнопка (вычислить координаты кнопки) и с помощью

C#
1
2
        [DllImport("User32.dll")]
        public static extern int SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam);
передать ей код события. Как то так... Где то я писал прозрачный контрол для кликов. Если найду проект скину код.
1
0 / 0 / 0
Регистрация: 17.01.2018
Сообщений: 14
11.09.2018, 11:08  [ТС]
Спасибо большое OwenGlendower и korochinskiy. Вы помогли и наставили на путь истинный!
Реализовал я это так (вдруг кому-то понадобится тоже):
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
    
public class TransparentPanel : Panel
    {
        private int WS_EX_TRANSPARENT = 0x00000020;
        private int WM_NCHITTEST = 0x84;
        private IntPtr HTTRANSPARENT = new IntPtr(-1);
 
        protected override CreateParams CreateParams
        {
            get
            {
                CreateParams cp = base.CreateParams;
                cp.ExStyle |= WS_EX_TRANSPARENT;
                return cp;
            }
        }
 
        protected override void OnPaintBackground(PaintEventArgs e)
        {
            //base.OnPaintBackground(e);
        }
 
        protected override void WndProc(ref Message m)
        {
            if (m.Msg == WM_NCHITTEST)
                m.Result = HTTRANSPARENT;
            else
                base.WndProc(ref m);
        }
    }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.09.2018, 11:08
Помогаю со студенческими работами здесь

На родительской форме расположена panel, при открытие дочерней формы, она прячется под panel
Как сделать, чтобы она была сверху?

Очистка текстбоксов и проверка их же на пустоту Panel в Panel
Добрый день! Есть панель Pan_F в ней текстбокс Tb_3 и панель Pan_FxFF в которой 2 текстбокса Tb_1 и Tb_2 вопрос: очищаю все...

Странное наложение Panel/Panel/PictureBox
На одной панели (белая область вокруг шахматной доски), расположена другая панель (сама шахматная доска), назовём их БПанель и МПанель...

Динамическое создание panel в panel
Доброго времени суток. Задача: нужно в панели вывести еще одну панель при нажатой радио кнопке. Первая панель создается с нужными...

Пропустить касание через окно
Делаю приложение которое будет в Service отлавливать события. Использую WindowManager для создания прозрачного окна в Service.Можно ли...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru