Ответы пользователя по тегу Windows Forms
  • Как передать массив строк создаваемому процессу?

    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 комментариев
  • Как понизить версию (winforms project) у инсталлятора .Net framework с 4.5 на 4.0?

    VoidVolker
    @VoidVolker Куратор тега C#
    Dark side eye. А у нас печеньки! А у вас?
    Вероятно где-то в этом самом инсталляторе используется код или зависимости от версии 4.5. Лучше всего создать новый проект в нужной версии, далее перенести все настройки, зависимости и файлы исходного кода и пытаться собрать проект. Вероятно придется внести изменения в исходный код, зависимости или настройки. Еще как вариант можно использовать независимый сборщик дистрибутива — например NSIS.
    Ответ написан
    Комментировать
  • Как исправить ошибку "ссылка на объект не указывает на экземпляр объекта"?

    VoidVolker
    @VoidVolker Куратор тега C#
    Dark side eye. А у нас печеньки! А у вас?
    Эта ошибка означает, что вместо объекта - нуль.
    1. Запускаете программу в режиме отладки;
    2. Воспроизводите ошибку;
    3. Переходите по ссылке в указанную точку исходного кода;
    4. Исправляете ошибку.
    Ответ написан
    1 комментарий
  • Как Запустить приложение WinForms C# на другом компьютере без Visual Studio - C#?

    VoidVolker
    @VoidVolker Куратор тега Windows
    Dark side eye. А у нас печеньки! А у вас?
    1. Установить все обновления.
    2. Поставить самую свежую версию DotNet.
    3. На всякий случай проверить систему sfc /scannnow
    4. Используя Procmon.exe выяснить какой именно DLL не хватает и исправить.
    Ответ написан
    2 комментария
  • Как написать сервер клиент на C#?

    VoidVolker
    @VoidVolker Куратор тега C#
    Dark side eye. А у нас печеньки! А у вас?
    1. Спроектировать архитектуру системы и каждого приложения в отдельности;
    2. Сделать декомпозицию архитектуры;
    3. Спроектировать протокол обмена данными или взять готовый в виде библиотеки;
    4. Реализовать все.


    Сервер работает следующим образом (примерно, детали зависят от особенностей архитектуры и прочее):
    1. Слушает определенный порт и ждет подключения к порту;
    2. После подключения клиента к порту передает соединение в очередь к пулу процессов-воркеров (по числу процессорных ядер);
    3. Воркер обрабатыват соединение, проводит необходимые проверки, логин клиента и т.п.;
    4. После обработки соединение попадает в список подключенных процессов и обрабатывается ядром сервера.


    Клиент работает примерно так:
    1. Ищет сервер;
    2. Подключается к порту;
    3. Проходит аутентификацию и авторизацию;
    4. Ожидает данные от сервера / передает данные серверу.
    Ответ написан
    Комментировать