Форум: "KOL";
Текущий архив: 2003.09.18;
Скачать: [xml.tar.bz2];
ВнизСнова про 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 вся ветка
Форум: "KOL";
Текущий архив: 2003.09.18;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.009 c