Как предотвратить мигание при динамическом создании компонентов [дублировать]

В зависимости от того, какой тип unicode вы имеете в виду. Я предполагаю, что вы имеете в виду, что вы просто работаете с std::wstring. В этом случае используйте std::wcin и std::wcout.

Для преобразования кодировок вы можете использовать свои функции ОС, например, для Win32: WideCharToMultiByte, MultiByteToWideChar, или вы можете использовать библиотеку, например libiconv

13
задан Mawg 25 September 2010 в 03:25
поделиться

2 ответа

Я не уверен, что для этого используется специальный метод Delphi, но с использованием Win32 API это делается через сообщение WM_SETREDRAW .

Редактирование: благодаря Ken White и Sertac Akyuz для примера кода ниже.

begin
  // Defer updates
  SendMessage(Handle, WM_SETREDRAW, WPARAM(False), 0);
  try
    // Create all your controls here
  finally
    // Make sure updates are re-enabled
    SendMessage(Handle, WM_SETREDRAW, WPARAM(True), 0);
    // Invalidate;  // Might be required to reflect the changes  
  end;
end;
38
ответ дан Ken White 22 August 2018 в 03:10
поделиться
  • 1
    +1, я надеюсь, что ваш ответ будет достаточно быстрым, чтобы предотвратить ответы с помощью LockWindowUpdate . – Sertac Akyuz 25 September 2010 в 03:36
  • 2
    просто из любопытства, почему? – Mawg 25 September 2010 в 03:50
  • 3
    LockWindowUpdate был разработан, чтобы прекратить рисовать для перетаскивания, он немного больше, чем WM_SETREDRAW, потому что он может делать предположения о том, что делает пользователь. Одно из предположений заключалось в том, что, поскольку происходит перетаскивание, перемещение окна может быть отключено / проигнорировано. Вы все равно можете перетащить окно, в котором значение WM_SETREDRAW установлено равным false. – Gregor Brandt 25 September 2010 в 05:05
  • 4
    @Mawg: см. «С какими операциями LockWindowUpdate не предназначен для использования? & Quot; ( blogs.msdn.com/b/oldnewthing/archive/2007/02/22/1742084.aspx [/ д0]) – mghie 25 September 2010 в 05:10
  • 5
    @Mawg: Я мог бы, но я бы очень плохо воровал репутацию, которая по праву принадлежит к casablanca, поэтому я позволю ему это сделать! @casablanca: Пожалуйста, включите фрагмент кода! – Andreas Rejbrand 25 September 2010 в 12:52

Я просто держу Visible = False, пока все не станет приятным и готовым.

9
ответ дан Cosmin Prund 22 August 2018 в 03:10
поделиться
  • 1
    +1 Это тоже возможность (я подумал об этом, просто хотел посмотреть, нет ли другого пути) – Mawg 26 September 2010 в 02:31
  • 2
    @Mawg, для создания компонента времени исполнения кажется, что он поддерживает Visible = False & feel & quot; лучше, при использовании WM_SETREDRAW & reg; чувствует & quot; лучше для обновления уже существующего и уже видимого элемента управления. – Cosmin Prund 26 September 2010 в 09:54
  • 3
    +1 спасибо. Я попробовал их обоих & amp; это 50/50 (ymmv) – Mawg 27 September 2010 в 01:49
  • 4
    Поддержание видимого = ложное не так уж и хорошо. WM_SETREDRAW намного лучше. В частности, когда элемент управления Align = alClient и подключен к TSplitter, настройка Visible = False приведет к повреждению всего макета. И это медленнее. – nagylzs 29 November 2013 в 14:52
Другие вопросы по тегам:

Похожие вопросы: