Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.5 MB
Время: 0.009 c
6-58798
Noro
2003-07-17 22:06
2003.09.18
Передача данных: Клиент-Сервер, Сервер-Клиент


1-58681
mfender
2003-09-04 17:12
2003.09.18
Как программе указать, потомком чего является компонент.


1-58758
ruslan_as
2003-09-06 11:59
2003.09.18
chr(13) при записи - чтении текстового файла превращается в


3-58558
Рома
2003-08-26 20:08
2003.09.18
Подскажите как с помошью DbiBatchMove() скопировать структуру dbf


3-58570
P0tia
2003-08-27 12:11
2003.09.18
Количество строк





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский