AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Non-Vcl -> Bmp SS_NOTIFY dilemma
Thema durchsuchen
Ansicht
Themen-Optionen

Non-Vcl -> Bmp SS_NOTIFY dilemma

Ein Thema von KodeZwerg · begonnen am 19. Aug 2020 · letzter Beitrag vom 21. Aug 2020
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.685 Beiträge
 
Delphi 11 Alexandria
 
#1

Non-Vcl -> Bmp SS_NOTIFY dilemma

  Alt 19. Aug 2020, 07:47
Guten morgen,
ich habe ein Problem wo ich noch nicht so richtig mit umzugehen weiß.

Ich erstelle ein Bild als Static-Control, weise dem ein OnClick (SS_NOTIFY) zu, aber dann funktioniert mein MouseOver-Event nicht mehr.
Schalte ich OnClick aus, funktioniert MouseOver wieder.
Ich hätte gerne beides auf einmal, was mache ich falsch?

Hier relevante Code teile:
Delphi-Quellcode:
// variablen:
const
  IDC_BMP = 1000;
var
  hWndBmp: HWND;




//hier im Message handler WndProc...

  WM_CREATE:
    begin
      hWndBmp := CreateWindowEx(
                      0,
                      'STATIC', 'VOID',
                      WS_VISIBLE or WS_CHILD
                      SS_NOTIFY or SS_BITMAP,
                      10, 5, 32, 32,
                      hWnd, IDC_BMP, hInstance, nil);
    end;

  WM_COMMAND:
    begin
      if HiWord(wParam) = STN_CLICKED then
        case LoWord(wParam) of
            IDC_BMP:
              begin
                // mach was
              end;
        end;
    end;

  WM_MOUSEMOVE:
    begin
      // get current coordinates
      pt.x := Word(lParam);
      pt.y := Word(lParam shr 16);

      // switch cursor back to normal if outside of image
      if ((ChildWindowFromPoint(hWnd, pt) <> hWndBmp)
          and (GetCursor <> Cardinal(IDC_ARROW))) then
        SetCursor(LoadCursor(0, IDC_ARROW));

      // switch cursor if over image
      if ((ChildWindowFromPoint(hWnd, pt) = hWndBmp)
          and (GetCursor <> Cardinal(IDC_HAND))) then
        SetCursor(LoadCursor(0, IDC_HAND));
    end;


  WM_LBUTTONDOWN:
    begin
      (*
        dirty workaround wenn SS_NOTIFY nicht gesetzt wurde.

        hier code von mouseover reinkopieren
        hier code von onclick reinkopieren
      *)
 
    end;
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.121 Beiträge
 
Delphi 12 Athens
 
#2

AW: Non-Vcl -> Bmp SS_NOTIFY dilemma

  Alt 19. Aug 2020, 08:31
https://social.msdn.microsoft.com/Fo...forum=vcmfcatl
oder Eines der anderen 4700 Suchergebnisse: Bei Google suchenSS_NOTIFY mouse move

Also SubClassing und damit auch ein eigenes Message-Event für dein STATIC,
oder vielleicht reicht es auch, wenn du dich über SetWindowLongPtr+GWL_WNDPROC ins STATIC rein hängst.

Wenn du in deiner Messagebehandlung auf das HWND achtest, also von wem die Message kommt, dann kannst für Beides auch die selbe Prozedur verwenden
und musst die Positionen eventuell nur noch auf den Parent umrechnen.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (19. Aug 2020 um 09:55 Uhr) Grund: SetWindowLongPtr
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.685 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Non-Vcl -> Bmp SS_NOTIFY dilemma

  Alt 19. Aug 2020, 08:47
Danke für Tipp, werde ich abends ausprobieren!
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
venice2
(Gast)

n/a Beiträge
 
#4

AW: Non-Vcl -> Bmp SS_NOTIFY dilemma

  Alt 19. Aug 2020, 09:34
Zitat:
Bmp SS_NOTIFY dilemma
Es gibt kein dilemma das man nicht lösen könnte selbst ist der Mann\Frau versuche es einfach.
Das Flag SS_NOTIFY benötigt man dafür nicht das überlässt man TTrackMouseEvent!
https://social.msdn.microsoft.com/Fo...forum=vcmfcatl
oder Eines der anderen 4700 Suchergebnisse: Bei Google suchenSS_NOTIFY mouse move

oder vielleicht reicht es auch, wenn du dich über SetWindowLong+GWL_WNDPROC ins STATIC rein hängst.
Schlechte Idee wenn schon SetWindowLongPtr, GetWindowLongPtr
SetWindowLong ist veraltetet und wenn man nachher auf 64 Bit portieren will ist es um so ärgerlicher denn dann muss man alles umschreiben.
Deshalb direkt richtig machen.

siehe.
https://www.delphipraxis.net/83180-m...-ohne-vcl.html

Geändert von venice2 (19. Aug 2020 um 10:27 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.121 Beiträge
 
Delphi 12 Athens
 
#5

AW: Non-Vcl -> Bmp SS_NOTIFY dilemma

  Alt 19. Aug 2020, 09:55
upps, ja.

Das Schlimme, ist dass ich die Namen aus der Hilfe kopiert hatte, aber nicht aus dem fetten Hinweistext ganz oben.
https://docs.microsoft.com/en-us/win...setwindowlonga
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (19. Aug 2020 um 09:58 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.685 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Non-Vcl -> Bmp SS_NOTIFY dilemma

  Alt 19. Aug 2020, 10:28
Zitat:
Bmp SS_NOTIFY dilemma
Es gibt kein dilemma das man nicht lösen könnte selbst ist der Mann\Frau versuche es einfach.
Wie ich es selbst gemacht habe kann man ja oben einsehen. Ich habe bestimmt in meiner WinApi Referenz was überlesen.

Hinauslaufen wird es auf SubClassing, danke für den deprecated Hinweis!
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
venice2
(Gast)

n/a Beiträge
 
#7

AW: Non-Vcl -> Bmp SS_NOTIFY dilemma

  Alt 19. Aug 2020, 10:47
Beachte aber wenn du das Flag SS_NOTIFY gesetzt hast die Messagen in WM_COMMAND ausgewertet werden über STN_CLICKED, STN_DBLCLK.
WM_LBUTTONDOWN wird durch das setzen dieses Flag gar nicht angesprochen.

Desto trotz kannst du über Postmessage WM_LBUTTONDOWN trotzdem verwenden. Als workaround

Viele Spaß beim ausprobieren.

Geändert von venice2 (19. Aug 2020 um 10:51 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.685 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Non-Vcl -> Bmp SS_NOTIFY dilemma

  Alt 20. Aug 2020, 07:56
Zitat:
Bmp SS_NOTIFY dilemma
Es gibt kein dilemma das man nicht lösen könnte selbst ist der Mann\Frau versuche es einfach.
Nachwort:

SubClassing hatte auf anhieb funktioniert aber das "versuche es einfach" hatte mir noch keine Ruhe gelassen.
Nachdem ich meine Nase nochmal tiefer in die WinApi Referenz gesteckt habe bin ich auf eine bessere Lösung gekommen.
SetClassLongPtr(Cardinal(hWndArr[1]), Integer(GCL_HCURSOR), Integer(LoadCursor(hWndArr[0], IDC_HAND)));
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
venice2
(Gast)

n/a Beiträge
 
#9

AW: Non-Vcl -> Bmp SS_NOTIFY dilemma

  Alt 20. Aug 2020, 16:24
Zitat:
Bmp SS_NOTIFY dilemma
Nachdem ich meine Nase nochmal tiefer in die WinApi Referenz gesteckt habe bin ich auf eine bessere Lösung gekommen.
SetClassLongPtr(Cardinal(hWndArr[1]), Integer(GCL_HCURSOR), Integer(LoadCursor(hWndArr[0], IDC_HAND)));
sorry muss da leider noch mal leicht eingreifen.
32 und 64 Bit der zustand ist das SetClassLongPtr je nach verwendeten kompilat zwei werte annehmen kann 4Bit\32Bit 8Bit\64Bit
deshalb ja der umstand das man nicht mehr SetClassLong oder vergleichbares verwenden soll.

SetClassLongPtr(Cardinal(hWndArr[1]), Integer(GCL_HCURSOR), Integer(LoadCursor(hWndArr[0], IDC_HAND)));
zu
SetClassLongPtr(Cardinal(hWndArr[1]), Integer(GCL_HCURSOR), LONG_PTR(LoadCursor(hWndArr[0], IDC_HAND)));
oder
SetClassLongPtr(Cardinal(hWndArr[1]), WParam(GCL_HCURSOR), LParam(LoadCursor(hWndArr[0], IDC_HAND)));

Dann bist du auf den richtigen weg.
Nicht nur die richtige Funktion sondern auch den entsprechenden Daten Typ dazu verwenden sonst macht es keinen sinn.
WParam, LParam sollte die richtige Bit Größe zuweisen je nach dem welche art von Class man verwendet WNDCLASSEX \ WNDCLASS

Siehe dazu nochmal!

Code:
ULONG_PTR SetClassLongPtrA(
  HWND    hWnd,
  int     nIndex,
  LONG_PTR dwNewLong
);
LONG_PTR

Nebenbei kannst du in deiner Class einen Speicher reservieren der für deine Propertys zuständig ist.
Siehe dazu "cbWndExtra"

Geändert von venice2 (20. Aug 2020 um 18:08 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.685 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: Non-Vcl -> Bmp SS_NOTIFY dilemma

  Alt 21. Aug 2020, 07:27
Danke für diesen Hinweis, werde ich auch im nächsten Kompilat berücksichtigen wobei ich momentan noch absolut gar keine Ahnung habe wie ich ein nonVcl project als 64bit kompilieren kann.
Auch Danke für den Speicher-Tipp
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:52 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