Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Pascal: Miten käytetään GetPixeliä?(Delphi)

Sivun loppuun

Mandariinimies [27.01.2006 16:33:00]

#

Miten pystyn siirtämään kursorin johonki kohtaan värin kautta? Esimerkiksi jos haluaisin ohjelman etsivän värin 4610(musta) ja siirtävän kursorin sen mustan kohdalle ja klikkaavan sitä? GetPixeliä tässä varmaan tarvitaan mutta miten sitä käytetään? Olen yrittänyt väsätä jotain tällaista:

procedure TForm1.Button1Click(Sender: TObject);
var dc:hdc;
TPoint : integer;
begin
TPoint:=GetPixel(dc,600,500);
Mouse.CursorPos:=TPoint;
end;

end.

Toivottavasti älyätte jotain näistä mun selityksistä :D

zacura [27.01.2006 18:53:51]

#

Jospa ensiksi lukisit vaikka jonkin Delphi-oppaan, putkan Pascal-opas on hyvä alku.

Sitten koodiisi:

TPoint:=GetPixel(dc,600,500);

GetPixel ei palauta värin sijaintia vaan värin cardinalina (32-bittinen etumerkitön kokonaisluku). Kääntäjä ei tästä herjaa koska olet määrittänyt TPoint muutujasi integer (32-bittinen etumerkillinen kokonaisluku) tyypiksi. Osavärit saa selville GetRValue,GetGValue,GetBValue funktioilla (Katso Delphin ohjeista lisää).

Mouse.CursorPos:=TPoint;

Mouse.CursorPos on TPoint tyyppi eikä siihen voi sijoittaa integeriä. Katso esimerkkiä käytöstä.

GetPixel esimerkki

var
  DC: HDC;
  color: Cardinal;
  r,g,b: Byte;
begin
  DC := GetDC(0);      //Otetaan koko näytön (HWND=0) DC (Device Context)
  color := GetPixel(DC,100,100);     //Tutkitaan pixeliä kohdassa (100,100)
  r := GetRValue(color);     //Punainen väri
  g := GetGValue(color);     //Vihreä väri
  b := GetBValue(color);     //Sininen väri
  ReleaseDC(0,DC);    //Vapautetaan DC käytön jälkeen
end;

Mouse.CursorPos esimerkki

var
  NewPos: TPoint;
begin
  NewPos.X := 100;     //Asetetaan uuden sijainnin koordinaatit
  NewPos.Y := 100;
  Mouse.CursorPos := NewPos;    //Siirretään kursori
end;

Tietynvärisen pixelin etsiminen on sitten jo isompi juttu. Esimerkiksi voisit käydä jokaisen näytön pixelin silmukassa läpi ja verrata niitä haluttuun väriin.

Ennenkuin ryhdyt tähän kannattaa opetella Delphin (Object Pascal) alkeet. Myös Delphin ohjeissa on paljon apua, ne sisältävät muun muassa Microsoftin Win32 SDK ohjetiedostot josta löytyy suurin osa WinAPI funktioista jaa niiden käytöstä, myös kaikki Delphin omat funktiot ja luokat ovat hyvin dokumentoituja. Nämä saa kätevästi esiin valitsemalla funktion tai luokan nimen koodista ja painamalla F1.

Mandariinimies [27.01.2006 18:57:33]

#

Kiitos :). Mutta tiedätkö minkälainen commandi on siihen hiiren painallukseen?

zacura [27.01.2006 19:10:05]

#

Hiiren painallus onnistuu soveltamalla tuota: http://pp.kpnet.fi/blaze/codefaq/#simulatemouse

Se on VB:tä mutta helposti siitä saa pascaliakin. Niistä Private Declare/Const riveistä ei tarvitse välittää, delphissä nämä löytyvät Windows unitista.

Metabolix [27.01.2006 20:18:58]

#

TPoint ei ole hyvä muuttujan nimeksi, koska se on tyyppi (record, jossa on kaksi LongInt-jäsentä).

"värin 4610(musta)"
Jaa? Se ei tietääkseni mikään musta ole. Heksana tuo on $001202, eli aavistuksen vihertävä. Musta on käytännöllisesti katsoen aina nolla.

Mandariinimies [28.01.2006 11:20:05]

#

Zacura, miten toi mouse_event sitte toimii tässä Delphissä?

Metabolix [28.01.2006 16:22:10]

#

Yritäpä itse. Aivan samalla tavalla kuin tuossa esimerkissäkin. Vilkeise myös ohjeita (Win32 API). Ja haullakin saattaa löytyä esimerkki.

Mandariinimies [28.01.2006 16:42:34]

#

Joo..Sepä olikin noin helppoa :) Kiitos pojat^^ Rupesin aluksi vain kopioimaan tuota koodinpätkää tuolta sivulta :D

Mandariinimies [29.01.2006 17:25:30]

#

Eikö Delphillä ole mitään tämäntapaista lausetta kuin : FindColor(tähän väri) ? Kun tuolla GetPixelillä ei voi etsiä niitä värejä :O..

Metabolix [29.01.2006 17:27:07]

#

Ei tiettävästi. Joudut looppaamaan läpi.

Mandariinimies [29.01.2006 17:33:19]

#

Voihan..Siis näinkö:
Color:=GetPixel(dc,1,1) and GetPixel(dc,1,2) and GetPixel(dc,1,3)......?

ja sitten jos haluan sen värin niin:
if Color=(väri) then MouseCursorPos(...?

Metabolix [29.01.2006 17:44:01]

#

function Etsi(Etsittava: TColor; DC: HDC; Width, Height: Integer): TPoint;
var
  X, Y: Integer;
label
  Ulos;
begin
  Result.X := -1;
  Result.Y := -1;
  for X := 0 to Width - 1 do
    for Y := 0 to Height - 1 do
      if GetPixel(DC, X, Y) = Etsittava then
      begin
        Result.X := X;
        Result.Y := Y;
        goto Ulos;
      end;
  Ulos:
end;

Pascal-oppaan lukeminen voisi auttaa.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta