Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Скринсейвер с использованием WinAPI 
V
    Опции темы
bober
Дата 20.2.2006, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 20.2.2006

Репутация: нет
Всего: нет



Пишу сабж.
Основываюсь на статье http://ch-13.narod.ru/screen1.htm, точнее пока на 90% передираю оттуда, попутно изучая используемые функции. smile
Не могу заставить заработать preview в окошке настроек скринсейвера WinXP. Проверил и координаты окна preview и выполняется ли код перерисовки и тот ли хендл окна, а оно не работает. smile Если кому не влом проверьте пжлст. Код прилагаю

Код

program scrfromscratch;


uses
  SysUtils,
  Utilities in 'Utilities.pas';

begin
  RunScreenSaver;
end.



Код

unit Utilities;

interface
 procedure RunScreenSaver;

implementation
uses windows,messages,sysutils;
var
  classname:lpctstr;
  PreviewWindow:hWnd;
  Error:integer;
  QuitSaver: boolean;
  MouseMove: integer;
  IsPreview:boolean;
//----------------------------------------
procedure DrawSingleBox;
var
  PaintDC: hDC;
  Info : TPaintStruct;
  Color:integer;
  OldBrush:hBrush;
  R:TRect;
begin
  PaintDC:=BeginPaint(PreviewWindow,Info);
  Color := RGB(Random(255),Random(255),Random(255));
  OldBrush:=SelectObject(PaintDC,CreateSolidBrush(Color));
  GetWindowRect(PreviewWindow,R);
  Rectangle(PaintDC,R.Left,R.Top,R.Right,R.Bottom);
  DeleteObject(SelectObject(PaintDC,OldBrush));
  EndPaint(PreviewWindow,Info);
end;

//-----------------------------------------
function PreviewWndProc(Window:hWnd;Msg,wparam,lparam:integer):integer; stdcall;
begin
  Result := 0;
  case Msg of
    WM_DESTROY: PostQuitMessage(0);
    WM_PAINT: DrawSingleBox;
    WM_NCCREATE: Result := 1;
    WM_KEYDOWN:
          if not IsPreview then
          QuitSaver := true;
    WM_LBUTTONDOWN , WM_MBUTTONDOWN , WM_RBUTTONDOWN :
          if not IsPreview then
            QuitSaver := true;
    WM_MOUSEMOVE:
          if not IsPreview then begin
            if MouseMove >0 then
                dec(MouseMove)
            else
            QuitSaver := true;
          end;

  else
    Result := DefWindowProc(Window,Msg,wparam,lparam);
  end;
end;

//-----------------------------------------
function PreviewThreadProc(Data:integer):integer; stdcall;
begin
  Result := 0;   Randomize;
  ShowWindow(PreviewWindow,sw_Show);
  UpdateWindow(PreviewWindow);
  Repeat
    InvalidateRect(PreviewWindow,nil,False);
    Sleep(2000);
  until QuitSaver;
  PostMessage(PreviewWindow, wm_Destroy, 0, 0);
end;
//-----------------------------------------
function WndClassReg: Boolean;
var
  WC:TWndClass;
begin
  With WC do begin
    Style := cs_ParentDC;//cs_hredraw or cs_vredraw;
    lpfnWndProc := @PreviewWndProc;
    cbclsExtra:=0;
    cbwndExtra := 0;//sizeof(WC);
    hIcon:=0;
    hCursor:= 0;//LoadCursor(sysInit.hInstance,IDC_ARROW);
    hbrBackGround :=0;
    lpszMenuName := nil;
    lpszClassName := classname;
    hInstance := SysInit.HInstance;
  end;
   Error := GetLAstError;
  Result := RegisterClass(WC)<>0;

end;
//-----------------------------------------
function CreateScreenSaverWindow (Width,Height:Integer;ParentWindow: hWnd):hWnd;
begin
  if not WndClassReg then 
   Error := GetLAstError;
  if  ParentWindow <>0 then begin

    Result := CreateWindow( classname,
                      'Simple',
                      WS_Child or ws_visible or ws_Disabled,
                      0,
                      0,
                      Width,
                      Height,
                      ParentWindow,
                      0,
                      hinstance,
                      nil);
  end
  else begin
    Result := CreateWindow( classname,
                      'Simple',
                      WS_VISIBLE or ws_popup,
                      0,
                      0,
                      Width,
                      Height,
                      0,
                      0,
                      hinstance,
                      nil);
    SetWindowPos(Result,
                HWND_TopMost,
                0,
                0,
                0,
                0,
                SWP_NoMove or SWP_NoSize
              );
  end;
  Error := GetLAstError;
  PreviewWindow:=Result;

end;

//-----------------------------------------
procedure RunPreview;
var
   ParentWindow:hWnd;
   Msg:TMsg;
   R:TRect;
   Dummy:dword;
begin
  QuitSaver := false;  MouseMove := 3; IsPreview:=true;
  classname := 'SimpleScreenSaverClass';
  ParentWindow := StrToInt(ParamStr(2));
  GetWindowRect(ParentWindow,R);
  CreateScreenSaverWindow(R.Right - R.Left,R.Bottom - R.Top,ParentWindow);
  CreateThread(nil,0,@PreviewThreadProc,nil,0,Dummy);
  while GetMessage(Msg,0,0,0) do begin
    TranslateMessage(Msg);
    DispatchMessage(Msg);
  end;
end;

//-----------------------------------------
procedure RunFullScreen;
var
   hw:hWnd;
   Msg:TMsg;
   R:TRect;
   Dummy:dword;
begin
  QuitSaver := false;  MouseMove := 3; IsPreview := false;
  classname := 'SimpleScreenSaverClass';
  GetWindowRect(GetDesktopWindow,R);
  hw := CreateScreenSaverWindow(R.Right - R.Left,R.Bottom - R.Top,0);
  CreateThread(nil,0,@PreviewThreadProc,nil,0,Dummy);
  SystemParametersInfo(spi_SetScreenSaveActive,1,@Dummy,0);
  while GetMessage(Msg,0,0,0) do begin
    TranslateMessage(Msg);
    DispatchMessage(Msg);
  end;
  SystemParametersInfo(spi_SetScreenSaveActive,0,@Dummy,0);
end;

//-----------------------------------------
procedure RunScreenSaver;
  var s:string;
begin
  s:= ParamStr(1);
  if Length(s) > 1 then begin
    delete(s,1,1);
    s[1] := UpCase(s[1]);
  end;
  if s = 'P' then RunPreview
  else RunFullScreen;
end;

end.


Это сообщение отредактировал(а) bober - 20.2.2006, 15:52
PM MAIL   Вверх
Snowy
Дата 20.2.2006, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 30
Всего: 484



Все работает.
Просто ошибка с координатами в процедуре отрисовки:
Код
procedure DrawSingleBox;    
var
  PaintDC: hDC;
  Info : TPaintStruct;
  Color:integer;
  OldBrush:hBrush;
  R:TRect;
begin
  PaintDC:=BeginPaint(PreviewWindow,Info);
  Color := RGB(Random(255),Random(255),Random(255));
  OldBrush:=SelectObject(PaintDC,CreateSolidBrush(Color));
  GetWindowRect(PreviewWindow,R);
  Rectangle(PaintDC,0,0,R.Right-R.Left,R.Bottom-R.Top); // Поправь вот эту строку - вот так правильно
  DeleteObject(SelectObject(PaintDC,OldBrush));
  EndPaint(PreviewWindow,Info);
end;

PM MAIL   Вверх
bober
Дата 20.2.2006, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 20.2.2006

Репутация: нет
Всего: нет



Спасибо, огромное!!!

Вот блин затмение, нашло. smile
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.1023 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.