Задать вопрос
Ответы пользователя по тегу C#
  • Как исправить размытый текст в 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 комментариев
  • Возможно ли изменить цвет нарисованной с помощью DrawingVisual фигуры?

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

    VoidVolker
    @VoidVolker Куратор тега C#
    Dark side eye. А у нас печеньки! А у вас?
    А вы каким образом изображения обрабатываете, выводите и какие функции используете? Дело в том, что C# для таких вещей не очень хорошо подходит и стандартные механизмы работы с отдельными пикселями там очень медленные. Для работы с изображениями следует использовать как минимум неуправляемый код, а в вашем случае еще лучше вывести все функции обработки и вывода изображения в отдельный модуль, написанный на C/C++ или на чем-то еще типа такого.
    Ответ написан
  • Как понизить версию (winforms project) у инсталлятора .Net framework с 4.5 на 4.0?

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

    VoidVolker
    @VoidVolker Куратор тега C#
    Dark side eye. А у нас печеньки! А у вас?
    control.VerticalScroll.Value
    Подробнее тут: https://msdn.microsoft.com/ru-ru/library/system.wi...
    Ответ написан
    Комментировать
  • Как сделать бэкенд на C# с нуля?

    VoidVolker
    @VoidVolker Куратор тега C#
    Dark side eye. А у нас печеньки! А у вас?
    1. Изучить сетевой стек — сетевая модель OSI. Не обязательно глубоко — но базовые вещи вроде уровней, протоколов надо знать.
    2. Изучить что такое сокеты и как они работают:
      1. реализовать чтение данных из сокета
      2. запись данных в сокет
      3. затем реализовать сокет-сервер и сокет клиент
      4. организовать передачу данных между ними
      5. сделать прием/передачу данных из/в сокета/сокет блокирующую и неблокирующую и понять разницу между ними
      6. реализовать на сервере поддержку коннекта нескольких клиентов
      7. реализовать группу потоков и очереди для чтения/записи в сокеты

    3. Изучить веб-сокеты
    4. Выбрать любую БД, подходящую под ваши критерии (схема данных, нагрузка, логика работы приложения и т.п.) — можно взять любую популярную MySQL, PosgreSQL, Mongo и т.п.
    5. Найти библиотеку для работы БД и пройти туториалы по ней
    6. Подключить библиотеку для работы с БД к сокет/веб-сокет серверу
    7. Реализовать сетевое API вашего сервера (логин клиентом, прием/передача данных и прочее)
    8. Реализовать клиентскую обертку для работы с API сервера
    Ответ написан
    2 комментария
  • Как исправить ошибку "ссылка на объект не указывает на экземпляр объекта"?

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

    VoidVolker
    @VoidVolker Куратор тега C#
    Dark side eye. А у нас печеньки! А у вас?
    Для генерации классов из JSON есть отличнейший сервис: https://app.quicktype.io/#r=json2csharp
    Ответ написан
    Комментировать
  • Как реализовать отслеживание установок windows приложений?

    VoidVolker
    @VoidVolker Куратор тега Windows
    Dark side eye. А у нас печеньки! А у вас?
    Точно так же. При скачивании приложения в дистрибутив записывается вот этот ID в любом удобном виде. При установке приложение отправляет этот ID на сервер. А на сервере бэкэнд уже обрабатывает этот ID как надо.
    Ответ написан
    4 комментария
  • Как из exe собрать dll, имея сорсы?

    VoidVolker
    @VoidVolker Куратор тега C#
    Dark side eye. А у нас печеньки! А у вас?
    На самом деле ничего сверхсложного в этом нету: открываете пример DLL (например этот), по образцу переписываете Main.cpp вашего приложения с нужными вам функциями и получаете то, что вам нужно. В VisualStudio создаете решение, в него добавляете оба проекта (так просто удобнее - пересобрал длл и её сразу можно юзать во втором проекте без дополнительных телодвижений), линкуете на билд dll и все связанное в основном проекте (C# который), далее в C# приложении делаете обертку для dll и используете её уже как надо.
    Ответ написан
    3 комментария
  • Как с помощью wmi+c# получить список установленных приложений Windows, с возможностью деинсталяции?

    VoidVolker
    @VoidVolker Куратор тега C#
    Dark side eye. А у нас печеньки! А у вас?
    Список в реестре:
    Software\Microsoft\Windows\CurrentVersion\Uninstall
    Ответ написан
    7 комментариев
  • Как в С# получить ответ от метода из Objective-C?

    VoidVolker
    @VoidVolker Куратор тега C#
    Dark side eye. А у нас печеньки! А у вас?
    bool flag = true;
    if(flag)
    {
        Console.WriteLine("Flag is true");
    }
    flag = false;
    if(flag == false)
    {
        Console.WriteLine("Flag is false");
    }
    Ответ написан
  • Как провести удаление функции в c#?

    VoidVolker
    @VoidVolker Куратор тега C#
    Dark side eye. А у нас печеньки! А у вас?
    public class Foo
    {
        public Action Bar;
        public bool BarEnabled = true;
    
        private void _Bar()
        {
            if (!BarEnabled) { return; }
            // Some code
        }
    }

    public class Foo
    {
        public Action Bar;
    
        public void BarOn()
        {
            Bar = _Bar;
        }
    
        public void BarOff()
        {
            Bar = Noop;
        }
    
        private void _Bar()
        {
            // Some code
        }
    
        private static void Noop() { }
    }
    Ответ написан
    2 комментария
  • Что нужно знать, чтобы написать такую физику (видео)?

    VoidVolker
    @VoidVolker Куратор тега C#
    Dark side eye. А у нас печеньки! А у вас?
    Что нужно знать, чтобы написать такую физику (видео)?
    Школьный курс физики.

    И как думаете, сколько уйдёт времени, чтобы научиться такому, при условии упорного обучения?
    Чему именно научиться?
    Ответ написан
    2 комментария
  • Лучшие видеуроки по c#?

    VoidVolker
    @VoidVolker Куратор тега C#
    Dark side eye. А у нас печеньки! А у вас?
    Попробуйте изучать программирование, а не ЯП. Ибо ЯП - это инструмент. Как отвертка или молоток. Когда знаешь и понимаешь программирование - то ЯП легко изучается в процессе его использования.
    Ответ написан
    Комментировать
  • C# Timer - Анимация. Как уменьшить нагрузку на ЦП?

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

    VoidVolker
    @VoidVolker Куратор тега C#
    Dark side eye. А у нас печеньки! А у вас?
    VoidVolker, IP белый. Клиент и сервер располагаются на одной машине. А вот если через локалку подключать, т.е. через 127.0.0.1, то все вполне хорошо работает

    Так не будет работать: вы изнутри локальной сети пытаетесь получить доступ на порт роутера, который смотрит в интернет - конечно он не будет форвардить изнутри внутрь. Роутер ожидает подключения снаружи и будет форвардить соединение только из интернета. Либо запускайте клиента где-то в интернете либо используйте прокси.
    Ответ написан
    2 комментария
  • Нужно дать процессу SeDebugPrivilege, можете подробней рассказать как это сделать на C#?

    VoidVolker
    @VoidVolker Куратор тега C#
    Dark side eye. А у нас печеньки! А у вас?
    Ответ написан
    Комментировать
  • Есть адекватная альтернатива Visual Studio?

    VoidVolker
    @VoidVolker Куратор тега C#
    Dark side eye. А у нас печеньки! А у вас?
    Где там перегруженность? Любые панели легко закрываюстя и кастомизируются. А зачем х64 версия? Юзаю в виртуалке - все летает отлично.
    Ответ написан
    Комментировать
  • Как Запустить приложение WinForms C# на другом компьютере без Visual Studio - C#?

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