![]() |
Re: Fenster verschieben?
Zitat:
|
Re: Fenster verschieben?
Hi,
Ich addiere nichtmal dazu. Ich setze Left,Top der Form = Mouse.CursorPos und addiere den offset der Maus innerhalb des Formulars drauf. |
Re: Fenster verschieben?
Zitat:
|
Re: Fenster verschieben?
Zitat:
|
Re: Fenster verschieben?
Du hast Panel1.Perform geschrieben, ich hab das durch Form1 ausgetauscht.
|
Re: Fenster verschieben?
Ahaaaa, dann erscheint das schon in einem anderen Licht. Aber wie gesagt, lass das Form1 weg oder ersetze es durch self, dann ist das auch richtig.
|
Re: Fenster verschieben?
Liste der Anhänge anzeigen (Anzahl: 1)
Blank Window Example (nonvcl) :D
Delphi-Quellcode:
program DemoFormMovement;
{$A+,B-,C-,D-,E-,F-,G+,H+,I-,J-,K-,L-,M-,N+,O+,P+,Q-,R-,S-,T-,U-,V+,W-,X+,Y-,Z1} {$APPTYPE GUI} type TWndClassEx = packed record cbSize: Cardinal; style: Cardinal; lpfnWndProc: Pointer; cbClsExtra: Integer; cbWndExtra: Integer; hInstance: Cardinal; hIcon: Cardinal; hCursor: Cardinal; hbrBackground: Cardinal; lpszMenuName: PAnsiChar; lpszClassName: PAnsiChar; hIconSm: Cardinal; end; TPoint = packed record X: Longint; Y: Longint; end; TMsg = packed record hwnd: Cardinal; message: Cardinal; wParam: Integer; lParam: Integer; time: Cardinal; pt: TPoint; end; const kernel32 = 'kernel32.dll'; user32 = 'user32.dll'; _Classname: PChar = 'WndDmoCls'; _Width: Word = 320; _Height: Word = 240; {Windows Rip} HWND_TOP = 0; COLOR_WINDOW = 5; WS_EX_TOOLWINDOW = $80; GWL_STYLE = -16; WS_VISIBLE = $10000000; WS_CAPTION = $C00000; VK_ESCAPE = 27; SWP_SHOWWINDOW = $40; IDC_ARROW = Pointer(32512); {Messages Rip} WM_DESTROY = $0002; WM_KEYUP = $0101; WM_LBUTTONDOWN = $0201; WM_MOUSEMOVE = $0200; WM_LBUTTONUP = $0202; var hWnd: Cardinal; mMsg: TMsg; wWnd: TWndClassEx; InitialFormMousePosition, ScreenMouse: TPoint; MouseIsDown: Boolean; {Windows Rip} function RegisterClassEx(const WndClass: TWndClassEx): Word; stdcall; external user32 name 'RegisterClassExA'; function LoadCursor(Cardinalance: Cardinal; lpCursorName: PChar): Cardinal; stdcall; external user32 name 'LoadCursorA'; function CreateWindowEx(dwExStyle: Cardinal; lpClassName: PChar; lpWindowName: PChar; dwStyle: Cardinal; X, Y, nWidth, nHeight: Integer; hWndParent: Cardinal; hMenu: Cardinal; Cardinalance: Cardinal; lpParam: Pointer): Cardinal; stdcall; external user32 name 'CreateWindowExA'; function SetWindowLong(hWnd: Cardinal; nIndex: Integer; dwNewLong: Longint): Longint; stdcall; external user32 name 'SetWindowLongA'; function GetMessage(var lpMsg: TMsg; hWnd: Cardinal; wMsgFilterMin, wMsgFilterMax: Cardinal): Boolean; stdcall; external user32 name 'GetMessageA'; function TranslateMessage(const lpMsg: TMsg): Boolean; stdcall; external user32 name 'TranslateMessage'; function DispatchMessage(const lpMsg: TMsg): Longint; stdcall; external user32 name 'DispatchMessageA'; function UnregisterClass(lpClassName: PChar; Cardinalance: Cardinal): Boolean; stdcall; external user32 name 'UnregisterClassA'; function GetLastError: Cardinal; stdcall; external kernel32 name 'GetLastError'; procedure PostQuitMessage(nExitCode: Integer); stdcall; external user32 name 'PostQuitMessage'; function GetCursorPos(var lpPoint: TPoint): Boolean; stdcall; external user32 name 'GetCursorPos'; function SetWindowPos(hWnd: Cardinal; hWndInsertAfter: Cardinal; X, Y, cx, cy: Integer; uFlags: Cardinal): Boolean; stdcall; external user32 name 'SetWindowPos'; function DefWindowProc(hWnd, Msg: Cardinal; wParam, lParam: Integer ): Integer; stdcall; external user32 name 'DefWindowProcA'; function WndProc( hWnd, uMsg: Cardinal; wParam, lParam: Integer ): Integer; stdcall; begin Result := 0; case uMsg of WM_DESTROY: PostQuitMessage(0); WM_KEYUP: case Word( wParam ) of VK_ESCAPE: WndProc( hWnd, WM_DESTROY, 0, 0 ); end; WM_LBUTTONDOWN: begin with InitialFormMousePosition do begin X := Word( lParam ); Y := Word( lParam shr 16 ); end; MouseIsDown := True; end; WM_MOUSEMOVE: if MouseIsDown then begin GetCursorPos( ScreenMouse ); SetWindowPos( hWnd, HWND_TOP, ScreenMouse.X - InitialFormMousePosition.X, ScreenMouse.Y - InitialFormMousePosition.Y, _Width, _Height, SWP_SHOWWINDOW ); end; WM_LBUTTONUP: MouseIsDown := False; else Result := DefWindowProc( hWnd, uMsg, wParam, lParam ); end; end; begin with wWnd do begin cbSize := SizeOf( wWnd ); lpfnWndProc := @WndProc; hCursor := LoadCursor( 0, IDC_ARROW ); hbrBackground := COLOR_WINDOW; lpszClassName := _Classname; end; RegisterClassEx( wWnd ); hWnd := CreateWindowEx( WS_EX_TOOLWINDOW, _Classname, NIL, WS_VISIBLE, 100, 100, _Width, _Height, 0, 0, 0, NIL ); SetWindowLong( hWnd, GWL_STYLE, WS_VISIBLE and (not WS_CAPTION) ); while GetMessage( mMsg, 0, 0, 0 ) do begin TranslateMessage( mMsg ); DispatchMessage( mMsg ); end; UnregisterClass( _Classname, 0 ); ExitCode := GetLastError; end. |
Re: Fenster verschieben?
Das ist sicher genau das, was ein Lehrer von einem Delphi-Neuling verlangt. :wall:
Gerade über OnMouseDown (wurde alles genannt) geht es doch sehr einfach und das ist vermutlich das, was der Lehrer sehen möchte. Ich denke es geht um das Verstehen und Anwenden der VCL-Ereignisse. |
Re: Fenster verschieben?
I know :D
Aber einem Neuling wird ein Lehre sicher das nicht abkaufen! Also von daher :P MfG |
Re: Fenster verschieben?
Um wieder zur eigentlichen Aufgabenstellung zurückzukehren: die generelle Vorgehensweise wurde mindestens 2 mal bereits genannt. Hier etwas ausführlicher: im Ereignis OnMouseDown, das ausgelöst wird, sobald auf dem Formular eine Maustaste gedrückt wird, merkst Du Dir den aktuellen Punkt des Mauszeigers (die X- und Y-Koordinate werden freundlicherweise bereits als Parameter übergeben) in einer globalen Variablen (@all: keine Meckereien jetzt!!). Dabei solltest Du aber auswerten, welche Maustaste gedrückt wurde, was wiederum im Button-Parameter steht, dieser sollte für die linke Maustaste mbLeft sein. In Pseudo-Code sieht das dann so aus:
Delphi-Quellcode:
Im MouseMove-Ereignis wiederum kannst Du nun die Differenz zwischen den einzelnen Koordinaten errechnen und die Eigenschaften Top bzw. Left des Formulars so setzen, dass der Mauszeiger wieder an der gemerkten relativen Position innerhalb des Formulars steht (auch in diesem Ereignis werden wieder X und Y übergeben). Ob die linke Maustaste dabei gedrückt ist, kannst Du feststellen, indem Du prüfst, ob ssLeft in der Menge Shift enthalten ist.
var MausPos: TPoint;
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X,Y: integer); begin wenn Button mbLeft ist MausPos ist der Punkt(X,Y) end;
Delphi-Quellcode:
Ich hoffe, das war ein halbwegs verständlicher Ansatz. Versuch es einfach einmal auf diesem Wege, falls Du nicht klarkommst, helfen wir gerne weiter.
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,Y: integer);
begin wenn ssLeft in Shift enthalten Left ist gleich Left + Differenz aus X und MausPos.X Top ist gleich Top + Differenz aus Y und MausPos.Y end; Sollte ich hier Fehler gemacht haben (da aus dem Kopf getippt), bitte ich einen Wissenden um Korrektur. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:42 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz