Tworzenie obrazka w obszarze kliknięcia.

0

Dość nietypowa sprawa..
Dałoby się zrobić coś takiego : Po kliknięciu lewego przycisku myszy, stworzy się obrazek o rozdzielczości 100x100 pikseli wokoło obszaru gdzie kliknąłem.
PrintScreen w całości (1024x768) odpada.

 Msg:=PEventMsg(lParam)^;
 if Msg.message=WM_LBUTTONDOWN then begin
0
var
dc:HDC
begin
dc:=Windows.CreateDC('DISPLAY',nil,nil,nil);

i po tym dc'ku możesz sobie ciapać

0

moze jakis króciutki komentarz ? :> w "guglach" nic ni ma : /

0

w module Windows wyszukuj DC i HDC to znajdziesz metody co robią coś z Display Control

a tu łap kodzikiem co używa dc'ka

unit Desk;

interface

uses
  Windows,
  Forms,
  Dialogs,
  SysUtils,
  Graphics;

var
  dc:hdc;

procedure Initialize();
procedure Ending();
procedure Info(Width,Heigth:integer);
procedure WriteIt(x,y:integer;text:string);
procedure Matrix(Chars:string;SleepTime,LoopCount,LineLength,LinesCount:integer);
procedure Rectangle(x1,y1,x2,y2:integer);

implementation

procedure Matrix(Chars:string;Sleeptime,LoopCount,LineLength,LinesCount:integer);
var
  i:integer;
  lines:array of string;

procedure FirstStep();
var
  a,b:integer;
  temp:string;
begin

  Windows.SetTextColor(dc,clLime);
  Windows.SetBkColor(dc,clBlack);

  SetLength(lines,LinesCount);

  for a:=0 to (LinesCount-1) do
  begin

    SetLength(temp,LineLength);

    for b:=1 to LineLength do
    begin

      temp[b]:=Chars[ Random(Length(Chars)) + 1 ];

    end;

    lines[a]:=temp;

    Windows.TextOut(dc,0,a*16,PChar(temp),LineLength);

  end;

end;
procedure Step();
var
  a:integer;
  temp:string;
begin          

  SetLength(temp,LineLength);

  for a:=1 to LineLength do
  begin

    temp[a]:=Chars[ Random(Length(Chars)) + 1 ];

  end;

  lines[LinesCount-1]:=temp;

  for a:=1 to (LinesCount-1) do
  begin

    lines[a-1]:=lines[a];

  end;

  for a:=0 to (LinesCount-1) do
  begin

    Windows.TextOut(dc,0,a*16,PChar(lines[a]),LineLength);

  end;

end;
begin

  FirstStep();

  for i:=1 to LoopCount do
  begin

    Sleep(SleepTime);
    Step();

  end;

end;

procedure WriteIt(x,y:integer;text:string);
begin

  Windows.TextOut(dc,x,y,PChar(text),Length(text));

end;

procedure Info(Width,Heigth:integer);
begin

  Width:=Screen.Width;
  Heigth:=Screen.Height;

end;

procedure Initialize();
begin

  dc:=Windows.CreateDC('DISPLAY',nil,nil,nil);

end;

procedure Ending();
begin

  Windows.DeleteDC(dc);

end;

procedure Rectangle(x1,y1,x2,y2:integer);
begin

  Windows.Rectangle(dc,x1,y1,x2,y2);

end;
0
 Msg:=PEventMsg(lParam)^;
 if Msg.message=WM_LBUTTONDOWN then begin
   GetCursorPos(P);
  ('Współrzędne myszy: ' + (IntToStr(p.X)+' '+IntToStr(p.Y)));
 end;

Sprawdzamy gdzie kursor się znajduje..

To chyba jest niemożliwe do zrobienia, bo w pixelach pozycja 0,0 to lewy górny róg więc...

0

ale że jak? ujemne wyniki dostajesz czy co?

0

Nie : p
Współrzędne punktu, np : 230, 340 -- > 230 w prawo, 340 - w dół

Więc jak utworzę obrazek o rozdzielczości 230,340 to punkt 230,340 będzie centralnie w prawym dolnym rogu..

0

obrazek.X := Obrazek.X + ( Obrazek.Width div 2 );
obrazek.Y := Obrazek.Y + ( Obrazek.Height div 2 );

=]

0

znaczy rysowanie zaczyna się od lewego górnego rogu czyli zamiast + powinno być -
czyli przesuwamy obrazek o połowę jego wymiarów by wycentrować go =]

0

dzieki w ogóle ze sie udzielasz w temacie.. : )

To co wczesniej napisalem to w paincie robie obrazek i w <ort>atrybutah </ort>podaje piksele, bo chcialem napisac o tym że lewy górny róg to (0,0)...

Sama moja ogólnie procedura robienia print screena.. Chociaż nie wiem czy to coś wniesie do tematu

   ii := '.jpg';
Bitmap:=TBitmap.Create;
FJpeg := TJpegImage.Create;
Bitmap.Width:=GetSystemMetrics(SM_CXSCREEN);
Bitmap.Height:=GetSystemMetrics(SM_CYSCREEN);
ScreenDC:=GetDC(0);
BitBlt(Bitmap.Canvas.Handle,0,0,GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN), ScreenDC, 0 , 0, SRCCOPY);
ReleaseDC(0, ScreenDC);
FJpeg.Assign(Bitmap);
Bitmap.Free;
FJpeg.CompressionQuality:=10;
FJpeg.Compress;
FJpeg.SaveToFile('D:\' + i + ii);
FJpeg.Free;
0

jeśli chcesz to na ekranie pacnąć to przecież możesz rysować an tym dc'ku
dc:=Windows.CreateDC('DISPLAY',nil,nil,nil);
a żeby pobrać z ekranu to też z tego dc'ka chyba się da =]

i z tego co w helpie właśnie wyczytałem to możesz użyć drukowania do pliku

Applications written for earlier versions of Windows used the lpszOutput parameter to specify a port name or to print to a file. Win32-based applications do not need to specify a port name. Win32-based applications can print to a file by calling the StartDoc function with a DOCINFO structure whose lpszOutput member specifies the path of the output filename.

więc niezbyt kojarzę gdzie w tym problem, wyłapywanie klika masz, pobieranie uchwytu ekranu jest, metodkę do pacania bitmap na dc'ka masz, więc tylko narysować bitmapę w pozycji ( mouse.X - img.Width div 2 , mouse.Y - img.height div 2 ) i środek bitmapki jest w pozycji kliknięcia

chyba że problem jest inny =D

0
mouse.X - img.Width div 2 , mouse.Y - img.height div 2

Nie rozumiem tego <ort>w ogóle</ort>...
To chyba dla mnie niewykonalne..

Wiesz może dlaczego jak daję aby zrobiło screena podczas wciśnięcia LPM, to na screenie nie widać kursora ?
Kody są na 1 stronie

0

ehm? to się wszystko rozchodzi o kursor? gdzieś tu na forum był niedawno temat o skrinszotach z kursorem

0

ale w sumie to możesz pobrać pozycję kursora i domalować coś żeby udawało kursor?

0

Główna koncepcja stworzenia takiego programu była taka :
W momencie naciśnięcia LPM miał się stworzyć obrazek wokoło kursora na 100,100 pikseli - > Kliknąłem na krzyżyk w przeglądarce i miał się utworzyć obrazek , mniej wiecej taki : user image

0

no to czemu nie weźmiesz dc ekranu i na nim nie narysujesz obrazka (albo zwykłe kółko) w odpowiednim miejscu?

0

Chciałbym aby na obrazku tworzył się text.. Tylko ten Canvas nie chce mi działać.. (Undeclared) Co mam źle ?

   ii := '.jpg';
Bitmap:=TBitmap.Create;
FJpeg := TJpegImage.Create;
Bitmap.Width:=GetSystemMetrics(SM_CXSCREEN);
Bitmap.Height:=GetSystemMetrics(SM_CYSCREEN);
ScreenDC:=GetDC(0);
BitBlt(Bitmap.Canvas.Handle,0,0,GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN), ScreenDC, 0 , 0, SRCCOPY);
ReleaseDC(0, ScreenDC);
FJpeg.Assign(Bitmap);
Bitmap.Free;
FJpeg.CompressionQuality:=10;
FJpeg.Compress;
FJpeg.SaveToFile('D:\lol\' + i + ii);
FJpeg.LoadFromFile('D:\lol\' + i + ii);
Canvas.Font.Name := 'Arial Black';
Canvas.TextOut(100, 100, 'IntToStr(p.X)+' '+IntToStr(p.Y))');
FJpeg.SaveToFile('D:\lol\' + i + ii);
FJpeg.Free;
 i:=i+1
0

Zamiast:

Canvas.TextOut(100, 100, 'IntToStr(p.X)+' '+IntToStr(p.Y))');

Nie powinno być:

Canvas.TextOut(100, 100, IntToStr(p.X) + ' ' + IntToStr(p.Y));

?

jakbyś zapisał plik jako .bmp i używał TBitmap to byś nie miał problemów ;p

0

Niby tak ale pisałem że Canvas jest Undeclared.

0

Byłem troche roztrzepany piszac odpowiedź poprzednią ..
Teraz mam koncepcję PTwr, bo wpisuje mi text na mój obrazek :) Canvas działą super.. I tak sobie myślę .. Może by wyciąć z punktu P (x,y kursora) prostokąt czy tam coś o wymiarach 100x100 (punkt P to środek prostokąta) i zapisać do pliku ?

1 użytkowników online, w tym zalogowanych: 0, gości: 1