Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.08.2012, 20:50   #1
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
Подмигивание Не перерисовывать окно если оно невидимо.

Доброго времени!

Дело о Delphi и его горе-компоненто-разработчиках.

И так-симеет пакет компонент локализации i18n Package.

Пакет мощьный, хороший и удобный и бесплатный. Лучшее что встерчал, даже если с платным сравнить.
Разработчик упертый, поддерживаются только UNICODE версии delphi и только Delphi 2009 и 2010.
Потому доведением проекта до ума на старших версиях IDE, приходтся занимать самостоятельно(Упомянутый не хочет этим заниматься).

Итого ситуация:
Имеем XE2 или XE, пусть у нас есть какие-то background окна, которые не видны, и они автоматом создаются(в списке auto-create forms).

В пользование ушёл компонент TFWTrayIcon от Rouse, с использованием свойства FStartMinimized в такой реализации(строка 901, FWTrayIcon.pas):
Код:
//  Данная процедура выполнится в RunTime и по необходимости
//  скроет наше приложение при запуске
// =============================================================================
procedure TFWTrayIcon.Loaded;
begin
  inherited Loaded;
  if (csDesigning in ComponentState) then Exit;

  DoLoaded;
  // В самом начале смотрим: если мы не поместили в св-во Icon свою иконку,
  // то основная иконка компонента будет взята из иконки приложения
  if FIcon.Handle = 0 then
    FIcon.Assign(Application.Icon);
  FCurrentIcon.Assign(FIcon);
  FTrayIcon.hIcon := FCurrentIcon.Handle;

  FIcon.OnChange := OnImageChange;

  // Прячем главную форму приложения
  if (FStartMinimized) and not (csDesigning in ComponentState) then
  begin
    Application.ShowMainForm := False;
    ShowWindow(Application.Handle, SW_HIDE);
  end;
  // Добавляем иконку в трей
  if FVisible then
    Shell_NotifyIcon(NIM_ADD, @FTrayIcon);
  UpdateTray;
end;
Событие окна OnPaint происходит 2 раза:
1 окно, рисует Application и прячет из-за TFWTrayIcon, потом его берет на обработку TTranslator из i18n, в итоге происходит сабж(строка 2377, i18nLocalizer.pas), синим:
Код:
procedure TTranslator.EndUpdate;
begin
  Dec(fUpdateCount);
  if (fUpdateCount = 0) and (Owner is TWinControl) then
  begin
    if TWinControl(Owner).HandleAllocated and IsWindowVisible(TWinControl(Owner).Handle) then
    begin
      TWinControl(Owner).Perform(WM_SETREDRAW, 1, 0);
      RedrawWindow(TWinControl(Owner).Handle, nil, 0,
        RDW_ERASE or RDW_INVALIDATE or RDW_ALLCHILDREN or RDW_UPDATENOW);
    end;
    if (Owner is TCustomForm) and Assigned(fActiveControl) then
      TCustomForm(Owner).ActiveControl := fActiveControl;
  end;
end;
В итоге у на есть 1 не видимое, настоящее окно, и одно видимое, Redraw'нутое окно, которое нельзя убрать(спрятать, свернуть, и на нем нет компонент). Думаю это происходит по этой причине:
http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx
Цитата:
If the application sends the WM_SETREDRAW message to a hidden window, the window becomes visible (that is, the operating system adds the WS_VISIBLE style to the window).
Демо этого здесь: http://forum.delphiarea.com/download/file.php?id=314
В демке только 4 формы, которые, все, появляются на экране, хотя на самом деле там только 1 главное окно, с которым можно что-нибудь сотворить.

Я комментировал отмеченные синим строки, в итоге получалось очень забавно, 2-е окно не рисовалось, однако при смене языка можно было мышкой крутые лесенки рисовать.

В итоге нужно было поставить проверку, виден ли сабж, как оказалось это не сработало(красненькое), и я продолжаю рисовать лесенки в получающемся баге при смене языка.

Вопрос:
Как перерисовать то, что нужно, только если это что-то видимо?

У компонента есть события, после смены языка. Однако Repaint и Refresh окна не помогают.

Последний раз редактировалось Человек_Борща; 18.08.2012 в 20:58.
Человек_Борща вне форума Ответить с цитированием
Старый 19.08.2012, 18:16   #2
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Тему можно закрывать =) Проблема исправлена разработчиком =)
Человек_Борща вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Если свернуть окно, она свернется и развернется. Jleksern Общие вопросы Delphi 8 28.01.2012 05:56
Отпечатать первое слово третьей строки файла, если оно существует D.o.c Паскаль, Turbo Pascal, PascalABC.NET 5 12.02.2011 22:40
как использовать перерисовывать control с invalidate sld Общие вопросы .NET 1 16.06.2009 12:06
Как вывести изображение из paintbox на принтер, если оно занимает 2 экрана? aleksei199 Общие вопросы Delphi 8 25.06.2008 14:00
По нажатию, каких сочетаний клавиш можно программно развернуть приложение, если оно свернуто в трее? Johnny_B Win Api 1 04.06.2007 08:20