23. oktober 2004 - 22:13Der 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).
I dette særtema om aspekter af AI ser vi på skiftet fra sprogmodeller til AI-agenter, og hvordan virksomheder kan navigere i spændet mellem teknologisk hastighed og behovet for menneskelig kontrol.
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
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);
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!
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()?
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)?
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
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.