Autor Beitrag
Roy
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 184

Windows7 Ultimate
Delphi 2007, NET, Embarcadero
BeitragVerfasst: Sa 22.12.07 21:09 
Nabend Delphi's

Ich habe meiner Form den Style None gegeben und mit der Procedur
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
const
  SC_DRAGMOVE = $F012;
begin
  if Button = mbleft then
  begin
    ReleaseCapture;
    Form1.Perform(WM_SYSCOMMAND, SC_DRAGMOVE, 0);
  end;
end;


kann ich die Form ruckelfrei bewegen!
Meine Frage: Warum verliert ein Image durch dieses MouseDown-Ereignes seine Procedur (close) und seinen zugewiesennen Cursor (HandPoint)?
Wie kann ich das ändern?

Vielen Dank
Dunkel
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 682

Mac OS X Snow Leopard
Xcode 3.1
BeitragVerfasst: Sa 22.12.07 21:20 
Hallo!

Der Easy Delphi Helper sagt dazu
Zitat:

Easymove, wie bei WinAMP


Kennst Du nicht auch den Special-Effekt bei WinAMP, das Fenster überall verschoben werden kann und nicht nur an der Titelleiste? Mit dieser Windows-Message kannst Du das auch.

Diese Procedure musst Du im Private-Abschnitt deklarieren:

ausblenden Delphi-Quelltext
1:
2:
  procedure WMNCHitTest(var M: TWMNCHitTest); 
    message wm_NCHitTest;


Und hier die eigentliche Implementation der Procedure:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
procedure TForm1.WMNCHitTest (var M: TWMNCHitTest);
begin
  inherited;
  if M.Result = htClient then 
    M.Result := htCaption;
end;

htClient gibt an, dass Du dich im normalen Bereich Deiner Anwendung befindest, also nicht die Titelleiste bewegst.
Mit htCaption wird die Titelleiste angesprochen und diese soll emuliert werden.


Wenn man diesen Code benutzt kann es vorkommen, dass z.B. bei Timages keine OnClick-Ereignisse ausgeführt werden. Abhilfe schafft diese Bereiche auszuschließen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
procedure TForm1.WMNCHitTest (var M: TWMNCHitTest);
begin
  inherited;
  // Image 1
  if PtInRect(Rect(20,10, 50, 50), M.Pos) then
    Exit;
  // Image 2
  if PtInRect(Rect(150,10, 50, 50), M.Pos) then
    Exit;
  if M.Result = htClient then
    M.Result := htCaption;
end;


_________________
Ich streite einsam mich mit dieser Oberflächenwelt
Gutes sei ein löblich Brot von dem ich zehre - bis zum Tod [Das Ich - Im Ich]
Roy Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 184

Windows7 Ultimate
Delphi 2007, NET, Embarcadero
BeitragVerfasst: Sa 22.12.07 22:14 
Hallo Dunkel,
habe es jetzt mit den Ausschließen der Bereiche vom Bild versucht und erhalte die Fehlermeldung:

E2010 Inkompatible Typen: 'TPoint' und 'TSmallPoint'
Roy Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 184

Windows7 Ultimate
Delphi 2007, NET, Embarcadero
BeitragVerfasst: So 23.12.07 19:46 
Hallo Delphi-Freunde,

bin jetzt dahinter gekommen wenn ich hinter meinen Bildern auf dem Formular die selbe Procedur
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
const  
  SC_DRAGMOVE = $F012;  
begin  
  if Button = mbleft then  
  begin  
    ReleaseCapture;  
    Form1.Perform(WM_SYSCOMMAND, SC_DRAGMOVE, 0);  
  end;

setze, funktionieren meine Imagedateien auch wieder als Button!

Danke trotzdem