Announcement

Collapse
No announcement yet.

GetPixel mit Handle von transparentem Panel?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • GetPixel mit Handle von transparentem Panel?

    Hey.
    Ich verwende Borland C++ Builder 6:

    Ich habe auf einem Formular ein Panel mit der Farbe 255-0-255. (clFuchsia)
    Im Formular ist diese Farbe mit: TransparentColorValue 255-0-255 erfasst.

    Somit habe ich beim Start der Anwendung ein transparentes Feld und kann alles im Hintergrund der Anwendung sehen.

    Ich möchte nun die Farbe eines Pixels in diesem Bereich ermitteln:
    Code:
    HDC dc = GetDC(Panel1->Handle);
    COLORREF c = GetPixel(dc, x, y);
    
    int cR = GetRValue(c), cG = GetGValue(c), cB = GetBValue(c); // liefert immer 255-0-255
    Wenn ich statt dem Handle des Panels einfach den ganzen Display (0) als Handle nehme,
    kann ich zwar alle Pixel richtig auslesen, aber dadurch dauert es viel länger und die Position
    zu bestimmen ist auch komplizierter als es sein soll.

    Ich suche nun also nach einer Möglichkeit, die Farbe der Pixel im transparenten
    Bereich zu scannen, ohne das er mir 255-0-255 ausgibt.

  • #2
    Du musst das Handle von dem ermitteln, was drunter ist
    Christian

    Comment


    • #3
      Originally posted by Christian Marquardt View Post
      Du musst das Handle von dem ermitteln, was drunter ist
      Ok, danke schonmal für die Info.
      Allerdings wären wir dann jetzt bei der Frage: Wie mach ich das?
      Gehört dieser Teil denn noch zu meiner Anwendung?
      Hab noch nie was in diesem Bereich gemacht und bin nun an dem Punkt,
      wo ich nichtmal weiß wonach ich suchen soll.

      Comment


      • #4
        Gehört dieser Teil denn noch zu meiner Anwendung?
        Das weiss ich nicht, ob das Fenster dahinter zu deiner Anwendung gehört. Das wird auch immer unterschiedlich sein, wenn es nicht den Fenster ist. Wenn es der Desktop ist, dann ist das Vorgehen über DC 0 richtig. Ansonsten musst du anhand der Koordinaten der Maus? das Fenster ermitteln, as dahinter liegt
        WindowFromPoint
        http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx
        Zuletzt editiert von Christian Marquardt; 16.05.2012, 18:21.
        Christian

        Comment


        • #5
          ok... werd ich mir mal anschauen.
          Schade das es nur so umständlich zu lösen ist.

          Comment


          • #6
            So... habe das ganze jetzt gut umsetzen können und bin auch zufrieden mit der Lösung.

            Was jetzt noch fehlt, wäre die Möglichkeit herauszufinden, wo sich die Maus in Relation
            zum ausgewählten Fenster befindet.

            Bei einer Bildschirmauflösung von 1920x1080 und einem Fenster von 340x280 Pixel
            wäre es einfacher, wenn man über das Handle des Fensters erfragen könnte,
            wo sich die Maus befindet.

            Gibt es eine Funktion um die Mausposition innerhalb eines Fenster, mit dessen Handle
            zu ermitteln?

            Comment


            • #7
              Wenn ich micht recht erinne sollte die TForm sowas wie GetCursorPos haben
              Christian

              Comment


              • #8
                Achso... sorry, hab vergessen es zu erwähnen:
                Ich habe einen transparenten Panel, der mir ein Fenster hinter dem Formular zeigt.

                Das Fenster hat also nix mit meiner Anwendung zu tun.
                Ich hole mir mit "WindowFromPoint" das Handle vom Fenster für GetDC(handle).

                Jetzt bräuchte ich noch eine Funktion um von diesem Fenster die relative Mausposition zu ermitteln.

                Comment


                • #9
                  ScreentoClient

                  oder

                  http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx

                  und selbst berechnen
                  Zuletzt editiert von Christian Marquardt; 21.05.2012, 16:00.
                  Christian

                  Comment


                  • #10
                    Soweit ist mir das schon klar, aber das hilft mir gerade nicht weiter.

                    Folgendes Problem mit dem Mauszeiger der (fremden) Anwendung:
                    Sobald man über das Fenster der Anwendung geht, ändert sich der normale Mauszeiger
                    in seiner Form und leider auch in seiner Position.

                    GetCursorPos() liefert mir dann zwar die Koordinaten wo der Cursor unter Windows wäre,
                    aber in der Anwendung selber ist der Cursor dann in einem Bereich von +-55 Pixel
                    nach oben / unten und/oder links/rechts verschoben.

                    Daher such ich also eine Möglichkeit, mir von der Anwendung selbst, die Position
                    des Mauszeigers geben zu lassen. GetCursorPos() hilft mir leider nicht weiter.

                    Comment


                    • #11
                      Soweit ist mir das schon klar, aber das hilft mir gerade nicht weiter.
                      Warum nicht?

                      Du kannst die absoluten Koordinaten in Fensterkoordinaten umrechnen.

                      Daher such ich also eine Möglichkeit, mir von der Anwendung selbst, die Position
                      des Mauszeigers geben zu lassen. GetCursorPos() hilft mir leider nicht weiter.
                      Ich habe dir ja auch 2 weitere Funktionen genannt.
                      Christian

                      Comment


                      • #12
                        Bevor ich jetzt damit weiter rumprobiere, was ich die letzten 2 Stunden gemacht hab,
                        möcht ich noch kurz ein Beispiel bringen, um zu wissen ob das so klappt:

                        Windows Cursor Position: 100,100
                        Die Anwendung hab ich auf 0,0 geschoben, also müsste die Maus ja in der Anwendung auch bei 100,100 sein.

                        Aber der Mauszeiger liegt jetzt zum Beispiel bei 90,140.

                        Kann ich in diesem Fall die Position 90,140 mit deinem Beispiel ermitteln?
                        Weil ich bekomme immer nur die Mausposition von Windows, nicht die der Anwendung.

                        Comment


                        • #13
                          Gehe davon aus dass das so funktioniert. Mehr als die API Methoden hast du nicht.

                          Wenn du 120 120 als Koordinaten hast und das Fenster bei 100 100 liegt, kannst 20 20 errechnen
                          Christian

                          Comment


                          • #14
                            Nachdem ich leider noch nicht weiter gekommen bin, hab ich nochmal eine Nacht drüber geschlafen.

                            - Ich weiß wie ich die Mausposition unter Windows herausbekomme.
                            - Ich weiß wie ich die Position der Fremden Anwendung auf dem Bildschirm bekomme.
                            - Ich weiß wie ich die Position des Mauszeigers in Relation zur Position innerhalb der Anwendung berechnen kann.

                            Aber das hilft mir alles nicht weiter, da der Mauszeiger innerhalb der Anwendung
                            eine andere Position hat, als der Windows-Mauszeiger.
                            Windowsmauszeiger Position: 100,100 - aber in der Anwendung ist es dann i-wo zwischen +-55 Pixel pro Achse abweichend.
                            Wie soll ich das berechnen, wenn ich den genauen Wert nicht kenne?

                            Wenn man sich ein Quadrat vorstellt dessen Zentrum der Windowsmauszeiger ist,
                            und dessen Kantenlängen 110x110 Pixel betragen, dann hat man den Bereich in
                            dem sich der Cursor innerhalb der Anwendung befindet.

                            Aber berechnen kann ich den Wert nicht, da er variabel ist und ich erst die
                            Position brauche um ihn berechnen zu können.

                            Comment


                            • #15
                              Für das NC-Area ist das wohl zuviel. Zeige doch mal den Code
                              Christian

                              Comment

                              Working...
                              X