Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.09.18;
Скачать: CL | DM;

Вниз

Снова про ScreenSaver - так и не получил ответа на свой вопрос:   Найти похожие ветки 

 
Alexander ©   (2003-01-08 15:18) [0]

Как написать превьюшку для хранителя экрана на KOL&MCK?


 
mdw ©   (2003-01-09 11:02) [1]

А какие проблемы? На тему написания хранителей экрана документации и примеров в сети полно. А если проблемы с KOL - поконкретнеее. Хотя проблем быть не должно. Покрайней мере с использованием VCL хранителей экрана писать геморойней.


 
Alexander ©   (2003-01-09 15:32) [2]

Для этой формы задаётся родитель. Для KOL я пытаюсь делать так:


Arg := UpperCase(ParamStr(1));

if (Copy(Arg,1,2) = "/A") or (Copy(Arg,1,2) = "-A") or (Copy(Arg,1,1) = "A") then
SSMode := ssSetPwd;

if (Copy(Arg,1,2) = "/P") or (Copy(Arg,1,2) = "-P") or (Copy(Arg,1,1) = "P") then
SSMode := ssPreview;

if (Copy(Arg,1,2) = "/C") or (Copy(Arg,1,2) = "-C") or (Copy(Arg,1,1) = "C") or (Arg = "") then
SSMode := ssConfig;

if (SSMode = ssRun) or (SSMode = ssPreview) then
begin
NewFormSaver(FormSaver, nil);

if (SSMode = ssPreview) then
begin
ParentHandle := Str2Int(ParamStr(2));
GetWindowRect(ParentHandle, ParentRect);

SetWindowLong(FormSaver.Form.Handle, GWL_STYLE, WS_CHILD or WS_VISIBLE);
SetWindowLong(FormSaver.Form.Handle, GWL_EXSTYLE,
GetWindowLong(FormSaver.Form.Handle, GWL_EXSTYLE) and not WS_EX_APPWINDOW or WS_EX_TOOLWINDOW);

SetParent(FormSaver.Form.Handle, ParentHandle);

// FormSaver.Form.Left := 0;
// FormSaver.Form.Top := 0;
// FormSaver.Form.Width := ParentRect.Right - ParentRect.Left;
// FormSaver.Form.Height := ParentRect.Bottom - ParentRect.Top;
end;

( FormSaver.Form)
Для этой формы задаётся родитель. Для KOL я пытаюсь делать так:


Arg := UpperCase(ParamStr(1));

if (Copy(Arg,1,2) = "/A") or (Copy(Arg,1,2) = "-A") or (Copy(Arg,1,1) = "A") then
SSMode := ssSetPwd;

if (Copy(Arg,1,2) = "/P") or (Copy(Arg,1,2) = "-P") or (Copy(Arg,1,1) = "P") then
SSMode := ssPreview;

if (Copy(Arg,1,2) = "/C") or (Copy(Arg,1,2) = "-C") or (Copy(Arg,1,1) = "C") or (Arg = "") then
SSMode := ssConfig;

if (SSMode = ssRun) or (SSMode = ssPreview) then
begin
NewFormSaver(FormSaver, nil);

if (SSMode = ssPreview) then
begin
ParentHandle := Str2Int(ParamStr(2));
GetWindowRect(ParentHandle, ParentRect);

SetWindowLong(FormSaver.Form.Handle, GWL_STYLE, WS_CHILD or WS_VISIBLE);
SetWindowLong(FormSaver.Form.Handle, GWL_EXSTYLE,
GetWindowLong(FormSaver.Form.Handle, GWL_EXSTYLE) and not WS_EX_APPWINDOW or WS_EX_TOOLWINDOW);

SetParent(FormSaver.Form.Handle, ParentHandle);

// FormSaver.Form.Left := 0;
// FormSaver.Form.Top := 0;
// FormSaver.Form.Width := ParentRect.Right - ParentRect.Left;
// FormSaver.Form.Height := ParentRect.Bottom - ParentRect.Top;
end;

Run(FormSaver.Form);
end;


Это начинает работать, то есть моя форма показывается в окошке предварительного просмотра, но после этого прекращается переключение по сисмемным табам (на Фон, Оформление и т.д).


 
mdw ©   (2003-01-09 23:30) [3]

C твоей подачи взялся сегодня переделывать под KOL когда-то написанный ScreenSaver... Вроде все работает. Могу прислать. Посмотришь. Т.к. советы это хорошо, а работающий код - всетаки лучше.


 
Alexander ©   (2003-01-10 08:18) [4]

вышли, если не сложно - egorov_a_a@tngf.kazan.ru


 
Danil   (2003-01-10 09:15) [5]

Привет всем!

А может, кто-нибудь подскажет, как сделать этот самый Parent, на котором скринсейверы будут делать Preview?
Т.е. я хочу, чтобы на моей форме скринсейверы делали свой Preview, для чего им в качестве 2-го параметра передавать хэндл этого компонента. Только что использовать в качестве этого компонента?


 
mdw ©   (2003-01-10 11:41) [6]

2Danil ...да........ ни чего не понял......


 
mdw ©   (2003-01-10 12:13) [7]

2Alexander отправил, лови. Доделано не до конца, но то, что тебя иньересует реализованно.


 
Alexander ©   (2003-01-10 14:09) [8]

Спасибо, разабрался - воспользовался идеей показа в окне не всей формы, а панели, например. Теперь работает. Правда этот же фокус со всей формой не проходит - не ясно почему. (Win2000).

А по поводу Danil - парень хочет написать свой просмотрщик иконом (подменить системный preview) - интересная задача, правда надобность в этом спорная.


 
mdw ©   (2003-01-10 14:35) [9]

Я думаю с показом формы ничего не получится - там проблема с обработкой собщений. Она на себя перехватывает, вернее приложение.


 
Alexander ©   (2003-01-10 15:18) [10]

Но для VCL у меня есть рабочий пример.


 
Danil   (2003-01-12 01:01) [11]

Alexander правильно меня понял: я хочу написать "предпросмотрщик" заставок. Какой компонент использовать для этого?
Я попробовал несколько (панель, форма,...): ничего не подходит.

А надобность, поверьте, есть ;-) : http://www.625.ru/?ssc


 
Alexander ©   (2003-01-12 10:18) [12]

To Danil:
A как ты вызываешь хранитель?
Надо так <хранитель> /P нендл


 
Danil   (2003-01-12 18:23) [13]

Именно так я и пробовал вызывать.
Это я месяц или два назад пробовал. Надо будет сейчас попробовать в PaintBox или в панель на OnPaint вставить. Может, получится...



Да уж, ничего не получается...
Вот так:
procedure TForm1.Panel1Paint(Sender: PControl; DC: HDC);
begin
shellexecute(0, "open",
pchar("C:\WINDOWS\System32\ssmarque.scr"),
pchar("/P " + int2str(sender.Handle)),
//nil,
nil, SW_SHOWNORMAL);
end;


Заставка стартуется каждый раз при прорисовке панели (а это, как вы знаете, очень часто), но на весь экран.

Вот, что получается, если делать так:
shellexecute(0, "open",
pchar("C:\WINDOWS\System32\ssmarque.scr /P " + int2str(sender.Handle)),
( "/P " + int2str(sender.Handle)
Именно так я и пробовал вызывать.
Это я месяц или два назад пробовал. Надо будет сейчас попробовать в PaintBox или в панель на OnPaint вставить. Может, получится...



Да уж, ничего не получается...
Вот так:
procedure TForm1.Panel1Paint(Sender: PControl; DC: HDC);
begin
shellexecute(0, "open",
pchar("C:\WINDOWS\System32\ssmarque.scr"),
pchar("/P " + int2str(sender.Handle)),
//nil,
nil, SW_SHOWNORMAL);
end;


Заставка стартуется каждый раз при прорисовке панели (а это, как вы знаете, очень часто), но на весь экран.

Вот, что получается, если делать так:
shellexecute(0, "open",
pchar("C:\WINDOWS\System32\ssmarque.scr /P " + int2str(sender.Handle)),
//pchar("/P " + int2str(sender.Handle)),
nil,
nil, SW_SHOWNORMAL);

Командная строка выглядит так:
C:\WINDOWS\System32\ssmarque.scr /P 918858
но теперь вообще ничего не запускается. Пробовал без "open" - то же самое. По-моему даже процесс заставки не создаётся.


 
mdw ©   (2003-01-13 12:03) [14]

Попробовал сейчас такой код - работает:
...
private
pi: TProcessInformation;
...

//Запуск "предпросмотра" заставки
procedure TForm1.BitBtn1Click(Sender: PObj);
var si: TStartupInfo;
begin
if OpenDialog.Execute then begin
FillMemory(@si, SizeOf(STARTUPINFO), 0);
si.cb:= sizeof(STARTUPINFO);
FillMemory(@pi, SizeOf(PROCESS_INFORMATION), 0);
MsgOK(mdvDialogEx1.fdFileNames);
MsgOK(Int2Str(Integer(CreateProcess(nil, PChar(OpenDialog.FileName + " /P "+Int2Str(Panel1.Handle)), nil, nil, False,
NORMAL_PRIORITY_CLASS, nil, PChar(ExtractFilePath(OpenDialog.FileName)), si, pi))));
end;
end;

//Останов "предпросмотра" заставки
procedure TForm1.Button1Click(Sender: PObj);
begin
TerminateProcess(pi.hProcess, 0);
end;


 
mdw ©   (2003-01-13 12:06) [15]

MsgOK - нужно убрать, это отладочное:))))


 
Danil ©   (2003-01-13 15:10) [16]

Супер!!!
Работает!!!
Спасибо, Дмитрий!


PS А MsgOK я тоже для отладки всегда ставлю, если надо...



Страницы: 1 вся ветка

Текущий архив: 2003.09.18;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.023 c
1-58656
den777
2003-09-04 11:57
2003.09.18
Есть ли в DELPHI настройки по сохранению старых версий файлов


9-58509
com2003
2003-03-17 18:07
2003.09.18
Работа с цветом


7-58950
Deus
2003-07-02 14:13
2003.09.18
Как запустить ярлык (.lnk)??


3-58542
Mikle
2003-08-28 10:01
2003.09.18
Проблема с Query в Delhi4


7-58947
sashak
2003-07-04 17:11
2003.09.18
HEX