Скриншот

Тема в разделе "WASM.WIN32", создана пользователем Quark, 9 ноя 2007.

  1. Quark

    Quark New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2007
    Сообщения:
    211
    Как можно программно сделать снимок экрана?
     
  2. Arthur

    Arthur New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2007
    Сообщения:
    494
    GetDesktopWindow, GetDC, BitBlt.

    С помощью GetDesktopWindow получаем дескриптор десктопа, потом с помощью GetDC - получаем дескриптор DC, после чего копируем с помощью BitBlt.
     
  3. seiko

    seiko New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2007
    Сообщения:
    98
    у меня вопрос по этой теме
    вот код процедуры, рисующей шарики случайного цвета и размера (до заданного),
    хочу сделать это как скринсейвер, но я хочу, чтобы всё это художество вылезало прямо на окна, то есть на копию экрана, чтобы после нажатия клавиши это можно было удалить. При рисовании битмепа посторонним канвасом вылетает ошибка canvas does not allow drawning

    Вот кусок кода модуля:

    Код (Text):
    1. procedure Jeans(struct:pointer);
    2. Var Ifcol:boolean; r:TRect;
    3. X, Y: Integer; size,sizelimit,time:cardinal; col:TColor;
    4. begin
    5. randomize;
    6. with PScreenJoke(struct)^ do ///это моя структура с параметрами скринсейвера
    7. begin
    8.  Ifcol:=AllColors;
    9.  sizelimit:=LimitOfSize+1;
    10.  if OneSize then size:=sizelimit;
    11.  if not ifcol then col:=ParticularColor;
    12.  time:=Wait;
    13. end;
    14. bit:=TBitmap.Create;
    15. ///Это всё глобальные переменные, они дестроятся потом при завершении потока
    16. c:=TCanvas.Create;
    17. d:=TCanvas.Create;
    18. SX:=GetSystemMetrics(0);
    19. SY:=GetSystemMetrics(1);
    20. bit.Width:=SX;
    21. bit.Height:=SY;
    22. DC:=GetDC(0);
    23. c.Handle:=DC;
    24. {i
    25. f not BitBlt(bit.Canvas.Handle,0,0,SX,SY,DC,0,0,SRCCopy) then
    26. MessageBox(0,'Drawning in this way is not allowed','Error',MB_ICONERROR);
    27. c.Handle:=GetDC(0);
    28. Просто по-разному уже пробовал
    29. }
    30. r:=Rect(0,0,SX,SY);
    31. bit.Canvas.CopyRect(r,c,r);
    32. c.Free;
    33. if not ifcol then
    34. bit.Canvas.Brush.Color:=col;
    35. repeat
    36.  X := Random (SX);
    37.  Y := Random (SY);
    38.  if size<>sizelimit then size:=Random(sizelimit);
    39.  if ifcol then
    40.  bit.Canvas.Brush.Color:=colors[random(22)];
    41.  bit.Canvas.Ellipse(X - size, Y - size,
    42.  X + size, Y + size);
    43.  d.Draw(0,0,bit); ///после этого вылетает ошибка
    44.  sleep(time);
    45.  
    46. until false;
    47. end;
    жду ваших советов