Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Kein Event bei PtInRect (https://www.delphipraxis.net/122737-kein-event-bei-ptinrect.html)

EWeiss 21. Okt 2008 11:24


Kein Event bei PtInRect
 
Komme nicht in PtInRect rein wenn die Maus sich über den Button befindet.
Nur beim Klick wird es ausgelößt.
Woran kann das liegen ?

Delphi-Quellcode:
GetCursorPos(CurPos);
ScreenToClient(WinHandle, CurPos);
if PtInRect(rc, CurPos) then
begin
  if IsLButtonDown then
    if WinHandle = GetFocus then
      if (GetCursor = LoadCursor(0, IDC_ARROW)) and
        (StateMax > 1) then
        UseState := 2
      else
      if StateMax > 4 then
        UseState := 5;

end;
gruss Emil

Luckie 21. Okt 2008 11:38

Re: Kein Event bei PtInRect
 
Ich glaube, du suchst MSDN-Library durchsuchenTrackMouseEvent.

EWeiss 21. Okt 2008 11:55

Re: Kein Event bei PtInRect
 
Zitat:

Zitat von Luckie
Ich glaube, du suchst MSDN-Library durchsuchenTrackMouseEvent.

Verstehe ich nicht ganz
Ich hab ein gültiges handle dieses wird vom Screen zum Clienten gesetzt
warum erkennt PtInRect nun die Mausposition nicht ?

Wenn ich micht innerhalb des Windows(Button) befinde ?

Wenn ich meinen Timer aktiviere für Aero dann wird sie erkannt.
Nur ich kann dafür nicht extra einen Timer einbauen.

Delphi-Quellcode:
        if SkinEngine.IsCompositionEnabled = False then
        begin
          if (SkinEngine.SK_AEROEMULATE = 1) and (SkinEngine.IsAeroLayered) then
          begin
            if SkinEngine.IsLButtonDown then
              IsMoving := False;
            if (IsMoving = False) or ((SkinEngine.IsLButtonDown = True) and
              (IsMoving)) then
            begin
              GetWindowRect(WinHandle, rc);
              SkinEngine.MoveBackground(rc.Left, rc.Top);
              SkinEngine.FUpdateWindow(WinHandle, False);
            end;
          end;
        end;
      end;
dann gehts.

gruss Emil

SirThornberry 21. Okt 2008 12:25

Re: Kein Event bei PtInRect
 
Hast du mal einen Haltepunkt gesetzt und bei Klick auf den Button die Werte angeschaut. Die müssten dann ja auch so sein das er rein geht. Woher sind die Werte für dein Rect und welches Handle ist WinHandle?
Wenn WinHandle das Handle des Buttons ist müsste dein Rect ja dann bei 0,0 los gehen, with und height müssten dann die Ausmase des Buttons beinhalten. Hast du das beachtet?
Aber wie bereits erwähnt ist es das einfachste den Debugger zu verwenden.

EWeiss 21. Okt 2008 12:31

Re: Kein Event bei PtInRect
 
Zitat:

Zitat von SirThornberry
Hast du mal einen Haltepunkt gesetzt und bei Klick auf den Button die Werte angeschaut. Die müssten dann ja auch so sein das er rein geht. Woher sind die Werte für dein Rect und welches Handle ist WinHandle?
Wenn WinHandle das Handle des Buttons ist müsste dein Rect ja dann bei 0,0 los gehen, with und height müssten dann die Ausmase des Buttons beinhalten. Hast du das beachtet?
Aber wie bereits erwähnt ist es das einfachste den Debugger zu verwenden.

BEim klick auf den Button funktioniert das einwandfrei das Handle des button ist korrekt
und die werte , ausmaße ebenfalls.

Kapiere nicht das kein Event ausgelößt wird wenn ich mit der Maus drübergehe.

gruss Emil

Luckie 21. Okt 2008 17:20

Re: Kein Event bei PtInRect
 
Hast du dir mal überlegt, das die API Funktion TrackMouseEvent dir genau die Arbeit abnehmen könnte?

EWeiss 22. Okt 2008 03:02

Re: Kein Event bei PtInRect
 
Zitat:

Zitat von Luckie
Hast du dir mal überlegt, das die API Funktion TrackMouseEvent dir genau die Arbeit abnehmen könnte?

Ja ;)
Werd mal schaun ob ich irgendwo einen stdcall vergessen habe
das die Messagen vom MouseMove nicht ausgewertet werden.

Ist es möglich das es daran liegt das die Winproc nicht der Klasse SkinEngine unterliegt ?

Das problem ist nur müßte dann @TSkinEngine.ImageButProc für das erstellte Fenster übergeben
Denke das ist auch nicht so das wahre.

gruss Emil

EWeiss 22. Okt 2008 10:40

Re: Kein Event bei PtInRect
 
Hab das nochmal geprüft..
Denke das Problem kommt wo anders her

Teil meiner Proc

Delphi-Quellcode:
      WM_PAINT, WM_PRINT:
      begin
        Img := GetButImageProperty(WinHandle);
        ButtonStyle := GetButStyle(WinHandle);
        if (ButtonStyle and BS_USERBUTTON) = BS_USERBUTTON then
          IsStaticLabel := True;

        if (Img <> 0) or IsStaticLabel then
        begin
          GetClientRect(WinHandle, rc);
          if Msg = WM_PAINT then
          begin
            hDC := BeginPaint(WinHandle, ps);

und das ende

Delphi-Quellcode:
        if Msg = WM_PAINT then
        begin
          if not Composited then
            DoubleBuffer(0, 0, 0, 0);

          EndPaint(WinHandle, ps);
        end;
        Result := 0;
        exit;
      end; // end WM_PAINT, WM_PRINT

      WM_DESTROY:
      begin
        // GDIPLUS button image löschen
        Img := GetButImageProperty(WinHandle);
        DeleteResource(Img);
      end;
    end;
    Result := CallWindowProc(ButOldProc[nil, 0], WinHandle, Msg, wParam, lParam);
  end; // End With
Wenn ich nun EndPaint(WinHandle, ps); deaktiviere funktioniert
alles so wie es soll MouseMove usw ..
Nur was dann passiert könnt ihr euch denken das geht 2 Minuten gut dann wars das.

Wie könnte ich das problem lösen hab im moment keine idee.

gruss Emil

EWeiss 23. Okt 2008 11:44

Re: Kein Event bei PtInRect
 
Mal ne dumme frage
kann es sein das meine Class das event WM_PAINT zerstört
oder die Winproc messagen nicht richtig verarbeitet werden ?

Delphi-Quellcode:
  TSkinEngine = class
  private
irgendeine möglichkeit muss es doch geben.

gruss EMil


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:30 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