Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Problem mit WMNCHitTest und TJvTransparentButton (https://www.delphipraxis.net/57849-problem-mit-wmnchittest-und-tjvtransparentbutton.html)

100nF 27. Nov 2005 16:26


Problem mit WMNCHitTest und TJvTransparentButton
 
hallo zusammen,

ich habe mal wieder ein problem...

Ich verwende bei einer form mit borderstyle = bsnone diese procedure, um die form verschieben zu können:
Delphi-Quellcode:
...
private
  procedure WMNCHitTest(var msg: TWMNCHitTest); message WM_NCHITTEST;
...
procedure TForm7.WMNCHitTest(var msg: TWMNCHitTest);
begin
  inherited;
  if msg.Result = htClient then
    msg.Result := htCaption;
end;
bisher hat alles wunderbar geklappt, doch jetzt will ich ein TJvTransparentButton (Ein button von der JVCL) auf der form haben.
nun, ich kann den button einfach nicht anklicken, weiss der teufel warum!
wenn ich mit dem cursor über den TJvTransparentButton gehe, dann sieht man wie bei einem normalen windows-button im XP-Style, dass dieser im Focus ist (bei Win Xp Buttons gibts ein oranger rahmen um den button herum).
wenn ich aber AUF den TJvTransparentButton klicke, passiert nichts, wie wenn enabled = false wäre. ist es aber nicht.

dann habe ich den fehler gesucht, und mal die procedure WMNCHitTest weggelassen, und dann hats auch funktioniert :gruebel:

ach ja, ich habe grad noch etwas wichtiges entdeckt: wenn ich auf den TJvTransparentButton klicke und auf der maustaste bleibe, kann ich die form verschieben, anstatt dass der button gedrückt wird.

weiss jemand was das problem ist?

100nF 30. Nov 2005 17:05

Re: Problem mit WMNCHitTest und TJvTransparentButton
 
keiner eine idee?

wenn ihr mein problem nicht versteht, meldet euch bitte!

ich fasse noch einmal zusammen:
wenn ich den obigen code in mein projekt einbaue, kann man die form (borderstyle = bsnone) mit der maus verschieben, indem man auf die form oder auf andere komponenten (label, ...) klickt und dann die maus bewegt.
das gseiche tritt aber auch beim TJvTransparentButton auf, ich kann also mit dem button kein onKlick-Ereignis ausführen, sondern ich kann die form verschieben mit dem TJvTransparentButton.

kann man bei einer komponente etwas abändern, dass dieses problem nicht auftritt?

ich hoffe diesmal auf antworten, ich brauch nämlich den TJvTransparentButton unbedingt auf der form...

gruss
urbanbruhin

Christian Seehase 1. Dez 2005 01:08

Re: Problem mit WMNCHitTest und TJvTransparentButton
 
Moin Urban,

die Lösung ist mit etwas Arbeit verbunden:
In der Methode WMNCHitTest musst Du prüfen, ob sich der Mauscursor über dem TJvTransparentButton befindet, oder nicht.
Ist das der Fall, verlässt Du die Methode ohne msg.Result zu verändern.

Schau Dir mal msg.XPos und msg.YPos an.
Diese beiden Werte sind nicht relativ zum Formular, sondern Bildschirmkoordinaten.
Du musst also einige Werte vorher abfragen, und bei der Berechnung der Position mit berücksichtigen, zumindest die aktuelle Höhe der Caption des Formulares und die Breite des Rahmens (Sizing Frame).
Schau Dir hierzu mal GetSystemMetrics an.

100nF 1. Dez 2005 17:08

Re: Problem mit WMNCHitTest und TJvTransparentButton
 
hallo Christian Seehase,

danke für deine antwort!

ich vermute aber, dass deine lösung nicht funktioniert...

wenn ich den code von oben nämlich in diesen:
Delphi-Quellcode:
procedure TForm7.WMNCHitTest(var msg: TWMNCHitTest);
begin
  {inherited;
  if msg.Result = htClient then
    msg.Result := htCaption; }
end;
...abändere, kann ich zwar die form nicht mehr verschieben, jedoch kann ich den TJvTransparentButton immernoch nicht anklicken :gruebel:

wenn ich den code ganz entferne und auch den eintrag bei "private" lösche, funktioniert es wunderbar.

ich denke man müsste etwas machen, dass die message WM_NCHITTEST beim buttonklick gar nicht gesendet wird, aber ich habe leider keine ahnung ob und wie sowas machbar wäre...

urbanbruhin

Christian Seehase 1. Dez 2005 22:49

Re: Problem mit WMNCHitTest und TJvTransparentButton
 
Moin Urban,

ich hab's ausprobiert, und es hat funktioniert.
Lass doch mal das inherited stehen.

jim_raynor 2. Dez 2005 06:13

Re: Problem mit WMNCHitTest und TJvTransparentButton
 
Versuche es mal so :)

Delphi-Quellcode:
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  ReleaseCapture;
  SendMessage(Form1.Handle, WM_SYSCOMMAND, $F012, 0);
end;
(Quelle: SwissDelphiCenter)


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