Avatar billede macpain Nybegynder
23. oktober 2004 - 22:13 Der er 14 kommentarer og
1 løsning

Tjek af Background Color(BackColor)

Ja, i sig selv lyder det ikke til at være svært. Hvilket det måske heller ikke er.

Men det som jeg gerne vil finde er en bagrundsfarve i en firkant på en form. Dvs at det ikke er baggrundsfarven på hele formen hvilket der ikke vil være noget problem.

Kort sagt: Jeg har en farve som baggrundsfarve på hele formen. På denne form har jeg nogle objekter med en anden farve. Hvis jeg så tager et tilfældigt udsnit af formen vil jeg gerne se om jeg har ramt et af objekterne(lige som et spil).

Takker for jeres input!
Avatar billede moocher Nybegynder
23. oktober 2004 - 22:18 #1
Er det ikke lettere at tjekke om klikkets punkt ligger inde for objectes kordinater?
Avatar billede macpain Nybegynder
23. oktober 2004 - 22:23 #2
Desværre nej, da punkterne ikke ligger lige altså bare x,y,width,height de er også drejet(brug af TranslateTransform og RotateTransform).
Jeg vil også gerne senere kunne tjekke for ellipse objekter. Hvilket der vil kræve nogle meget komplicerede udregninger
Avatar billede moocher Nybegynder
23. oktober 2004 - 22:27 #3
Er vant til Delphi.. Men der er en funktion der kan tjekke om punktet er inden for objectet.. Ville også tro at det er der i C++

Kan ike hjælpe ellers desværre
Avatar billede sovsekoder Nybegynder
24. oktober 2004 - 13:06 #4
hente farve under cursor, det er en form med label1 og en timer1 sat til interval=100, og den er startet:

Color GetColor(int x, int y)
        {
            // Get desktop DC
            int hDC = GetWindowDC(0);
            // Get color under cursor
            int lColor = GetPixel(hDC, x, y);
            lColor = (lColor>>16 & 0xff) | (lColor&0xff00) | (lColor<<16&0xff0000);
            Color c = Color.FromArgb((int)((uint)lColor | 0xff000000));
            return c;
        }

        private void timer1_Tick(object sender, System.EventArgs e)
        {
            // Get screen cursor pos.
            ApiPoint p = new ApiPoint();
            GetCursorPos(ref p);

            // Get mouse.pos
            Color c = GetColor(p.x, p.y);   
            label1.Text = string.Format("{0:0000},{1:0000}", p.x,p.y);
            label1.BackColor = c;
            Invalidate(true);
        }

        public struct ApiPoint
        {
            public int x;
            public int y;
        }

        [DllImport("gdi32.dll")]
        static extern int GetPixel(int hdc, int x, int y);

        [DllImport("user32.dll")]
        static extern uint GetCursorPos(ref ApiPoint lpPoint);
       
        [DllImport("user32.dll")]
        static extern int GetWindowDC(int hwnd);
Avatar billede sovsekoder Nybegynder
24. oktober 2004 - 13:09 #5
og hvis du skel hente farven i vinduet må du lave noget i stil med
..i GetColor
hDC = GetWindowDC(Handle.ToInt32())

kalde GetColor(x,y) hvor x,y er koordinaterne i formen
Avatar billede macpain Nybegynder
24. oktober 2004 - 17:25 #6
Ok, tak for det sidder lige og kigger på om det er muligt at have lavet det med Rectangles hvor man bruger Contains(x,y). Men det holder ikke rigtig til en senere udbyggelse....Så tak for det. Nu må jeg lige se hvornår jeg får det implementeret.

Jeg vender lige tilbage med om det virker(hvorfor skulle det ikke det ser jo fornuftigt ud), du skal jo have de fortjente point!
Avatar billede sovsekoder Nybegynder
24. oktober 2004 - 19:44 #7
oki doki
Avatar billede macpain Nybegynder
24. oktober 2004 - 23:39 #8
Jeg kan ikke få det til at virke korrekt!!

Det jeg gør er:
  .....
  .....
  Color GetColor(int x, int y)
  {
    // Get desktop DC
    int hDC = User32.GetWindowDC(User32.GetForegroundWindow());
    // Get color under cursor
    int lColor = GetPixel(hDC, x, y);
    lColor = (lColor>>16 & 0xff) | (lColor&0xff00) | (lColor<<16&0xff0000);
    Color c = Color.FromArgb((int)((uint)lColor | 0xff000000));
    User32.ReleaseDC(User32.GetForegroundWindow(),hDC);
    return c;
  }
  [DllImport("gdi32.dll")]
  static extern int GetPixel(int hdc, int x, int y);
}
class User32
{
  [DllImport("User32.dll")]
  public static extern int GetWindowDC(int hWnd);
  [DllImport("User32.dll")]
  public static extern int ReleaseDC(int hWnd,int hDC);
  [DllImport("user32.dll")]
  public static extern int GetForegroundWindow();
}

Problemmet er at der bliver returneret nogle uspecificerede farver, samt farver der ikke ligger på den plads der bliver henvist til.
Kan det passe at du kørte uden "ReleaseDC" da jeg gjorde løb jeg tør for hukommelse.

Kan det mon hjælpe at bruge GetWindowDC(Handle.ToInt32() istedetfor
GetWindowDC(User32.GetForegroundWindow()?
Avatar billede macpain Nybegynder
24. oktober 2004 - 23:41 #9
Forresten hvorledes vil du bruge GetWindowDC(Handle.ToInt32()) jeg kan ikke lige se hvor jeg skal få handlet fra
Avatar billede sovsekoder Nybegynder
25. oktober 2004 - 01:51 #10
Handle.ToInt32(): da jeg lavede koden var jeg inde i en form (Control) dvs this.Handle.ToInt32() (er det samme som Handle.ToInt32()).

det med at den ikke henter den rigtige farve: da jeg kørte programmet i den oprindelige form (hvor man kigger på hele desktoppen) virkede det fint, så måske det er fordi at x,y der kommer ind i GetColor ikke passer helt. Du kunne prøve at tjekke om x=0 og y=0 når du er i øverste hjørne af vinduet (det vindue som du henter DC'et fra). Kunne det måske være noget med at Captionen (den øverste del af vinduet, ved ikke hvad den hedder i fagsprog) ikke er talt med i (x,y)?
Avatar billede macpain Nybegynder
25. oktober 2004 - 03:08 #11
Underligt det prøvede jeg også.....men da virkede det ikke men det gør det nu! Jeg må have lavet et eller andet mærkeligt.

Men jeg må lige kigge videre på det senere i morgen!
Avatar billede sovsekoder Nybegynder
25. oktober 2004 - 19:37 #12
se evt. http://www.eksperten.dk/artikler/485 for simpel sprite kollision (rektangler der støder sammen) - og grundlæggende info et simpelt om C# spil.
Avatar billede macpain Nybegynder
26. oktober 2004 - 01:40 #13
Jeg har siddet og leget lidt, jeg har fundet ud af at hvis jeg skal eammenlign farverene skal det være via Color.xxxx.ToArgb() == hentetFarve.ToArgb() ellers virker det ikke.
Mit problem består bare i nu at der bliver tegnet på en måde på skærmen men windows tror noget andet pga TranslateTransform og RotateTransform.
Ak ja, men jeg syntes du skal have pointene, din måde til at hente farve virker da.
Så skriv et svar
Avatar billede macpain Nybegynder
26. oktober 2004 - 22:32 #14
Så virker det langt om længe!!!

Jeg vil meget gerne give dig point for din hjælp, så bare skriv et svar.

Og det har intet med translateTransform som jeg skrev tidligere.
Det var koden bag hele systemet, der fejlede!

Color.xxxx.ToArgb() == hentetFarve.ToArgb()  var sagen, og pointerne der læses fra skal tillægges kanterne og titlebaren
Avatar billede macpain Nybegynder
22. juni 2005 - 22:33 #15
Stopper spg.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester