Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Bitmap Transparent auf ein Formular über andere Komponenten zeichnen (https://www.delphipraxis.net/189878-bitmap-transparent-auf-ein-formular-ueber-andere-komponenten-zeichnen.html)

jayjay77 2. Aug 2016 23:57

Bitmap Transparent auf ein Formular über andere Komponenten zeichnen
 
Hallo,
ist es möglich ein BMP dynamisch auf einem Formular übergeordnet über alle Kompetenten zu zeichnen?
Im Moment zeichne ich auf den Screen(leider nicht Transparent) und nicht auf das Formular.

Die Idee dahinter:
Bei einer Fehleingabe kann man mit z.B. Edit1.SetFocus, der Komponente den Focus übergeben.
Jetzt möchte ich noch zusätzlich, dass ein Pfeil.bmp geladen und neben dem Edit1 Transparent gezeichnet wird.
Damit der User genau sieht, "Hallo, hier stimmt was nicht".


Folgende Aufrufe habe ich schon



Code:
    If Edit1.Text ='0'Then
     Begin
      ShowMessage('Fehler.....');
      Edit1.Text:='';
      Edit1.SetFocus;
      Get_HintPos(Form1,Edit1);
      Exit;
     End;
Code:
//Position der Komponente zum positionieren herausfinden
procedure Get_HintPos(Formular:TForm;KKomp:TControl);
var
 i                          : integer;
 P                          : TPoint;
 Hint_KLeft                 : Integer;
 Hint_KTop                  : Integer;
 Hint_KWidth                : Integer;
 Hint_KHeight               : Integer;
 Hint_Form                  : TForm;
 Hint_KompName              : String;
 Hint_Komp                  : TControl;
 Hint_X                     : Integer;
 Hint_Y                     : Integer;
begin
   for i := 0 to Formular.ComponentCount -1 do
   if (Formular.Components[i] is TControl) then
   begin
      if KKomp.Name = Formular.Components[i].Name then
       begin
        P:=KKomp.ClientToScreen(Point((Formular.Components[i] as TControl).Left, (Formular.Components[i] as TControl).Top));
        Hint_Form   := Formular;
        Hint_Komp   := KKomp;
        Hint_KompName:= KKomp.Name;
        Hint_X      := P.X;
        Hint_Y      := P.Y;
        HintK_Left  := (Formular.Components[i] as TControl).Left;
        HintK_Top   := (Formular.Components[i] as TControl).Top;
        HintK_Width := (Formular.Components[i] as TControl).width;
        HintK_Height := (Formular.Components[i] as TControl).Height;
        break;
       end;
   end;
   Set_Hint(Formular,Hint_X,Hint_Y);
end;

//Bild zeichnen
procedure Set_Hint(Formular:TForm;x,y:Integer);
var
  Bitmap         : TBitmap;
  ScreenDC       : HDC;
begin
  try
   ScreenDC := GetWindowDC(0);
   Bitmap:= TBitmap.Create;
   Bitmap.PixelFormat := pf32bit;
   Bitmap.HandleType := bmDIB;
   Bitmap.Transparent := True;
   Bitmap.TransparentColor := clwhite;
   Bitmap.LoadFromFile('c:\......bmp');
   BitBlt(ScreenDC, x, y, Bitmap.Width, Bitmap.Height, Bitmap.Canvas.Handle, 0, 0, SRCCOPY);
  finally
    Bitmap.Free;
    ReleaseDC(0, ScreenDC);
  end;
end;

Rollo62 3. Aug 2016 18:57

AW: Bitmap Transparent auf ein Formular über andere Komponenten zeichnen
 
Sollte doch auch mit einem TImage möglich sein, wenn es frei mit Top/Left bewegt werden kann.
Dann einfach dahin positionieren wo es sein soll, und mit Visible anzeigen lassen.

Vielleicht noch die Z-Oder ändern, aber ich würde mal annehmen das man das nicht braucht wenn es geschickt
mit Paneln angeordnet wird.


Rollo

ConstantGardener 3. Aug 2016 20:56

AW: Bitmap Transparent auf ein Formular über andere Komponenten zeichnen
 
... ich habe etwas ähnliches mal mit einem extra Overlay Fenster mit Transparent-Color = clWindow und folgender CreateParams procedure.

In dem Fenster kannst du dann auf den Canvas zeichnen. Den Rest mach dann Windows für dich.

Delphi-Quellcode:
unit ufrmOverlay;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls;

type
  TfrmOverlay = class(TForm)

  protected
   procedure CreateParams(var Params: TCreateParams); override;

  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

implementation

{$R *.dfm}

{ TfrmOverlay }

procedure TfrmOverlay.CreateParams(var Params: TCreateParams);
begin
  inherited CreateParams(Params);
  if Assigned(Application.MainForm) then
   begin
    Params.WndParent := GetDesktopWindow;
    Params.Style := WS_ChildWindow;
    Params.EXStyle := WS_EX_NoActivate;
   end;
end;

end.

stahli 4. Aug 2016 01:06

AW: Bitmap Transparent auf ein Formular über andere Komponenten zeichnen
 
Man kann Controls und Formulare übrigens auch "ausstanzen": http://www.delphipraxis.net/159798-t...-mit-loch.html
Eine regelmäßige Pfeilform könnte man damit realisieren.
Mit Hittest könnte man das Control (den sichtbaren Pfeil) für die Maus "durchlässig" machen.

Vielleicht wäre das ein alternativer Ansatz.

tcoman 8. Aug 2016 18:22

AW: Bitmap Transparent auf ein Formular über andere Komponenten zeichnen
 
Mir gefaellt eine andere Loesung auch ganz gut.
Dein TEdit besitzt doch eine Hintergrundfarbe.
Bei falscher Eingabe kannst du die doch auf rot
setzen:
Delphi-Quellcode:
 Edit1.Color:=clMaroon;
und bei richtiger Eingabe wieder zurueck auf ihren
urspruenglichen Wert.

Nur so eine Idee...
MfG,
Terence


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:55 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz