Gå til innhold

stoppe form når ut av skjerm


Anbefalte innlegg

Videoannonse
Annonse

Siden det ikke finnes noe Form_Move-event, må man bruke subclassing for å mota en melding om at formen flyttes på.

 

Lim dette inn i formen din:

Option Explicit

Private Sub Form_Load()

SubclassForm Me

End Sub

Private Sub Form_Unload(Cancel As Integer)

EndSubclassForm Me

End Sub

Public Sub Form_Move()

If Me.Left < 0 Then Me.Left = 0
If Me.Left + Me.Width > Screen.Width Then Me.Left = Screen.Width - Me.Width

If Me.Top < 0 Then Me.Top = 0
If Me.Top + Me.Height > Screen.Height Then Me.Top = Screen.Height - Me.Height

End Sub

Og dette i en modul:

Option Explicit

Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Declare Function SetClipboardViewer Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Integer, ByVal lParam As Any) As Long

Private Const WM_MOVE = &H3
Private Const WM_MOVING = &H216
Private Const GWL_WNDPROC = (-4)

Private PrevProc As Long
Private MyForm As Form

Public Sub SubclassForm(F As Form)

Set MyForm = F
PrevProc = SetWindowLong(F.hwnd, GWL_WNDPROC, AddressOf WindowProc)

End Sub

Public Sub EndSubclassForm(F As Form)

SetWindowLong F.hwnd, GWL_WNDPROC, PrevProc

End Sub

Public Function WindowProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

If uMsg = WM_MOVING Or WM_MOVE Then
   Call MyForm.Form_Move
End If

WindowProc = CallWindowProc(PrevProc, hwnd, uMsg, wParam, lParam)

End Function

Lenke til kommentar

Det var mye flimring med bare WM_MOVING, men straks jeg la til WM_MOVE ble det bedre, men jeg regner med at det er litt forskjellig fra maskin til maskin.

 

Jeg tror ikke det finnes noe flere events man kan legge til. Mulig jeg er helt på jordet, men disse kommer rett fra windows, og det finnes ikke noe bak der som leverer alt raskere.

 

Edit: Jo, det finnes nok andre måter, som bla. Winamp bruker, men jeg vet ikke om den/de.

Endret av Jonas
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...