Ответы пользователя по тегу Windows Forms
  • Как добавить новое свойство (property) к объекту DataGridViewCell в WinForms?

    VoidVolker
    @VoidVolker Куратор тега C#
    Dark side eye. А у нас печеньки! А у вас?
    • Полностью скопировать исходный код DataGridView с изменением типа ячеек.
    • Добавить к целевому классу свой список своих элементов с нужными свойствами и проксированием части функционала оригинальных ячеек, а элементы в этом списке уже связать с оригинальными ячейками. И работать соответственно со своим списком.
    • Использовать шаблон типа MVC/MVVM с моделями данных и прочее.
    Ответ написан
    Комментировать
  • Что правильно использовать для создания меню и тд в visual studio?

    VoidVolker
    @VoidVolker
    Dark side eye. А у нас печеньки! А у вас?
    На самом деле именно так и делается - одни элементы скрываются, другие показываются по мере необходимости. Элементы группируются и скрываются пачкой. Для упрощения обычно группы дочерних окон просто размещают в окне-контейнере и скрывают этот контейнер целиком, а все его дочерние окна скроет сама ось. И второй вариант - создавать/уничтожать окна по мере необходимости. Но вот когда окон много - это увеличивает расход памяти и нагрузку на систему, а на медленных ПК большие и сложные интерфейсы могли даже тормозить. Это 20-25 лет назад все это было важно, а сегодня даже плюс-минус гигабайт никто на заморачивается.
    Ответ написан
    2 комментария
  • Как выполнить на winforms фильтр для чтения, который отрисовывается поверх всех окон на экране?

    VoidVolker
    @VoidVolker
    Dark side eye. А у нас печеньки! А у вас?
    Имеет смысл посмотреть в исходниках вот этого приложения: https://github.com/Tyrrrz/LightBulb
    Ответ написан
    Комментировать
  • Как создать фабрику картинок в windorms c#?

    VoidVolker
    @VoidVolker Куратор тега C#
    Dark side eye. А у нас печеньки! А у вас?
    Есть такая штука, называется "Декомпозиция задачи": вот это вам и надо сделать. Разбить свою задачу на несколько подзадач меньшего размера, а потом эти задачи разбить на подзадачи еще меньше и так далее, пока не станет все понятно. Затем следует объединить задачи в какие-то модули и логические блоки. И по шагам реализовывать нужный функционал. (И в очередной раз напоминаю, как вам уже неоднократно сказали: в вашем случае следует сделать карту игрового поля и основываясь на этой карте рисовать игровое поле - вы её сделали?)
    Ответ написан
    Комментировать
  • Можно ли просто передать exe или передать папку Release wiforms c#?

    VoidVolker
    @VoidVolker Куратор тега C#
    Dark side eye. А у нас печеньки! А у вас?
    Можно один исполняемый файл при условии отсутствия дополнительных зависимостей. Обычно студия зависимости кладет рядом в тот же каталог (release/debug), но в некоторых случаях не все зависимости копируются и тогда их надо ручками добавлять в конфиги. Для распространения приложения используется такая штука, как "дистрибутив" или установщик: все требуемые файлы упаковываются в один исполняемый и далее один этот файл распространяется. При запуске установщик распаковывает все файлы в указанный в его конфиге каталог и делает разные дополнительные действия типа создания ярлыков и прочее.
    Ответ написан
  • Почему выходит ошибка при передаче пользователю программу winforms?

    VoidVolker
    @VoidVolker Куратор тега C#
    Dark side eye. А у нас печеньки! А у вас?
    Конечно надо. Все используемые медиа файлы надо либо упаковывать в ресурсы либо вместе с приложением передавать в отдельном каталоге, например.
    Ответ написан
    Комментировать
  • Как сделать вызов функции при изменении значения переменной типа enum c# winform?

    VoidVolker
    @VoidVolker Куратор тега C#
    Dark side eye. А у нас печеньки! А у вас?
    Например использовать свойства:
    class Foo {
        private BarEnum _bar;
        public BarEnum bar {
            get { ... }
            set { ... }
        }
    }

    И, соответственно при изменении значения переменной во время записи выполнить нужный код. Можно даже использовать события.
    Ответ написан
    Комментировать
  • Почему видно прогрузку приложения?

    VoidVolker
    @VoidVolker Куратор тега C#
    Dark side eye. А у нас печеньки! А у вас?
    WindowsForms использует очень древний и устаревший GDI+ - сегодня его использовать имеет смысл только если нужна поддержка Windows XP (либо еще каких-то окаменелостей). Во всех остальных случая лучше использовать WPF или MAUI - там нет лагов и тормозов. Если же хочется ускорить формы, то ищите по теме "speedup/boostup gdi windowsforms" - там надо добавить несколько дополнительных флагов при создании окна и, ЕМНИМ, включить двойную буферизацию. На SO есть все решения. Но, некоторые тормоза все же будут. Если хочется красиво запустить приложение, то при запуске надо создавать окно в скрытом виде, затем ждать пока инициализируются остальные компоненты и только потом уже показывать само окно. Если нужна производительная сложная анимация - то про формы лучше забыть и сразу перекатываться в WPF/MAUI. В крайнем случае можно создать компонент на WPF и использовать его в формах: я так делал или наоборот, когда надо было использовать древнее легаси WinAPI, но в современной красивой обертке с нужными фичами. На счет интеграции MAUI и форм не подскажу.
    Ответ написан
    Комментировать
  • Имеет ли смысл использовать паттерн MVVM в приложении Winforms?

    VoidVolker
    @VoidVolker Куратор тега C#
    Dark side eye. А у нас печеньки! А у вас?
    Нет, оно там просто не нужно - достаточно просто правильно структурировать приложение. В WF вполне достаточно просто разделить логику приложения и логику самого интерфейса. Нужен нестандартный контрол со своим поведением? Отпочковываем класс от Control и вперед. Логика самого интерфейса вполне нормально живет в самих классах элементов управления (в терминах MVVM это два в одном View + ViewModel). Например, реальный случай из практики: запилил WF приложение по выданному дизайну - его потестили и почти сразу дизайнер нарисовал полностью новый дизайн; ввиду увеличения фишечек, рюшечек и всего остального (а так же тормозов древнего легаси наследия WF, конечно же) - я просто перенес файлы с логикой из WF проекта в WPF проект в модели и запилил новый GUI на WPF.
    Ответ написан
    Комментировать
  • Как исправить данную ошибку в VS windows forms?

    VoidVolker
    @VoidVolker Куратор тега C#
    Dark side eye. А у нас печеньки! А у вас?
    https://dev.mysql.com/doc/connector-net/en/connect...
    ---------------------------↓↓↓
    "server=127.0.0.1;uid=root;pwd=12345;database=test"
    Ответ написан
    1 комментарий
  • Не запускается приложение Windows Forms после его сборки. Что делать?

    VoidVolker
    @VoidVolker Куратор тега C#
    Dark side eye. А у нас печеньки! А у вас?
    C 95% вероятностью отсутствующие библиотеки, конфиги, зависимости или сам .Net на другой машине, а в коде приложения нет проверок/обработки ошибок загрузки библиотек/конфигов/зависимостей. Проверить список зависимостей приложение и их присутствие на целевой машине, добавить обработку не обработанных исключений и логирование запуска приложения на разных этапах для понимания в какой момент происходит ошибка/падение.
    Ответ написан
    Комментировать
  • Как отобразить несколько контролов одновременно?

    VoidVolker
    @VoidVolker Куратор тега C#
    Dark side eye. А у нас печеньки! А у вас?
    Просто используйте WPF - там нет таких проблем с производительностью. У WinForms проблема с производительностью связана с использованием древнего GDI API. И, если хочется решить эту проблему - то в таком случае надо вручную писать рендеры для контролов. В данном случае это будет так: создать кастомный контрол и написать к нему кастомный рендер, который будет брать картинки и копировать их всех в один канвас/буфер, так же в самом этом контроле обрабатывать события пользовательского ввода. Плюс потребуется найти и применить дополнительные хаки для повышения производительности, такие как добавление специальных флагов стилей к окну, переписывание дополнительных методов в контролах и прочее. Проверено на личном опыте.
    Ответ написан
    2 комментария
  • Как в WinForms прикрепить код отдельной программы, написанной на С++?

    VoidVolker
    @VoidVolker
    Dark side eye. А у нас печеньки! А у вас?
    Например, что бы какая то программа или код на С++ вызывались по щелчку кнопки на форме WinForms.

    • Просто вызвать эту программу используя соответствующие API.
    • Конвертировать эту программу в динамическую библиотеку и вызывать функции этой библиотеки в своем приложения используя системные API.

    И как это все собрать в одно рабочее приложение.

    Enigma VirtualBox

    Т.е. все заголовки, библиотеки WinForms и заголовки и библиотеки С++?

    А заголовки C++ с нужными данными переписать на ЯП вашего приложения и инклюдить стандартными методами.
    Стандартные библо
    Ответ написан
    Комментировать
  • Как реализовать лучше взаимодействие C# Forms приложение с браузером CefSharp и сайтом в нем?

    VoidVolker
    @VoidVolker Куратор тега C#
    Dark side eye. А у нас печеньки! А у вас?
    Лучше всего использовать NWJS для таких задач.
    Ответ написан
    Комментировать
  • Изменение стиля ComboBox WinForm C#?

    VoidVolker
    @VoidVolker Куратор тега C#
    Dark side eye. А у нас печеньки! А у вас?
    Если нужна глубокая кастомизация элементов управления — используйте WPF. Он и быстрее и гибче (требования к ОЗУ вырастут не сильно, по сравнению с формами).
    Ответ написан
    4 комментария
  • Как сделать плавающий тулбар в winforms?

    VoidVolker
    @VoidVolker Куратор тега C#
    Dark side eye. А у нас печеньки! А у вас?
    Положить этот тулбар на панель (на панели у элемента нет фиксированного положения и там его можно свободно двигать) или просто присоединить к основному окну, поднять повыше в z-index и задать ему логику парковки. Типа "при приближении к краю окна установить установить координаты такие-то".
    Ответ написан
    Комментировать
  • Как хранить текстовые данные в приложении на C#?

    VoidVolker
    @VoidVolker Куратор тега C#
    Dark side eye. А у нас печеньки! А у вас?
    Например:
    class MyClass
    {
        ...
        static class Strings
        {
            public static string str1 = "string 1";
        }
    }

    Или просто вынести в отдельный файл.
    Ответ написан
    Комментировать
  • Как передать массив строк создаваемому процессу?

    VoidVolker
    @VoidVolker
    Dark side eye. А у нас печеньки! А у вас?
    Например:
    application.exe --strings "str1,str2,str3"
    Ответ написан
  • Можно ли увеличить скорость скрывания столбцов в DataGridView?

    VoidVolker
    @VoidVolker Куратор тега C#
    Dark side eye. А у нас печеньки! А у вас?
    myControl.SuspendLayout();
    ... меняем контент в myControl ...
    myControl.ResumeLayout(false);
    myControl.PerformLayout();


    UPD
    Есть еще один дополнительный флаг для формы, который может ускорить рендеринг:
    public partial class MainWindow : Form
        {
            /// <summary>
            /// Fix for slow UI rendering
            /// </summary>
            protected override CreateParams CreateParams
            {
                get
                {
                    CreateParams cp = base.CreateParams;
                    cp.ExStyle |= 0x02000000;  // Turn on WS_EX_COMPOSITED   
                    return cp;
                }
            }
        }
    Ответ написан
  • Как исправить размытый текст в Windows Forms?

    VoidVolker
    @VoidVolker Куратор тега C#
    Dark side eye. А у нас печеньки! А у вас?
    Гуглите DpiAware — изучите проблемы и выберете оптимальное решение для себя. Тут проблема в диком легаси наследии, реализованном через костыли и которое пытаются сохранить, добавляя исправления в виде костылей, которые генерируют новые баги и в новых версиях это пытаются исправить опять костылями. Кроме того, алгоритм работы масштабирования немного отличается в разных версиях ОС. Так что очень рекомендую проверять работу приложения в разных версиях ОС (7, 8.1, 10 Home, 10 Enterprise LTS) и с выключенным и включенным масштабированием. Да-да, в домашней десятке и в корпоративной долгосрочной десятке можно получить разный результат.

    Вариант 1 — вызов специальной функции в коде (реальный код, который я использую — плюс вторая функция для масштабирования шрифтов, тык — примерно так получается в 4к):
    const int WinDefaultDPI = 96;
    
    /// <summary>
    /// Исправление блюра при включенном масштабировании в ОС windows 8 и выше
    /// </summary>
    public static void DpiFix()
    {
        if (Environment.OSVersion.Version.Major >= 6)
        {
            SetProcessDPIAware();
        }
    }
    
    /// <summary>
    /// WinAPI SetProcessDPIAware 
    /// </summary>
    /// <returns></returns>
    [DllImport("user32.dll")]
    private static extern bool SetProcessDPIAware();
    
    /// <summary>
    /// Исправление размера шрифтов
    /// </summary>
    /// <param name="c"></param>
    public static float DpiFixFonts(Control c)
    {
        Graphics g = c.CreateGraphics();
        float dx = g.DpiX
            , dy = g.DpiY
            , fontsScale = Math.Max(dx, dy) / WinDefaultDPI
        ;
        g.Dispose();
        return fontsScale;
    }


    Плюс все формы имеют следующий конфиг (код, вызываемый в конструкторах форм):
    this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F);
    this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi;


    Учтите, что AutoScaleDimensions — в конструкторе выставляется автоматически в зависимости от разрешения и DPI вашего монитора. Поэтому я не использую конструкторы. Иначе, при запуске приложения на разных машинах с разным DPI можно получить очень неожиданные результаты.

    Вариант 2 (v4.7):
    app.config
    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
      <configSections>
      </configSections>
      <startup>
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7" />
      </startup>
      <System.Windows.Forms.ApplicationConfigurationSection>
        <add key="DpiAwareness" value="PerMonitorV2" />
        <add key="EnableWindowsFormsHighDpiAutoResizing" value="true" />
      </System.Windows.Forms.ApplicationConfigurationSection>
    </configuration>


    Вариант 3 (v4.7):
    app.config
    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
      <configSections>
      </configSections>
      <startup>
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7" />
      </startup>
      <System.Windows.Forms.ApplicationConfigurationSection>
        <add key="DpiAwareness" value="PerMonitorV2" />
        <add key="EnableWindowsFormsHighDpiAutoResizing" value="false" />
      </System.Windows.Forms.ApplicationConfigurationSection>
    <configuration>


    Вариант 4:
    app.manifest
    <!-- Указывает, что приложение поддерживает определение DPI и не будет автоматически масштабироваться Windows при более высоких
           значениях DPI. Приложения Windows Presentation Foundation (WPF) по умолчанию поддерживают определение DPI, им не нужно 
           специально включать параметр для этого. Для приложений Windows Forms на платформе .NET Framework 4.6, для которых задан этот параметр, необходимо 
           также задать для "EnableWindowsFormsHighDpiAutoResizing" значение "true" в файле app.config.-->
      <application xmlns="urn:schemas-microsoft-com:asm.v3">
        <windowsSettings>
          <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>
        </windowsSettings>
      </application>
    Ответ написан
    6 комментариев