Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Программа и интерфейс
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 14.01.2014, 09:56
Аватар для morebeauty
morebeauty morebeauty вне форума
Начинающий
 
Регистрация: 21.06.2012
Сообщения: 106
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию Логотип

Есть программа, которая мониторит папку и воспроизводит из нее видео (tWindowsMediaPlayer) и презентации PowerPoint. Так вот, в момент, когда заканчивается видео и следует презентация, проигрыватель сворачивается, обнажая саму программу и рабочий стол на секунду до открытия презентации. Хотелось бы, чтобы вместо этого люди видели либо просто черный экран, либо наш логотип (fullscreen)

Помогите, подскажите, как это лучше всего осуществить?
Ответить с цитированием
  #2  
Старый 14.01.2014, 23:18
Аватар для Vayrus
Vayrus Vayrus вне форума
Исполняемый Ретровирус
 
Регистрация: 09.08.2008
Адрес: Umbrella Corporation
Сообщения: 743
Репутация: 1293
По умолчанию

Во-первых, с рабочего стола можно скрыть панель задачь и иконки, в топорном случае завершить explorer.exe

Во-вторых, можно установить свои обои на рабочий стол, лого, н-р.

А так вариантов решения очень много...
Ответить с цитированием
  #3  
Старый 15.01.2014, 04:51
Аватар для morebeauty
morebeauty morebeauty вне форума
Начинающий
 
Регистрация: 21.06.2012
Сообщения: 106
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от Vayrus
Во-первых, с рабочего стола можно скрыть панель задачь и иконки, в топорном случае завершить explorer.exe

Во-вторых, можно установить свои обои на рабочий стол, лого, н-р.

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

Короче логотип/черный экран должны быть программные.

Причем картинка должна висеть поверх всего, кроме полноэкранных режимов wmp и powerpoint. То есть как только wmp свернулся, не должна открываться картинка (на это ведь все равно нужно время), она уже должна там быть. Ну и при нажатии горячих клавиш - пропадать.

Желательно все это осуществить в этой же программе. Мне нужен код. Спасибо.
Ответить с цитированием
  #4  
Старый 15.01.2014, 07:09
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Вставляй wmp и powerpoint прямо в свое окно.
Ответить с цитированием
  #5  
Старый 15.01.2014, 07:50
Аватар для morebeauty
morebeauty morebeauty вне форума
Начинающий
 
Регистрация: 21.06.2012
Сообщения: 106
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от lmikle
Вставляй wmp и powerpoint прямо в свое окно.
wmp и так в моем окне.
В любом случае мне это не подходит. Даже если я и PP компонент на форму добавлю, мне это не поможет.

Есть еще идеи?

Неужели нельзя закрасить рабочий стол картинкой? Рисовать же на нем можно через LineTo например.
Ответить с цитированием
  #6  
Старый 15.01.2014, 09:28
Аватар для morebeauty
morebeauty morebeauty вне форума
Начинающий
 
Регистрация: 21.06.2012
Сообщения: 106
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Нашел решение. Если кому то понадобится подобное.

Во первых потребуется модуль

Код:
{
  Модуль: FullScreenUnit

  Описание: Поддержка разворота клиентской части окна во весь экран.
            Источник: статья Пола Дилация в MSDN Magazine № 6(12) 2002 г.

  Особенности использования: Окно, клиентская часть которого должна быть 
                             развернута во весь экран, должно обрабатывать
                             сообщение WM_GETMINMAXINFO и устанавливать
                             свой максимальный размер больше, чем размер
                             экрана.

  Авторы: Пол Дилация (С++, MFC), Игорь Шевченко (Delphi)

  Дата создания: 09.01.2003

  История изменений:
}
unit FullScreenUnit;

interface
uses
 Windows, Controls;

type
 TFullScreenHandler = class
 private
   FRestoreRect : TRect;
   function GetInFullScreenMode : Boolean;
   function GetMaxSize : SIZE;
 public
   { Развернуть клиентскую область окна во весь экран }
   procedure Maximize (AWinControl : TWinControl);
   { Восстановить клиентскую область окна }
   procedure Restore (AWinControl : TWinControl);
   { Развернута ли клиентская область окна во весь экран }
   property InFullScreenMode : Boolean read GetInFullScreenMode;
   { Максимально возможный размер окна, такой, чтобы клиентская область
     уместилась во весь экран. }
   property MaxSize : SIZE read GetMaxSize;
 end;

var
 FullScreenHandler : TFullScreenHandler;

implementation
uses
 Forms; { Для Screen }

function TFullScreenHandler.GetInFullScreenMode : Boolean;
begin
 Result := not IsRectEmpty(FRestoreRect);
end;

function TFullScreenHandler.GetMaxSize : SIZE;
var
 ARect : TRect;
begin
{
 При большом желании обращение к свойствам переменной Screen можно заменить
 на вызовы функции GetSystemMetrics(SM_CXSCREEN) и
 GetSystemMetrics(SM_CYSCREEN).
}
 SetRect(ARect, 0, 0, Screen.Width, Screen.Height);
 InflateRect(ARect, 10, 50); //Любые числа, лишь бы превышали размер 
                             //неклиентской области окон
 Result.cx := ARect.Right - ARect.Left;
 Result.cy := ARect.Bottom - ARect.Top;
end;

procedure TFullScreenHandler.Maximize (AWinControl : TWinControl);
var
 RcClient, RcNewWindow : TRect;
begin
 RcClient := AWinControl.ClientRect;
{ Перевод координат клиентской области окна в экранные }
 MapWindowPoints(AWinControl.Handle, HWND_DESKTOP, RcClient, 2);
{ Сохраним размеры окна для восстановления }
 GetWindowRect(AWinControl.Handle, FRestoreRect);
{
 При большом желании обращение к свойствам переменной Screen можно заменить
 на вызовы функции GetSystemMetrics(SM_CXSCREEN) и
 GetSystemMetrics(SM_CYSCREEN).
}
 SetRect(RcNewWindow, 0, 0, Screen.Width, Screen.Height);
 with RcNewWindow do begin
   Inc(Left, FRestoreRect.Left - RcClient.Left);
   Inc(Top, FRestoreRect.Top - RcClient.Top);
   Inc(Right, FRestoreRect.Right - RcClient.Right);
   Inc(Bottom, FRestoreRect.Bottom - RcClient.Bottom);
   SetWindowPos (AWinControl.Handle, 0, Left, Top, Right - Left, Bottom - Top,
                 SWP_NOZORDER);
 end;
end;

procedure TFullScreenHandler.Restore (AWinControl : TWinControl);
begin
 with FRestoreRect do
   SetWindowPos (AWinControl.Handle, 0, Left, Top, Right - Left, Bottom - Top,
                 SWP_NOZORDER);
 SetRectEmpty(FRestoreRect);
end;

initialization
 FullScreenHandler := TFullScreenHandler.Create();
finalization
 FullScreenHandler.Free();
end.

Модуль нужно добавить в uses на нужной форме. В моем случае это дополнительная форма Form2.
Чтобы поверх формы ничего не возникало, можно установить ей свойство stay on top. Form.FormStyle:=fsStayOnTop;
ОБЯЗАТЕЛЬНО установите свойство BorderStyle формы на значение bsNone.

Вот код для разворачивания формы на полный экран или ее сворачивания. Можно добавить в нужное событие.

Код:
  if not FullScreenHandler.InFullScreenMode then
    FullScreenHandler.Maximize(Self)
  else
   FullScreenHandler.Restore(Self);

Пожалуй все.
Ответить с цитированием
  #7  
Старый 15.01.2014, 10:14
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Еще можно создавать отдельный десктоп, чтоб всякая ерунда с рабочего стола не пролезала.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #8  
Старый 15.01.2014, 10:43
Аватар для morebeauty
morebeauty morebeauty вне форума
Начинающий
 
Регистрация: 21.06.2012
Сообщения: 106
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Еще можно создавать отдельный десктоп, чтоб всякая ерунда с рабочего стола не пролезала.
А пример реализации?
Ответить с цитированием
  #9  
Старый 15.01.2014, 10:49
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от morebeauty
А пример реализации?
Например: "Windows Desktops"
Ответить с цитированием
  #10  
Старый 15.01.2014, 20:51
Аватар для Vayrus
Vayrus Vayrus вне форума
Исполняемый Ретровирус
 
Регистрация: 09.08.2008
Адрес: Umbrella Corporation
Сообщения: 743
Репутация: 1293
Лампочка

Цитата:
Сообщение от morebeauty
Сама постановка задачи уже подразумевает быстрый доступ для администратора. То есть, если что-то пойдет не так, я должен быстро среагировать. А мне по вашей подсказке придется запускать проводник, чего-то там еще делать.

Так вот научитесь ставить правильно задачи, тут не экстрасенсы Я же не заставляю делать как я, привел лишь пример, не нравиться, тогда ищите другие варианты, тем более их уйма, да и тут накидали еще вагон и маленькую тележку.
Ответить с цитированием
  #11  
Старый 16.01.2014, 04:54
Аватар для morebeauty
morebeauty morebeauty вне форума
Начинающий
 
Регистрация: 21.06.2012
Сообщения: 106
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Так вот научитесь ставить правильно задачи, тут не экстрасенсы
Любая автоматизация подразумевает быстрое восстановление работоспособности в случае краха. Задача поставлена верно.

Цитата:
да и тут накидали еще вагон и маленькую тележку
Тут мое же решение и еще одно.

Цитата:
Например: "Windows Desktops"
Посмотрел. Если я правильно понял, то создается дополнительный десктоп. Панель задач, все ярлыки и окно моей программы остаются на первом, а воспроизведение видео и презентаций транслируется на второй, на котором лишь обои, и при начале работы программы активируется именно второй. Тогда опять же вопрос: как мне быстро отобразить окно моей программы на втором дисплее или быстро переключиться на первый, если программа зависнет или что-то еще нехорошее произойдет?
В моем примере клик по фуллскрин-форме закрывает ее и отображает основную. То есть все быстро и просто - в 3 клика (с учетом закрытия текущего воспроизведения).
Ответить с цитированием
  #12  
Старый 16.01.2014, 11:11
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от morebeauty
Посмотрел. Если я правильно понял, то создается дополнительный десктоп. Панель задач, все ярлыки и окно моей программы остаются на первом, а воспроизведение видео и презентаций транслируется на второй, на котором лишь обои,
На этом рабочем столе можно и свой проводник запустить если в нижней строке ввести "explorer.exe" и нажать кнопку "Run", но в твоём случае это ненужно.
Цитата:
Сообщение от morebeauty
и при начале работы программы активируется именно второй. Тогда опять же вопрос: как мне быстро отобразить окно моей программы на втором дисплее или быстро переключиться на первый, если программа зависнет или что-то еще нехорошее произойдет?
Регистрируешь свою горячую клавишу с помощью RegisterHotKey и по нажатию этой горячей клавиши переключайся на рабочий стол по-умолчанию (т.е. как это сделано в обработчике кнопки "Go default") ну или на какой тебе там нужно - можешь и несколько горячих клавиш зарегистрировать для перехода на каждый рабочий стол.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 18:40.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter