Autor Beitrag
Benedikt
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 05.02.04 22:31 
Hallo,

Vielleicht hat sich schon der ein oder andere gefragt, wie so eine Farbauswahl-Pipette für den kompletten Desktop funktioniert. Viele Bildbearbeitungs-Programme bieten so eine Funktion ja auch.
Folgender Tipp ist nun also dafür da, um eine Farbauswahl-Pipette zu erstellen, mit der eine Farbe irgendwo vom Desktop oder aus einem laufenden Programm gewählt werden kann.

Es werden benötigt:
1 Button zum Auswählen der Pipette (im Beispiel 'Button1')
1 Panel zum Anzeigen der Farbe (im Beispiel 'Panel1')

2 Variablen (private):
Immer die aktuelle Farbe unter dem Mauscursor
PipetteColor: TColor;

Aktivität der Pipette
PipetteActive: Boolean;

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
//Button MouseDown
procedure TForm1.Button1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
      //ein anderer Mauscursor wird geladen  
      SetCursor(LoadCursor(0, IDC_HAND));  
        
      //sämtliche Mausereignisse werden an den Button gesendet
      SetCapture(Button1.Handle);      
      
      //die Pipette ist aktiv 
      PipetteActive:=TRUE;        
end;


//Button MouseUp
procedure TForm1.Button1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
      //die Pipette ist nicht mehr aktiv       
      PipetteActive:=FALSE;        
  
      //der Mauscursor wird wieder zurückgesetzt        
      SetCursor(LoadCursor(0, IDC_ARROW));  
        
      //das senden der Mausereignisse an den Button wird aufgehoben
      ReleaseCapture;          
        
      //die gewählte Farbe wird dem Panel entgültig zugewiesen
      //PipetteColor kann dann weiterverarbeitet werden        
      Panel1.Color:=PipetteColor;      
end;

//Button MouseMove
procedure TForm1.Button1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var
  P: TPoint;
  DC: HDC;
  Col: TColorRef;
begin
      if (PipetteActive=TRUE) then
      begin
            //Mauscursor-Position wird in P geschrieben                
            GetCursorPos(P);      

            DC:=CreateDC('DISPLAY'nilnilnil);

            try
                  //Farbe für den Pixel unter dem Mauscursor wird ermittelt.
                  Col:=GetPixel(DC, P.X, P.Y);    
                        
                  //Farbe wird zugewiesen
                  PipetteColor:=Col;  
                  Panel1.Color:=Col;  
            finally
                  DeleteDC(DC);
            end;
      end;
end;