Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / WPF, Silverlight Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2]      все
 Re: Клики сквозь форму  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 37082
MrKoder
Можно, пожалуйста, пример
Я не так давно работаю с c# и wpf, еще не сталкивался с onPaint
как вывести в плагин onPaint тебе подскажут боее опытные в WPF.
Я помог переформулировать задачу, т. к. рисовать надо не в новом окне и потом бороться с перехватом мышки, а окне приложения.
7 ноя 18, 09:59    [21726153]     Ответить | Цитировать Сообщить модератору
 Re: Клики сквозь форму  [new]
MrKoder
Member

Откуда:
Сообщений: 45
Petro123,
Хорошо, спасибо! Буду ждать, мб кто поможет
7 ноя 18, 19:34    [21727301]     Ответить | Цитировать Сообщить модератору
 Re: Клики сквозь форму  [new]
Roman Mejtes
Member

Откуда: г. Пермь
Сообщений: 3171
MrKoder
Petro123,
Хорошо, спасибо! Буду ждать, мб кто поможет

разве вам не помог пост с 1 страницы?

вот готовое решение, я проверил, всё работает:

файл с вызовом WinAPI, в нём какая то сомнительная муть со словарем, которую явно надо выкинуть, оставляю это вам, мне то это нафиг не надо :) в данный момент
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Windows;
using System.Windows.Interop;

namespace Meytes.WPF.Helpers
{
    internal static class WindowTransparentHelper
    {
        /// <summary> Справочник в котором хранятся старые состояния стиля окон </summary>
        private static readonly Dictionary<IntPtr, int> s_extendedStyleHwndDictionary
            = new Dictionary<IntPtr, int>();

        private const int WS_EX_TRANSPARENT = 0x00000020;
        private const int GWL_EXSTYLE = (-20);

        [DllImport("user32.dll", EntryPoint = "GetWindowLong")]
        private static extern int GetWindowLong(IntPtr hwnd, int index);

        [DllImport("user32.dll", EntryPoint = "SetWindowLong")]
        private static extern int SetWindowLong(IntPtr hwnd, int index, int newStyle);

        /// <summary> Делает окно прозрачным для ввода мышки </summary>
        /// <param name="hwnd">HWND окна</param>
        public static void SetWindowExTransparent(IntPtr hwnd)
        {
            int extendedStyle = GetWindowLong(hwnd, GWL_EXSTYLE);
            SetWindowLong(hwnd, GWL_EXSTYLE, extendedStyle | WS_EX_TRANSPARENT);
            if (s_extendedStyleHwndDictionary.Keys.Contains(hwnd) == false)
            {
                s_extendedStyleHwndDictionary.Add(hwnd, extendedStyle);
            }
        }

        /// <summary> Отключает прозрачность для ввода мышки у окна</summary>
        /// <param name="hwnd">HWND окна</param>
        public static void UndoWindowExTransparent(IntPtr hwnd)
        {
            if (s_extendedStyleHwndDictionary.Keys.Contains(hwnd))
            {
                int extendedStyle = s_extendedStyleHwndDictionary[hwnd];
                SetWindowLong(hwnd, GWL_EXSTYLE, extendedStyle);
            }
        }
    }

    public class PopupTransparentBehavior
    {
        /// <summary> Прикрепляемое свойство зависимости отвечающее за прозрачность формы для ввода </summary>
        public static readonly DependencyProperty IsPopupEventTransparentProperty =
            DependencyProperty.RegisterAttached("IsPopupEventTransparent",
                                                typeof(bool),
                                                typeof(PopupTransparentBehavior),
                                                new UIPropertyMetadata(false, OnIsPopupEventTransparentPropertyChanged));

        public static bool GetIsPopupEventTransparent(DependencyObject obj) { return (bool)obj.GetValue(IsPopupEventTransparentProperty); }
        public static void SetIsPopupEventTransparent(DependencyObject obj, bool value) { obj.SetValue(IsPopupEventTransparentProperty, value); }

        private static void OnIsPopupEventTransparentPropertyChanged(DependencyObject target, DependencyPropertyChangedEventArgs e)
        {
            var element = target as FrameworkElement;
            var topParent = GetTopParent(element);
            var popupHwndSource = PresentationSource.FromVisual(topParent) as HwndSource;
            if (popupHwndSource == null) return;

            var newValue = (bool)e.NewValue;
            if (newValue)
                WindowTransparentHelper.SetWindowExTransparent(popupHwndSource.Handle);
            else
                WindowTransparentHelper.UndoWindowExTransparent(popupHwndSource.Handle);
        }

        public static FrameworkElement GetTopParent(FrameworkElement element)
        {
            return LogicalTreeHelper.GetChildren(element).Cast<FrameworkElement>().First();
        }
    }
}

App.xaml.cs файл, в котором происходит открытие 2 форм, 1 поверх другой, верхняя не взаимодействует с мышкой и прозрачна
using Meytes.WPF.Helpers;
using System.Windows;

namespace WpfApp8
{
    public partial class App : Application
    {
        private void Application_Startup(object sender, StartupEventArgs e)
        {
            //Открываем основное окно
            var mainWindow = new MainWindow();
            mainWindow.Show();
            //Инициализируем окно, оно должно быть обязательно AllowsTransparency=true
            var transparentWindows = new TransparentWindow()
            {
                WindowStyle = WindowStyle.None,
                AllowsTransparency=true,
                Opacity=.5,
                Owner = mainWindow,
                WindowStartupLocation = WindowStartupLocation.CenterOwner,
                Topmost = true,
            };
            //Открываем прозрачное окно
            transparentWindows.Show();
            //Включаем прозрачность
            transparentWindows.SetValue(PopupTransparentBehavior.IsPopupEventTransparentProperty, true);
        }
    }
}

App.xaml
<Application x:Class="WpfApp8.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             Startup="Application_Startup"/>

Главное окно MainWindow.xaml
<Window x:Class="WpfApp8.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <ListBox TextElement.FontSize="25">
        <ListBoxItem Content="Item1"/>
        <ListBoxItem Content="Item2"/>
        <ListBoxItem Content="Item3"/>
        <ListBoxItem Content="Item4"/>
        <ListBoxItem Content="Item5"/>
        <ListBoxItem Content="Item6"/>
    </ListBox>
</Window>

Прозрачное окно TransparentWindow.xaml
<Window x:Class="WpfApp8.TransparentWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Height="300" Width="300"
        Background="Transparent">
    <Window.Resources>
        <Style TargetType="{x:Type Button}" >
            <Setter Property="Margin" Value="0,0,5,5"/>
        </Style>
    </Window.Resources>
    <UniformGrid Rows="3" Columns="3" Margin="5,5,0,0" TextElement.FontSize="45">
        <Button Content="1"/>
        <Button Content="2"/>
        <Button Content="3"/>
        <Button Content="4"/>
        <Button Content="5"/>
        <Button Content="6"/>
        <Button Content="7"/>
        <Button Content="8"/>
    </UniformGrid>
</Window>
7 ноя 18, 23:06    [21727505]     Ответить | Цитировать Сообщить модератору
 Re: Клики сквозь форму  [new]
MrKoder
Member

Откуда:
Сообщений: 45
Roman Mejtes, просто
жесть

Извините, если это тупой вопрос, хотя скорее всего так и есть, но я сильно недавно работаю с этими вещами, поэтому есть определенные трудности

Если у меня есть MainWindow, в этом окне кнопка, по нажатию на которую должен по центру экрана появляться прицел (как раз таки который в свою очередь должен быть "прозрачным" для кликов мыши), то как мне прикрутить к этому проекту данную вещь?
Если я правильно вас понял, то Meytes.WPF.Helpers это просто отдельный файл, который должен подключаться к проекту. Он должен быть расширения c++ или c#?

И еще такая тема, для чего нужен в вашем примере App.xaml?
7 ноя 18, 23:26    [21727517]     Ответить | Цитировать Сообщить модератору
 Re: Клики сквозь форму  [new]
Roman Mejtes
Member

Откуда: г. Пермь
Сообщений: 3171
посмотрите, вот накидал на коленке, может это поможет вам в реализации.
это только пример! Будут вопросы, задавайте.
внутри, проект для VS2017, и 0 вирусов, я надеюсь :)

ссылка на проект
8 ноя 18, 01:35    [21727563]     Ответить | Цитировать Сообщить модератору
 Re: Клики сквозь форму  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 37082
Roman Mejtes
вот готовое решение, я проверил, всё работает:
на событие Paint без окна должно быть в разы меньше кода. Не знаю, че ты не захотел.
8 ноя 18, 07:56    [21727657]     Ответить | Цитировать Сообщить модератору
 Re: Клики сквозь форму  [new]
Roman Mejtes
Member

Откуда: г. Пермь
Сообщений: 3171
Petro123
Roman Mejtes
вот готовое решение, я проверил, всё работает:
на событие Paint без окна должно быть в разы меньше кода. Не знаю, че ты не захотел.
в WPF есть событие Paint? если бы оно было, что именно было бы проще через него сделать?
8 ноя 18, 10:10    [21727770]     Ответить | Цитировать Сообщить модератору
 Re: Клики сквозь форму  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 37082
Roman Mejtes
в WPF есть событие Paint?
ну может onRender.... Ты его лучше знаешь чем я).

Roman Mejtes
что именно было бы проще через него сделать?

Чтобы рисовать координатную сетку или масштабную линейку на карте я делаю так:
1. Класс
MyPaintGrid
{
   MyPaintGrid(Map map) 
   {
         this. map = map;
         (this.map as UserControl). Paint += МетодРисовать;
   } 
   void МетодРисовать(,,,,, 
} 

Причем карта компонент не моя, без исходников, и это типа плагин на моей стороне.
Всё
Вроде идеально)
8 ноя 18, 10:28    [21727796]     Ответить | Цитировать Сообщить модератору
 Re: Клики сквозь форму  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 37082
Roman Mejtes,
Ты ругал WinForm в сравнении с WPF.
Но в винформ одну хотелку можно сделать в 50 разных способов.
В WPF есть другой способ для сабжа?
Мне интересно. А тебе?
8 ноя 18, 10:31    [21727798]     Ответить | Цитировать Сообщить модератору
 Re: Клики сквозь форму  [new]
Roman Mejtes
Member

Откуда: г. Пермь
Сообщений: 3171
сделайте мне кнопку в WinForms которая будет в форме снежинки серпинского, кнопка должна изменять размер, глубину детализации и хиттеститься только в рамках фрактала и 50ю способами.
странная у вас логика?
можно ли сделать всё это другим способом, безусловно. но зачем мне это делать, мне нужно сделать только 1
8 ноя 18, 10:34    [21727803]     Ответить | Цитировать Сообщить модератору
 Re: Клики сквозь форму  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 37082
Roman Mejtes
сделайте мне
ок. Я подумаю.
А тебе просьба подсказать про мой код выше. Нужен Плагин.
8 ноя 18, 10:36    [21727810]     Ответить | Цитировать Сообщить модератору
 Re: Клики сквозь форму  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 37082
Roman Mejtes
но зачем мне это делать
я понял. Тебе подписка на событие render не интересна.
Удачи!
8 ноя 18, 10:38    [21727814]     Ответить | Цитировать Сообщить модератору
 Re: Клики сквозь форму  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 37082
Roman Mejtes,
Это то что я ищу?

Объект DrawingVisual
DrawingVisual — Упрощенный класс, используемый для отрисовки фигур, изображений и текста. Этот класс считается упрощенным, так как не предоставляет средств для работы с разметкой и обработку событий, что повышает его производительность. Поэтому этот класс идеально подходит для фоновых рисунков или клипов.
8 ноя 18, 10:47    [21727826]     Ответить | Цитировать Сообщить модератору
 Re: Клики сквозь форму  [new]
Roman Mejtes
Member

Откуда: г. Пермь
Сообщений: 3171
я не понимаю о каком коде выше вы пишите, DrawingVisual имеет смысл использовать, когда у вас большое количество элементов на экране. Так как при >10к элементов визуального дерева, может начать тормозить UI, а
Сам я его применял. когда у меня был сложный табличный контрол на 10к ячеек в каждой из которых могло быть еще N элементов виз.дерева в 1 момент на ViewPort'е, их использование дало увеличение перфоманса процентов на 10-15% при сохранении "универсальности" применения. Но какой смысл применения, в примере, я не пойму. Всё это только усложнит реализацию.

Опишите подробнее о чем речь, создайте новую тему, если она не про прознрачность окна, обсудим.
8 ноя 18, 11:05    [21727856]     Ответить | Цитировать Сообщить модератору
 Re: Клики сквозь форму  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 37082
Roman Mejtes
Но какой смысл применения, в примере, я не пойму. Всё это только усложнит реализацию.
можете показать хотя бы схематично:
- основное приложение выдает Canvas в приложение плагин (в одном решении)
- в плагине:
canvas.Children.Add(new VisualHost { Visual = drawingVisual });
- в классе есть растр 64 на 64 курсора или прицела или...
8 ноя 18, 11:25    [21727887]     Ответить | Цитировать Сообщить модератору
 Re: Клики сквозь форму  [new]
MrKoder
Member

Откуда:
Сообщений: 45
Спасибо большое всем за помощь!
Разобрался)
8 ноя 18, 21:02    [21728732]     Ответить | Цитировать Сообщить модератору
 Re: Клики сквозь форму  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 37082
MrKoder
клики проходили сквозь форму.
для чего?
MrKoder
Т.е. это окно должно быть просто информационным.

ИнфоОкно в другом процессе по отношению источнику информации приложению Б?
12 ноя 18, 12:08    [21731596]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2]      все
Все форумы / WPF, Silverlight Ответить